我有一个pandas数据框架,其中包含一些分类列。其中一些包含非整数值。
我目前想在这些数据上应用几种机器学习模型。对于某些模型,有必要进行归一化以获得更好的结果。例如,将分类变量转换为dummy/indicator变量。事实上,pandas有一个名为get_dummies的函数用于此目的。然而,此函数返回的结果取决于数据。因此,如果我在训练数据上调用get_dummies,然后在测试数据上再次调用它,在两种情况下实现的列可能不同,因为与训练数据中的可能值相比,测试数据中的分类列可能仅包含可能值的子集/不同集合。
因此,我正在寻找其他方法来进行one-hot编码。
在python中进行一次热编码有哪些可能的方法(pandas/sklearn)?
5条答案
按热度按时间wnavrhmk1#
Scikit-learn提供了一个编码器
sklearn.preprocessing.LabelBinarizer
。对于编码训练数据,您可以使用fit_transform,它将发现类别标签并创建适当的虚拟变量。
对于测试数据,您可以使用转换来使用相同的类别集。
voj3qocg2#
在过去,我发现处理这个问题最简单的方法是使用
get_dummies
,然后强制test和train之间的列匹配。例如,你可以这样做:这将丢弃您在训练集中没有看到的标签信息,但会增强一致性。如果您使用这些拆分进行交叉验证,我建议您做两件事:首先,对整个数据集执行
get_dummies
以获取所有列第二,使用StratifiedKFold进行交叉验证,以便拆分包含相关的标签。83qze16e3#
假设,我有一个特征“A”,其可能值为“a”,“b”,“c”,“d”。但训练数据集仅包含三个类别“a”,“b”,“c”作为值。如果在此阶段使用
get_dummies
,则生成的特征将是三个(A_a,A_B,A_c)。但是理想地,应该存在另一个特征A_d也具有全零。这可以通过以下方式来实现:输出为
8iwquhpp4#
对于文本列,您可以尝试这样做
对于输出:
输出:
omjgkv6w5#
Sklearn实际上有一个OneHotEndcoder,工作得相当不错。
在像上面一样第一次使用 fit_transform 函数之后,只使用 transform 函数应该可以保持标签正确匹配。