离散型特征的处理方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DataCastle/article/details/85232689

机器学习中,常常在数据集中会遇到一些离散特征,对于这些离散特征相比连续特征要用不同的处理方法,常见的方法有LabelEncoder与OneHotEncoder。

LabelEncoder

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='<U2')

#数字内容
le.fit_transform([2,2,4,8,7])
#array([0, 0, 1, 3, 2], dtype=int64)
le.transform([2,2,4,8,7])
#array([0, 0, 1, 3, 2], dtype=int64)
le.inverse_transform([0, 0, 1, 3, 2])
#array([2, 2, 4, 8, 7])

通过上面的实例可以看到,LabelEncoder既可以对文字内容编码,也可以对数字内容编码,都是以0开始的数字为不同的内容编码,相同的内容则用同一数字。但是当LabelEncoder的结果对于计算机处理数据时的效果并不是很好,此时会考虑onehot编码。

OneHotEncoder

OneHotEncoder同样是对离散特征编码,离散特征中有多少不同的值,就用多少维来表示该特征。这是与LabelEncoder最大的区别所在。sklearn提供的工具如下:

扫描二维码关注公众号,回复: 4868141 查看本文章

sklearn.preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, sparse=True, dtype=<class ‘numpy.float64’>, 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相同的功能,感兴趣的同学可以自行尝试~

猜你喜欢

转载自blog.csdn.net/DataCastle/article/details/85232689