《scikit

您所在的位置:网站首页 怎么把文字转换数字 《scikit

《scikit

2024-07-16 15:38| 来源: 网络整理| 查看: 265

处理缺失值呢,就不讲了,参考之前的博文,《《scikit-learn》随机森林回归填补缺失值》 即可。 这里来学习怎么对一些数值进行处理

一:对分类型数据处理,对数据进行编码和哑变量的处理 Scikit-learn中处理是不允许有文字的,因此需要做一些转换,对标签或者特征的含有文字的信息进行转换。 1:把文字/字符信息转换成对应的类别数值。 方法如下:

一个是对标签进行数值转换。

from sklearn.preprocessing import LabelEncoder # 标签专用,将标签转换为数值的,用于y值的转换,只能输入标签。 import numpy as np data = np.array(['S', 'N', 'S', 'S', 'N', 'N', 'S']) # 方法一 le = LabelEncoder() res = le.fit(data) res = le.transform(data) print('转换后的结果是:', res) # 得到转换后的结果 print('转换后的标号和类别关系关系是(下标就是标号):', le.classes_) # 得到对应的类别,每个文字的下标就是其数字标号 # 方法二 le = LabelEncoder() res = le.fit_transform(data) print('转换后的结果是:', res) # 得到转换后的结果 print('转换后的标号和类别关系关系是(下标就是标号):', le.classes_) # 得到对应的类别,每个文字的下标就是其数字标号 # 进一步操作 data_src = le.inverse_transform(res) # 还原即可。 print('逆转回的结果是:', data_src)

另一个是对特征进行批量转换

from sklearn.preprocessing import OrdinalEncoder # 特征专用,只能用于特征的文字到数值的转换 import numpy as np data = np.array([['S', 'N', 'S', 'S', 'N', 'N', 'S'], ['A', 'B', 'C', 'B', 'C', 'A', 'B'], ['man', 'girl', 'man', 'girl', 'girl', 'man', 'girl']]) data = data.transpose() # 方法一 oe = OrdinalEncoder() res = oe.fit(data) res = oe.transform(data) print('转换后的结果是:', res) # 得到转换后的结果 print('转换后的标号和类别关系关系是(下标就是标号):', oe.categories_) # 得到对应的类别,每个文字的下标就是其数字标号 # 方法一 oe = OrdinalEncoder() res = oe.fit_transform(data) print('转换后的结果是:', res) # 得到转换后的结果 print('转换后的标号和类别关系关系是(下标就是标号):', oe.categories_) # 得到对应的类别,每个文字的下标就是其数字标号 # 进一步操作 data_src = oe.inverse_transform(res) print(data_src)

还有一种,one-hot编码,也就是独热编码 比如boy和girl,之间没有任何数值上的大小关系,纯属表示了类别而已。

from sklearn.preprocessing import OneHotEncoder # 独热编码 import numpy as np data = np.array([['S', 'N', 'S', 'S', 'N', 'N', 'S'], # 两个类别 ['A', 'B', 'C', 'B', 'C', 'A', 'B'], # 三个类别 ['man', 'girl', 'man', 'girl', 'girl', 'man', 'girl']] # 两个类别 ) data = data.transpose() # 方法一 oe = OneHotEncoder(categories='auto') res = oe.fit(data) res = oe.transform(data).toarray() print('转换后的结果是:', res) # 得到转换后的结果 print('转换后的标号和类别关系关系是(下标就是标号):', oe.categories_) # 得到对应的类别,每个文字的下标就是其数字标号 print(oe.get_feature_names()) # 从这里能看到各个列对应的原始属性和具体类别信息 # 方法一 oe = OneHotEncoder(categories='auto') res = oe.fit_transform(data).toarray() print('转换后的结果是:', res) # 得到转换后的结果 print('转换后的标号和类别关系关系是(下标就是标号):', oe.categories_) # 得到对应的类别,每个文字的下标就是其数字标号 print(oe.get_feature_names()) # 从这里能看到各个列对应的原始属性和具体类别信息 # 进一步操作 data_src = oe.inverse_transform(res) print(data_src)

获取独热编码后,拼接到原始特征后面,原始的特征就可以删除了。

二:处理连续性变量,二值化和分段 决策树呢是可以处理一些连续型的数据的,但是有时候我们不需要那么精细,比如年龄作为特征,22岁和21岁可能没什么差距,但是22岁和42岁就是有很大差距了,年龄不同,背后的社会经验,体能等有点影响。 这时候我们需要把数据进行二值化或分段,比如在某个范围段是我关心的,在另外个范围段也是我关心的。

先来看将年龄二值化,比如我们将30岁作为界限,分为30以下和30以上。

from sklearn.preprocessing import Binarizer # 独热编码 import numpy as np # [] : 一维数组 # [[]] : 二维数组 # [[[]]] : 三维数组 data = np.array([13, 16, 22, 28, 32, 38, 45]).reshape(-1, 1) # 特征专用,不能使用一个样本,也就是一维数组 bz = Binarizer(threshold=30) # 以30为界限 res = bz.fit_transform(data) print(res)

有时候我们按照儿童(12岁),青少年(30),中老年(45),老年划分(65),分为多个段。

from sklearn.preprocessing import KBinsDiscretizer # 独热编码 import numpy as np # [] : 一维数组 # [[]] : 二维数组 # [[[]]] : 三维数组 data = np.array([8, 16, 22, 28, 32, 38, 45, 50, 68, 80]).reshape(-1, 1) # 特征专用,不能使用一个样本,也就是一维数组 # 实例一:分成4类,每个分裂都是用一个数值表示,使用均匀分布来划分 kbd = KBinsDiscretizer(n_bins=4, encode='ordinal', strategy='uniform') # 以30为界限 res = kbd.fit_transform(data) print(res) # 实例二:分成4类,每个分裂都是用一个独热向量表示,使用均匀分布来划分 kbd = KBinsDiscretizer(n_bins=4, encode='onehot', strategy='uniform') # 以30为界限 res = kbd.fit_transform(data).toarray() print(res) print(kbd.bin_edges_) # 得到划分额边界值


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3