版权声明:本文为博主原创文章,未经博主允许不得转载。 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变量,虽然这会增加大量的存储空间。