我有一个带有一些分类列的pandas数据框 . 其中一些包含非整数值 .
我目前想要对这些数据应用几种机器学习模型 . 对于某些模型,有必要进行标准化以获得更好的结果 . 例如,将分类变量转换为虚拟/指示变量 . 实际上,为此目的,pandas有一个名为 get_dummies 的函数 . 但是,此函数根据数据返回结果 . 因此,如果我在训练数据上调用get_dummies,然后在测试数据上再次调用它,则在两种情况下实现的列可能会有所不同,因为测试数据中的分类列只能包含一个子集/不同的可能值集与可能的值相比较培训数据 .
因此,我正在寻找其他方法来进行单热编码 .
有什么方法可以在python(pandas / sklearn)中进行一次热编码?
3 回答
在过去,我发现处理这个问题的最简单方法是使用
get_dummies
然后强制列在测试和训练之间匹配 . 例如,您可能会执行以下操作:这将丢弃您使用这些拆分进行交叉验证的标签信息,我建议两件事 . 首先,在整个数据集上执行
get_dummies
以获取所有列(而不是仅在上面的代码中的训练集上) . 其次,使用StratifiedKFold进行交叉验证,以便您的拆分包含相关标签 .Scikit-learn提供编码器
sklearn.preprocessing.LabelBinarizer
.对于编码训练数据,您可以使用fit_transform,它将发现类别标签并创建适当的虚拟变量 .
对于测试数据,您可以使用transform使用相同的类别集 .
说,我有一个功能"A",可能的值为"a","b","c","d" . 但是训练数据集只包含三个类别"a","b","c"作为值 . 如果在此阶段使用
get_dummies
,则生成的特征将为三(A_a,A_b,A_c) . 但理想情况下应该有另一个功能A_d以及全零 . 这可以通过以下方式实现:输出是