这四个编码器可以分为两类:
- 将标签编码为分类变量:Pandas
factorize 和 scikit-learn LabelEncoder。结果将具有 1 个维度。
- 将分类变量编码为虚拟/指标(二进制)变量:Pandas
get_dummies 和 scikit-learn OneHotEncoder。结果将有 n 个维度,分别是编码分类变量的不同值。
pandas 和 scikit-learn 编码器之间的主要区别在于,scikit-learn 编码器用于 scikit-learn 管道,具有 fit 和 transform 方法。
将标签编码为分类变量
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。