在scikit-learn中进行一次热编码的可能方法?

时间:2015-12-09 03:51:21

标签: python pandas scikit-learn

我有一个带有一些分类列的pandas数据框。其中一些包含非整数值。

我目前想在这些数据上应用几种机器学习模型。对于某些模型,有必要进行标准化以获得更好的结果。例如,将分类变量转换为虚拟/指示变量。实际上,为此目的,熊猫有一个名为 get_dummies 的功能。但是,此函数根据数据返回结果。因此,如果我在训练数据上调用get_dummies,然后在测试数据上再次调用它,在两种情况下实现的列可能会有所不同,因为测试数据中的分类列只能包含一个子集/不同的可能值集与可能的值相比较培训数据。

因此,我正在寻找其他方法来进行单热编码。

有哪些方法可以在python(pandas / sklearn)中进行一次热编码?

3 个答案:

答案 0 :(得分:9)

Scikit-learn提供编码器sklearn.preprocessing.LabelBinarizer

对于编码训练数据,您可以使用fit_transform,它将发现类别标签并创建适当的虚拟变量。

label_binarizer = sklearn.preprocessing.LabelBinarizer()
training_mat = label_binarizer.fit_transform(df.Label)

对于测试数据,您可以使用transform来使用相同的类别集。

test_mat = label_binarizer.transform(test_df.Label)

答案 1 :(得分:7)

过去,我发现处理此问题的最简单方法是使用a,然后强制列与测试和列车匹配。例如,您可能会执行以下操作:

A

这将丢弃您在训练集中未见过的标签信息,但会强制执行一致性。如果您使用这些拆分进行交叉验证,我建议两件事。首先,对整个数据集执行get_dummies以获取所有列(而不是仅在上面的代码中的训练集上)。其次,使用StratifiedKFold进行交叉验证,以便您的拆分包含相关标签。

答案 2 :(得分:0)

说,我有一个功能" A"可能的值" a"," b"," c"," d"。但是训练数据集只包含三个类别" a"," b"," c"作为价值观。如果在此阶段使用get_dummies,则生成的要素将为三(A_a,A_b,A_c)。但理想情况下应该有另一个功能A_d以及全零。这可以通过以下方式实现:

import pandas as pd
data = pd.DataFrame({"A" : ["a", "b", "c"]})
data["A"] = data["A"].astype("category", categories=["a", "b", "c", "d"])
mod_data = pd.get_dummies(data[["A"]])
print(mod_data)

输出

   A_a  A_b  A_c  A_d
0  1.0  0.0  0.0  0.0
1  0.0  1.0  0.0  0.0
2  0.0  0.0  1.0  0.0