在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小学”,“初中”,“高中”,”大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。哑变量又称虚设变量、名义变量或哑变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。
LabelEncoder 分类标签编码
就是把数据变成连续的数值型变量,比如原先有“American”“Japanese”“Chinese”这些的,换成(0,1,2)
# 标签专用,能够将分类转换为分类数值
from sklearn.preprocessing import LabelEncoder
data = pd.DataFrame([[10, None], [10, '男'], [None, '女'], [35, '男']], columns=['年龄', '性别'])
y = data.iloc[:,-1] # 要输入的是标签,不是特征矩阵,所以允许一维
le = LabelEncoder() # 实例化
le = le.fit(y) # 导入数据
label = le.transform(y)
le.classes_ #属性.classes_查看标签中究竟有多少类别
label #查看获取的结果label
# 或者直接这么写
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
OrdinalEncoder 分类特征编码
OrdinalEncoder是一个类(class),功能是将分类特征编码为整数数组。它的输入应该是整数或字符串的类数组,也可以理解为矩阵,每一列表示一个特征,每一个特征中的数字或者是字符串表示一类特征,也就是分类(离散)特征所接受的值。特征按顺序转换为有序整数。结果就是每个特征对应一个整数列,取值范围0到n_categories - 1。例如输入X = [[‘Male’, 1], [‘Female’, 3], [‘Female’, 2]],这里输入数据中含有两列,说明有两类特征,第一列取值范围为:[ ‘Female’,’Male’],按照顺序编码为[0,1],第二列取值范围为:[1,2,3],编码结果为[0,1,2]。按照这个思路,[‘Female’, 3], [‘Male’, 1]的顺序编码分别为[0,2]和[1,0]。
# 特征专用,能够将分类特征转换为分类数值
from sklearn.preprocessing import OrdinalEncoder
data = pd.DataFrame([[10, None], [10, '男'], [None, '女'], [35, '男']], columns=['年龄', '性别'])
data_ = data.copy()
data_.head()
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
OrdinalEncoder().fit(data_.iloc[:,0:-1]).categories_
data_.iloc[:,0:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,0:-1])
data_.head()
OneHotEncoder 独热编码
就是把数据变成(1,0,0,…,0),(0,1,0,0,…,0),该特征属性有多少类别就有多少维
# OneHotEncoder 用于将表示分类的数据扩维:
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit([['苹果'],['梨'],['橘子'],['苹果']])
ohe.transform([['梨'],['苹果']]).toarray()
# 输出:[[1., 0., 0.], [0., 0., 1.]]
ohe.get_feature_names_out()
# 输出: array(['x0_梨', 'x0_橘子', 'x0_苹果'], dtype=object)
Binarizer 二值化,处理连续性特征
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯设置中的伯努利分布建模)。
#将年龄二值化
from sklearn.preprocessing import Binarizer
data = pd.DataFrame([[10, '女'], [20, '男'], [15, '女'], [35, '男']], columns=['年龄', '性别'])
X = data.iloc[:,0].values.reshape(-1,1)
#类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold=17).fit_transform(X)
# 输出: array([[0], [1], [0], [1]])
KBinsDiscretizer 数据分段
这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:
参数 | 含义&输入 |
---|---|
n_bins | 每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征 |
encode | 编码的方式,默认“onehot” “onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0 “ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵 “onehot-dense”:做哑变量,之后返回一个密集数组。 |
strategy | 用来定义箱宽的方式,默认”quantile” “uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征.max() - 特征.min())/(n_bins) “quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同 “kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同 |
from sklearn.preprocessing import KBinsDiscretizer
data = pd.DataFrame([[10, '女'], [20, '男'], [15, '女'], [35, '男']], columns=['年龄', '性别'])
X = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
#查看转换后分的箱:变成了一列中的三箱,输出: {0.0, 1.0, 2.0}
set(est.fit_transform(X).ravel())
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
#查看转换后分的箱:变成了哑变量
est.fit_transform(X).toarray()
# 输出 array([[1., 0., 0.], [0., 1., 0.], [1., 0., 0.], [0., 0., 1.]])