《scikit-learn》数据预处理与特征工程(二)数值转换

处理缺失值呢,就不讲了,参考之前的博文,《《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_)  # 得到划分额边界值
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值