类别特征编码

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

特征工程中通常要处理类别特征,如学历、性别、城市等,经常的做法是转换成dummy变量。会有LabelEncoder、OneHotEncoder、factorize、get_dummies4种方法。
下面进行比较:

import pandas as pd
from sklearn import  preprocessing

test=pd.DataFrame({'city':['beijing','shanghai','shenzhen'],'age':[21,33,23],'target':[0,1,0]})
1、LabelEncoder
label = preprocessing.LabelEncoder()
test['city']= label.fit_transform(test['city'])
print(test)
   age  city  target
0   21     0       0
1   33     1       1
2   23     2       0
2、OneHotEncoder
enc=preprocessing.OneHotEncoder(categorical_features=[1], sparse=False)
test=enc.fit_transform(test)
print(test)
[[ 1.  0.  0. 21.  0.]
 [ 0.  1.  0. 33.  1.]
 [ 0.  0.  1. 23.  0.]]

categorical_features默认是‘all’表示对所有特征编码,[1]是变量的索引,表示第2个变量;sparse 缺省状态下是True表示输出为稀疏矩阵。未经编码的变量放在右边。

3、factorize
print(pd.factorize(test['city']))
(array([0, 1, 2], dtype=int64), Index(['beijing', 'shanghai', 'shenzhen'], dtype='object'))
4、get_dummies
print(pd.get_dummies(test['city'],prefix='city'))
   city_beijing  city_shanghai  city_shenzhen
0             1              0              0
1             0              1              0
2             0              0              1

实际应用时可以如下:

test.apply(lambda x: pd.factorize(x)[0]) 

比较发现:LabelEncoder和factorize编码都是转化成了序数型,但有时这不是我们所期望的(如学历);OneHotEncoder和get_dummies都是按照类别全部转换成了dummy变量,虽然这会增加大量的存储空间。

猜你喜欢

转载自blog.csdn.net/jin_tmac/article/details/80611676