机器学习中,常常在数据集中会遇到一些离散特征,对于这些离散特征相比连续特征要用不同的处理方法,常见的方法有LabelEncoder与OneHotEncoder。
LabelEncoder用来对离散型分类型特征值进行编码,可以对本文编码,也可以对数字编码。sklearn中也提供给相应的工具包以便使用:
sklearn.preprocessing.LabelEncoder
常用方法如下:
fit(y) :训练 y数据集,与其他模型的fit方法类似。
fit_transform(y):相当于先进行fit再进行转换,返回标签编码。
inverse_transform(y):将标签编码返回为初始值。
transform(y) :直接返回标签编码。
示例如下:
from sklearn.preprocessing import LabelEncoder #文字内容 le = LabelEncoder() le.fit_transform(['天津','北京','上海','南京','北京']) #array([3, 1, 0, 2, 1], dtype=int64) le.transform(['天津','北京','上海','南京','北京']) #array([3, 1, 0, 2, 1], dtype=int64) le.inverse_transform([3, 1, 0, 2, 1]) #array(['天津', '北京', '上海', '南京', '北京'], dtype='
通过上面的实例可以看到,LabelEncoder既可以对文字内容编码,也可以对数字内容编码,都是以0开始的数字为不同的内容编码,相同的内容则用同一数字。但是当LabelEncoder的结果对于计算机处理数据时的效果并不是很好,此时会考虑onehot编码。
OneHotEncoder同样是对离散特征编码,离散特征中有多少不同的值,就用多少维来表示该特征。这是与LabelEncoder最大的区别所在。sklearn提供的工具如下:
sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, sparse=True, dtype=
, handle_unknown=’error’) (部分参数新版本可能取消,只需了解sparse、categories即可)
参数 含义 sparse 默认为True,如果设置为True将返回稀疏矩阵,否则将返回一个数组。 categories 默认为'auto',从训练数据中自动确定类别。可选为list, categories[i]
保存第i列中预期的类别。常用方法如下:
fit(y) :训练 y数据集,与其他模型的fit方法类似。
fit_transform(y):相当于先进行fit再进行转换,返回标签编码。
inverse_transform(y):将标签编码返回为初始值。
transform(y) :直接返回标签编码。
示例如下:
from sklearn.preprocessing import OneHotEncoder ohe = OneHotEncoder() x=[['天津'],['北京'],['上海'],['南京'],['北京']] ohe.fit_transform(x).toarray() #array([[0., 0., 0., 1.], # [0., 1., 0., 0.], # [1., 0., 0., 0.], # [0., 0., 1., 0.], # [0., 1., 0., 0.]]) ohe.transform(x).toarray() #array([[0., 0., 0., 1.], # [0., 1., 0., 0.], # [1., 0., 0., 0.], # [0., 0., 1., 0.], # [0., 1., 0., 0.]]) ohe.inverse_transform(array([[0., 0., 0., 1.], [0., 1., 0., 0.], [1., 0., 0., 0.], [0., 0., 1., 0.], [0., 1., 0., 0.]])) #array([['天津'], # ['北京'], # ['上海'], # ['南京'], # ['北京']], dtype=object)
可以看到,与LabelEncoder不同的地方在于OneHotEncoder将内容编码为0,1的形式,LabelEncoder是将内容编辑为0,1,2,...的形式。为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,让特征之间的距离计算更加合理。同时one-hot方法也有缺陷,当类别的数量很多时,特征空间会变得非常大,计算复杂度会变高,成本也会变大。
除此之外呢,pandas中的get_dummies()函数也具有与one-hot相同的功能,感兴趣的同学可以自行尝试~