人工智能学习3(特征变换:特征数值化)

编译工具:PyCharm

有些编译工具不用写print可以直接将数据打印出来,pycharm需要写print才会打印出来。

文章目录

      • 编译工具:PyCharm
  • 概念
    • 1.特征类型
      • 分类型
      • 二值型
      • 顺序型
      • 数值型
    • 2.特征数值化练习1
    • 3.特征数值化练习2
    • 4.特征二值化
      • 使用sklearn库自带的Binarizer实现二值化需要注意的点
      • 练习:创建100个正态分布的随机数,并且实现二值化
      • 练习:对图片数据进行二值化
    • OneHot编码
      • 练习
      • sklearn中的OneHotEncoder也提供了实现OneHot编码的方法

概念

1.特征类型

特征的类型:“离散型”“连续型”
机器学习算法对特征的类型是有要求的,不是任意类型的特征都可以随意放入任何算法中。
通过特征变换后,数据的可解释性得到提高。
连续型特征就是具体的数值,如温度、长度
离散型分为分类型、二值型、顺序型特征

分类型

用于表示类别,每个值表示一种单独的类别,并且不同值之间没有顺序和大小之分,如"在职"、“离职”,可以用"0","1"来表示。
数据挖掘领域中,分类型特征被称为“标称属性”。

二值型

特征值只有两种状态,如0,1;显然是分类型的,二值型特征也称为“二元型特征”或“布尔型特征”

顺序型

可以是数字也可以是对连续型特征离散化而得到如将学生的成绩划分等级A(90-100)、B(75-90)、C(60-75)

数值型

整数/浮点数

2.特征数值化练习1

将一些算法不理解的特征值转化为数值型,实现数值化
在这里插入图片描述

# 将一些算法不理解的特征值转化为数值型,实现数值化
import pandas as pd
print("-------特征数值化-------")
df = pd.DataFrame({"total_bill":[34.3,27.05,48.17,41.16,29.85,20.69,30.46,28.15,24.59,25.29],"tip":[6.7,5,5,5,5.14,5,2,3,3.61,4.71],"gender":["Male","Female","Male","Male","Female","Male","Male","Male","Female","Male"],"smoker":["No","No","No","No","No","No","Yes","Yes","No","No"]
})
print("-------原始数据-------")
print(df)
print("-------通过replace进行特征数值化---------")
print(df.replace({"Male": 1, "Female": 0, "Yes": 1, "No": 0}))
# 没有sklearn库的先安装,scikit-learn
print("-------通过sklearn库内置方法进行特征数值化---------")
from sklearn.preprocessing import LabelEncoder
day = ["Thur","Thur","Fri","Thur","Sun","Thur","Sun","Sat","Sun","Sun","Thur","Thur","Fri","Sun"]
print("原始数据1: ")
print(day)
le = LabelEncoder()
print("调用sklearn中的LabelEncoder中的方法实现特征化: ")
print(le.fit_transform(day))
print("用LabelEncoder来获取到原始的字符串,即实现'反向取值'的方法: ")
day_new = le.inverse_transform([0,1,2,3]) # 这里的le已经被训练好了,所以可以取到特征化之前的数值
print(day_new)
print("原始数据2: ")
nums = [2001,10001,3000,10001]
print(nums)
print("调用fit_transform后: ")
print(le.fit_transform(nums))
print("实现'反向取值':")
print(le.inverse_transform([1]))  # 写的时候不能直接写1,要写[1]

运行结果:
在这里插入图片描述
使用sklearn库中的内置方法
在这里插入图片描述

3.特征数值化练习2

某办公室电子设备数据如下
data=[‘笔记本’,‘台式本’,‘手机’,‘台式机’,‘平板电脑’]
需要用这些数据创建特征数值化模型,然后用该模型对下面的数据集进行特征变换。
data_test=[‘平板电脑’,‘手机’,‘台式机’,‘台式机’]

print()
print("------------------练习2----------------")
from sklearn.preprocessing import LabelEncoder
data=['笔记本','台式本','手机','台式机','平板电脑']
data_test=['平板电脑','手机','台式机','台式机']
# 对data特征化,创建特征数值化模型
le = LabelEncoder()
le.fit(data)
# 查看类别信息
print(le.classes_)
# 用训练好的模型对新的数据进行特征化
print(le.transform(data_test))

