想了解 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别

这四个函数对我来说看起来非常相似。在某些情况下,它们中的一些可能会给出相同的结果,而有些则不会。任何帮助都将不胜感激!

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

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

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


回答:

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

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

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

将标签编码为分类变量

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

from sklearn import preprocessing    # 测试数据
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'])
# 我们需要先将字符转换为整数,以便使用 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

我还基于这个回答写了一篇更详细的文章

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注