数据预处理:分类和顺序变量转化为数值型数据
分类数据和顺序数据要参与模型计算,通常都会转化为数值型数据。当然,某些算法是允许这些数据直接参与计算的,例如决策树、关联规则等。
真值转换
要将非数值型数据转换为数值型数据的最佳方法是:将所有分类或顺序变量的值域从一列多值的形态转换为多列只包含真值的形态,其中的真值可通过True、False或0、1的方式来表示。这种标志转换的方法有时候也称为真值转换。
代码如下:
import pandas as pd # 导入pandas库
from sklearn.preprocessing import OneHotEncoder # 导入OneHotEncoder库# 1.自定义转换主过程
df1 = pd.DataFrame({'id': [3566841, 6541227, 3512441],'sex': ['male', 'Female', 'Female'],'level': ['high', 'low', 'middle']})df1_new = df1.copy() # 复制一份新的数据框用来存储转换结果
for col_num, col_name in enumerate(df1): # 循环读出每个列的索引值和列名col_data = df1[col_name] # 获得每列数据col_dtype = col_data.dtype # 获得每列数据类型if col_dtype == 'object': # 如果dtype类型是object,执行条件df1_new = df1_new.drop(col_name, axis=1) # 删除df数据框中要进行标志转换的列value_sets = col_data.unique() # 获取分类和顺序变量的唯一值域for value_unique in value_sets: # 读取分类和顺序变量中的每个值col_name_new = col_name + '_' + value_unique # 创建新的列名col_tmp = df1.iloc[:, col_num] # 获取原始数据列new_col = (col_tmp == value_unique) # 将原始数据列与每个值进行比较df1_new[col_name_new] = new_col # 为最终结果集增加新列值
print(df1_new) # 2.使用sklearn进行标志转换
df2 = pd.DataFrame({'id': [3566841, 6541227, 3512441],'sex': [1, 2, 2],'level': [3, 1, 2]})id_data = df2.values[:, :1] # 获得ID列
transform_data = df2.values[:, 1:] # 指定要转换的列
enc = OneHotEncoder() # 建立模型对象
#如果不使用toarray进行转换,那么输出的数据是一个3行5列的稀疏矩阵。
df2_new = enc.fit_transform(transform_data).toarray() # 标志转换
df2_all = pd.concat((pd.DataFrame(id_data,columns=['id']), pd.DataFrame(df2_new,columns=['sex1','sex2','level1','level2','level3'])),axis=1)
print(df2_all) #还可以使用drop参数将每个列编码为n_categories-1列,而不是n_categories列。此参数允许用户为要删除的每个特征指定类别。
#这对于避免某些分类器中输入矩阵的共线性是有用的。
enc_drop = OneHotEncoder(drop='first') # 建立模型对象
#如果不使用toarray进行转换,那么输出的数据是一个3行5列的稀疏矩阵。
df3_new = enc_drop.fit_transform(transform_data).toarray() # 标志转换
df3_all = pd.concat((pd.DataFrame(id_data,columns=['id']), pd.DataFrame(df3_new,columns=['sex','level1','level2'])),axis=1)
print(df3_all)
标签编码
可以将数值型或非数值型标签的编码转换成数值标签,编码值范围限定在[0,标签长度-1],对于非数值型标签转化的要求是只要它们是可哈希并且可比较的。
代码如下:
from sklearn.preprocessing import LabelEncoder # 导入LabelEncoder库le = LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
print(list(le.classes_))
print(le.transform(["tokyo", "tokyo", "paris"]))
print(le.inverse_transform([2, 2, 1]))
数据预处理:分类和顺序变量转化为数值型数据相关推荐
- 【问题解决】【excel】求平均值、求和 结果为0 ->将excel中文本型数据转化为数值型数据
问题:求平均值.求和 结果为0 原因:表格中数据是文本型数据,而不是数值型数据,文本型数据平均值求和都为0 解决办法:将excel中文本型数据转化为数值型数据 选中文本型数值区域,发现在选中区域的左上 ...
- Scikit-learn数据预处理分类变量编码之字段特征编码
Scikit-learn数据预处理分类变量编码之字段特征编码 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 字段特征编码简介 ...
- Scikit-learn数据预处理分类变量编码之等级变量编码
Scikit-learn数据预处理分类变量编码之等级变量编码 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 等级分类变量编码 ...
- Scikit-learn数据预处理分类变量编码之多标签二值化
Scikit-learn数据预处理分类变量编码之多标签二值化 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 名义变量多标签二 ...
- Scikit-learn数据预处理分类变量编码之标签二值化
Scikit-learn数据预处理分类变量编码之标签二值化 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 名义变量标签二值化 ...
- matlab中数据变为nan,字符转化为数值型中出现NAN
我将字符型转化为数值型,然后画图,结果图形没有曲线,这是怎么回事?我用的函数是str2double和str2num都试了,都不行.我的程序如下,其中的E2(i)的值我用matlab计算了,为什么是这么 ...
- 机器学习实战(八)预测数值型数据:回归
文章目录 第八章 预测数值型数据:回归 8.1 用线性回归找到最佳拟合直线 8.1.1 线性回归 8.1.2数据可视化 8.1.3 求回归系数向量,并根据系数绘制回归曲线 8.2 局部加权线性回归(L ...
- 预测数值型数据:回归源码分析(1)
回归模型比较简单,这里先简单介绍下,后面遇到难点再具体分析. 回归的一般方法: (1)收集数据:采用任意方法收集数据. (2)准备数据:回归需要数值型数据,标称型数据将被转成二值型数据. (3)分析数 ...
- 机器学习实战-预测数值型数据:回归
1,用线性回归找到最佳拟合直线 回归的目的是预测数值型的目标值. 回归方程(regression equation)主要是求回归系数,一旦有了回归系数,在给定输入,做预测就是用回归系数乘以输入值,在将 ...
最新文章
- 从空间数据库中删除所有拓扑对象
- HDU 1847 Good Luck in CET-4 Everybody!
- EasyUI-datagrid 对于展示数据进行处理(formatter)
- PHP工厂模式的研究
- 【实验】DHCP、NAT配置案例
- 快排、寻找第k小数和前k小数
- 02_混淆矩阵、准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F值(F-Measure) +Roc曲线和PR曲线+sklearn中分类模型评估API+ 自己补充整理
- CORS跨域漏洞的学习(防止CSRF漏洞导致的漏洞)
- 整型索引查询mysql是不是快点_图解Mysql索引的数据结构!看不懂你来找我
- 7.11计划,做个没心没肺的人
- Android Resources Overview —— Android 资源文件
- 用c语言判断字符串为空,如何检查C字符串是否为空
- idea中按住ctrl+滚轮改变字体大小
- 物联网-电力监控平台(汇总)
- navicat premium导入表格时出现无法打开文件
- 鸿蒙系统正式版在哪下载,鸿蒙系统正式版安卓app下载-鸿蒙系统正式版最新下载v1.0_求知软件网...
- SPA 项目 之 后台接口文档
- 小德张-清朝最后一位首领太监
- Android 最完美的取色盘ColorPickView
- [转载]复旦女博士于娟——为啥是我得癌症? (转)