运行结果:
在这里插入图片描述

4.特征二值化

sklearn库提供Binarizer可以实现二值化
from sklearn.preprocessing import Binarizer

print("-----------特征二值化------------")
import numpy as np
tips = [19.65,10.33,21.50,14.52,11.02,15.77,40.55,30.06,14.07,18.35]
print(tips)
# np.mean(tips)求tips数组的平均值
# np.where中三个参数,判断第一个参数为true则取第二个参数,为false取第三个参数
tips = np.where(tips>np.mean(tips),1,0)
print("二值化后: ")
print(tips)
# sklearn库中二值化模块实现二值化
from sklearn.preprocessing import Binarizer
data2 = {'tips':[19.65,10.33,21.50,14.52,11.02,15.77,40.55,30.06,14.07,18.35],'sex':['Male','Male','Male','Female','Male','Male','Male','Male','Male','Male']
}
df2 = pd.DataFrame(data2,columns=['tips','sex'])
print("使用sklearn库: ")
# average = np.mean(data2['tips'])
average = df2['tips'].mean()
# 设置阈值
bn = Binarizer(threshold=average)
# 需要注意的是,不可直接这样子写
# result = bn.fit_transform(df2['tips'])
# df2[['tips']]返回的是一个DataFrame对象,是二位数据
# df2['tips']是一维数据
data_temp = df2[['tips']]
result = bn.fit_transform(data_temp)
print(result)
# 使用binarize方法
print("使用binarize方法")
from sklearn.preprocessing import binarize
fbin = binarize(df2[['tips']],threshold=df2['tips'].mean())
print(fbin)

在这里插入图片描述

使用sklearn库自带的Binarizer实现二值化需要注意的点

sklearn需要传入一个二维数据,但是df2[‘tips’]得到的其实是一个一维的数据,可以通过以下方法将一个一维的数据转化为二维的数据使用(一行变为一列 1xm 变为 mx1)。

# 一维数据转变为二维的数据
# df2[['tips']]返回的是一个DataFrame对象,是二位数据
# df2['tips']是一维数据
tra1 = df2['tips']
tra2 = df2[['tips']]
tra3 = df2['tips'].values.reshape((-1,1)).shape
print(tra1)
print(type(tra1))
print(tra2)
print(type(tra2))
print(tra3)
print(type(tra3))

在这里插入图片描述

练习:创建100个正态分布的随机数,并且实现二值化

print("-------练习2:创建100个正态分布的随机数,并且实现二值化------")
import numpy as np
from sklearn.preprocessing import Binarizer
# normal 是正态的意思,loc=0表示以y轴为对称轴的状态分布,scale越大,正态分布曲线矮胖,越小高瘦
nor = np.random.normal(loc=0,scale=1.0,size=100)
# 可以看到nor是一个一维的数据
print(nor)
data_temp = nor.reshape(-1,1)
# 打印转化后的数据的前十行以及所有的列
print(data_temp[:10,:])
# 如果没有设置阈值threshold,则默认为0
nor_bin=Binarizer().fit_transform(data_temp)
print(nor_bin[:10, :])

在这里插入图片描述
在这里插入图片描述

练习:对图片数据进行二值化

对彩色图片需要对红绿蓝这三个通道进行调整,因为openCV在读取图片的时候,认为图片存储通道顺序是bgr,但是正常显示图片的顺序是rgb。
如果不修改就显示图片的话,图片的颜色是错乱的。
图片二值化目标:区分出前景和背景。
需要先把图片灰度化,然后再对每个像素点进行二值化
每一个像素点实际上存储的是一个数字,从0~255,0表示纯黑,255表示纯白

