赛博空间7号

The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.--Stephen William Hawking

详解pd.factorize(),pd.get_dummies()和sklearn中的LabelEncoder和OnehotEncoder的区别

参考:网页链接


这四种编码方式可以分为以下两类:

(1)将分类变量编码为数字,Pandas factorize and scikit-learn LabelEncoder,结果是一维的;

(2)将分类变量编码为虚拟(二进制)变量,Pandas get_dummies and scikit-learn OneHotEncoder,结果是n维(n为类别个数)

Pandas和sklearn编码的主要不同是sklearn编码器通过fit和transform方法用于sklearn piplines

将分类变量编码为数字

factorize and LabelEncoder所处理的input和输出的output是一样的

from sklearn import preprocessing    
# Test data
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])  
df['Fact'] = pd.factorize(df['Col'])[0]
le = preprocessing.LabelEncoder()
df['Lab'] = le.fit_transform(df['Col'])
print(df)
#   Col  Fact  Lab
# 0   A     0    0
# 1   B     1    1
# 2   B     1    1
# 3   C     2    2


将分类变量编码为虚拟(二进制)变量

OneHotEncoder 只能处理整型的分类变量 而 get_dummies 还可以处理其他类型的变量.get_dummies能自动生成新列名,而OneHotEncoder默认新列名为0,1,2,3......

df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
df = pd.get_dummies(df)print(df)
#    Col_A  Col_B  Col_C
# 0    1.0    0.0    0.0
# 1    0.0    1.0    0.0
# 2    0.0    1.0    0.0
# 3    0.0    0.0    1.0
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
# We need to first transform character into integer in order to use the OneHotEncoder
le = preprocessing.LabelEncoder()
df['Col'] = le.fit_transform(df['Col'])
enc = OneHotEncoder()
df = DataFrame(enc.fit_transform(df).toarray())
print(df)
#      0    1    2
# 0  1.0  0.0  0.0
# 1  0.0  1.0  0.0
# 2  0.0  1.0  0.0
# 3  0.0  0.0  1.0


发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

© 版权所有:沈阳市和平区赛博空间咨询部|辽ICP备18005891号
Powered by Z-BlogPHP & Yiwuku.com