处理缺失值呢,就不讲了,参考之前的博文,《《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_) # 得到划分额边界值