print("----------练习3:对图像数据二值化------------")
import matplotlib.pyplot as plt
import cv2
def show_img(img):if len(img.shape)==3:       # 用于判断图像是否为灰度图或彩色图(判断图像通道数)b,g,r = cv2.split(img)  # 拆分通道img=cv2.merge([r,g,b])plt.imshow(img)else:plt.imshow(img,cmap="gray")plt.axis("off") # 关闭坐标轴plt.show()
image = cv2.imread("./img/spider-man.png")
show_img(image)
# 对图片灰度化
gray_image= cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
show_img(gray_image)
# 对灰度化的像素点进行二值化
# 127是手动设置的阈值(0-255中间值为127,可以设置其他值),255是大于阈值时显示的值
ret,thr = cv2.threshold(gray_image,127,255,cv2.THRESH_BINARY)
show_img(thr)

将图片正常显示
在这里插入图片描述

灰度化后图片显示
在这里插入图片描述

二值化后图片显示
在这里插入图片描述

OneHot编码

one-hot编码也叫独热编码。
基本思想:将离散化特征的每一种取值都看成一种状态,如果一个特征中由N中取值,就可以将该特征抽象成N种不同的状态,one-hot编码保证每一个取值只会使得一种状态处于“激活态”,就是说这N种状态只有一个状态位值为1,其他状态位为0.
例如:三种类型:猫、狗、乌龟
猫编码:[1,0,0]
狗编码:[0,1,0]
乌龟:[0,0,1]
pandas中的get_dummies方法可以将分类型特征转化为“虚拟变量”(哑变量),就是将数据转换为one-hot编码

print("----------------OneHot独热编码---------------------")
import pandas as pd
color = pd.DataFrame({"color":["red","green","green","red","green"]})
print(color)
# 特征提取
print(pd.get_dummies(color))

01表示了red,10标识green
在这里插入图片描述
可以添加前导字符,通过设定prefix='xxx’即可

练习

print("-------练习1:生成独热编码-------")
data = {"grade":['A','B','B','A','A'],"size":['L','XXL','XXL','L','L']
}
df = pd.DataFrame(data)
print(df)
print(pd.get_dummies(df))

可以理解为,输入grade_A则为True,不属于则为False。10标识了A,01标识了B;10标识了L,01表示了XXL
在这里插入图片描述
可以看到都是通过10,01或者是100,010,001来标识的,没有000,所以我们可以通过去掉一列然后引入000来标识一个类型,例如:

print("--------去除第一列,通过000来标识为A--------")
shirt=pd.DataFrame({"grade":["A","A","D","C","B","B"]})
print("未去列之前:")
print(pd.get_dummies(shirt))
print("去列后:")
print(pd.get_dummies(shirt,drop_first=True))

在这里插入图片描述

sklearn中的OneHotEncoder也提供了实现OneHot编码的方法

print("-----------通过sklearn中提供的方法实现one-hot编码------------")
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
features = ohe.fit_transform(shirt)
print(features.toarray())
# OneHotEncoder中没有提供类似于drop_first的方法
# 可以通过numpy切片解决舍弃第一列
print(features.toarray()[:,1:])

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day69

今日回顾 Django与Ajax 一、什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在…

YOLOv8优化策略:简单高效的模块-现代反向残差移动模块 (iRMB) | | ICCV2023 EMO

🚀🚀🚀本文改进:设计了一种面向移动端应用的简单而高效的现代反向残差移动模块 (Inverted Residual Mobile Block, iRMB),它吸收了类似 CNN 的效率来模拟短距离依赖和类似 Transformer 的动态建模能力来学习长距离交互,引入YOLOV8 🚀🚀🚀YOLOv8改进专栏:http:…

三个角度(握手、挥手、传输)优化TCP

TCP 三次握手的性能提升 客户端的优化 当客户端发起 SYN 包时,可以通过 tcp_syn_retries 控制其重传的次数。 服务端的优化 当服务端 SYN 半连接队列溢出后,会导致后续连接被丢弃,可以通过 netstat -s 观察半连接队列溢出的情况,如…

对标Gen-2!Meta发布新模型进军文生视频赛道

随着扩散模型的飞速发展,诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢,因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt(重要)4、…

Python语言基础学习大纲(由某大模型生成)

自从上次经丙察察游了一次滇藏线,已有3个没写一篇了。今天利用由某大模型生成的上面这张思维导图,配合这个大模型生成的6000多字拼凑出一篇博文聊以交差。 Python语言概述 一、语言特点 1.语法简单明了 Python的语法简洁易懂,使得编写代码…

