想知道 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别 [关闭]

Posted

技术标签:

【中文标题】想知道 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别 [关闭]【英文标题】:Want to know the diff among pd.factorize, pd.get_dummies, sklearn.preprocessing.LableEncoder and OneHotEncoder [closed] 【发布时间】:2017-03-13 04:49:28 【问题描述】:

所有四个功能都与我非常相似。在某些情况下,其中一些可能会给出相同的结果,而有些则不会。任何帮助将不胜感激!

现在我知道并且我假设在内部,factorizeLabelEncoder 工作方式相同,并且在结果方面没有太大差异。我不确定他们是否会在处理大量数据时占用类似的时间。

get_dummiesOneHotEncoder 将产生相同的结果,但OneHotEncoder 只能处理数字,而get_dummies 将接受各种输入。 get_dummies 将为每个列输入自动生成新的列名,但OneHotEncoder 不会(它会分配新的列名 1,2,3....)。所以get_dummies 在各个方面都更好。

如果我错了,请纠正我!谢谢!

【问题讨论】:

【参考方案1】:

这四个编码器可以分为两类:

标签编码为分类变量:Pandas factorize 和 scikit-learn LabelEncoder。结果将具有 1 个维度。 将分类变量编码为虚拟/指标(二进制)变量:Pandas get_dummies 和 scikit-learn OneHotEncoder。结果将有 n 个维度,分别是编码分类变量的不同值。

pandas 和 scikit-learn 编码器之间的主要区别在于,scikit-learn 编码器用于 scikit-learn 管道,具有 fittransform 方法。

将标签编码为分类变量

Pandas factorize 和 scikit-learn LabelEncoder 属于第一类。它们可用于创建分类变量,例如将字符转换为数字。

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

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

Pandas get_dummies 和 scikit-learn OneHotEncoder 属于第二类。它们可用于创建二进制变量。 OneHotEncoder 只能用于分类整数,而get_dummies 可以用于其他类型的变量。

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 transform first 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

我还根据这个答案写了一个更详细的post。

【讨论】:

非常感谢!这真的很清楚,所以在内部,factorize 和 LabelEncoder 的工作方式相同; get_dummies 和 OneHotEncoder 会产生相同的结果,但 OneHotEncoder 只能处理数字,而 get_dummies 会接受各种输入,对吧? 在内部它们的工作方式不同,因为 scikit-learn 编码器分两步工作 fit 和转换,但它们产生相同的结果。是的,get_dummies 会接受各种输入。 很好的回复 - 您认为您可以向我们展示一下性能方面的快速比较吗?我感觉 Sklearn 的 LabelEncoder 比 Pandas factorizer 慢很多,但这只是一种感觉……

以上是关于想知道 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

pandas 将字符串映射为数字的方法

pandas 将字符串映射为数字的方法

scikit learn 凝聚聚类算法的设置条件

在 plotly express 中,如何重命名轴和图例的名称? y 轴仅显示为值,图例上的标题是可变的

我想知道QT的一切

想知道这个是啥意思,求大神解答!