12.5作业

1. #include <iostream>using namespace std;class Animal { private:string name; public:Animal(){}Animal(string name):name(name){cout << "animal" << endl;}virtual void perfrom(){cout << "实现不同表演行为" << …

Windows下安装Git和Git小乌龟

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地进行从很小到非常大的项目的版本管理。Git支持将本地仓库与远程仓库进行关联&#xff0c;实现多人协作开发。由于具有分布式版本控制、高效性、灵…

C++12.5

想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&#xff0c;他会为每种动物表演做简单的介绍。 在这个场景中&#xff0c;我们可以将动物比作是不同的类&#xff0c;而每种动物表演则…

【数据结构】链表OJ题(顺序表)(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

握这些员工管理技巧,助你打造高效团队!

人力资源是一个组织中至关重要的一环&#xff0c;而员工管理是确保团队高效运转的关键因素之一。一个优秀的经理需要具备多方面的技巧和能力&#xff0c;以便激发员工的潜力&#xff0c;促进合作和增加团队的效率。在这里&#xff0c;我将分享一些实用的员工管理技巧&#xff0…

Hadoop学习笔记(HDP)-Part.12 安装HDFS

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

RAR文件的密码保护如何设置和取消?

RAR文件是压缩包一种常用的压缩文件格式&#xff0c;对于这种文件&#xff0c;我们如何设置和取消密码保护呢&#xff1f; 首先我们要下载适用于RAR文件的WinRAR解压缩软件&#xff0c;然后在压缩文件的时候&#xff0c;就可以同步设置密码&#xff0c;选中需要压缩的文件&…

在外包公司干测试半年,提升的只有我的年龄···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;本科生&#xff0c;年初通过校招进入深圳某软件公司&#xff0c;干了接近半年的功能测试&#xff0c;直到最近遇到了瓶颈&#xff0c;感觉自己不能够在这样下去了…

分享5款小伙伴们推荐的好用软件

​ 转眼间2023年已经只剩下一个月了&#xff0c;最近陆陆续续收到好多小伙伴的咨询&#xff0c;这边也是抓紧整理出几个好用的软件&#xff0c;希望可以帮到大家。 1.文件格式转换——Convertio ​ Convertio是一款在线文件格式转换软件&#xff0c;可以让用户在不同的文件格…

Python sorted函数及用法以及如何用json模块存储数据

Python sorted函数及用法 sorted() 函数与 reversed() 函数类似&#xff0c;该函数接收一个可迭代对象作为参数&#xff0c;返回一个对元素排序的列表。 在交互式解释器中测试该函数&#xff0c;可以看到如下运行过程&#xff1a; >>> a [20, 30, -1.2, 3.5, 90, 3.…

Linux系统---图书管理中的同步问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、问题描述 &#xff08;1&#xff09;图书馆阅览室最多能够容纳N&#xff08;N5&#xff09;名学生&#xff0c;若有更多学生想…

跨境代采怎么实现(代采网站)

中国代购作为一种新型的业务形式&#xff0c;此类服务能够帮助消费者购买来自全球的商品&#xff0c;同时也为商家提供了在线销售机会。代购行业的兴起&#xff0c;有助于打破传统的地域和跨境限制&#xff0c;促进了国际贸易和经济发展。 一、中国代购的定义和特点 代购可以被…

冬季吃得过饱?羊大师教你几招消食的小妙招!

冬季吃得过饱&#xff1f;羊大师教你几招消食的小妙招&#xff01; 冬季是人们容易吃得过饱的季节&#xff0c;美食诱惑频出&#xff0c;很容易导致胃口过大&#xff0c;饭量过多&#xff0c;造成消化不良甚至影响身体健康。所以&#xff0c;如何消食&#xff0c;让胃得到缓解…

long转int类型转换问题

在业务代码中排序时需要根据日期排序&#xff0c;写了如下代码 sorted((o1, o2) -> {String str1 null;String str2 null;try {Field field getField(fieldMap, configBO.getCodeName());str1 String.valueOf(field.get(o1));str2 String.valueOf(field.get(o2));} ca…