首页 文章

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

提问于
浏览
5

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

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

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

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

3 回答

  • 7

    在过去,我发现处理这个问题的最简单方法是使用 get_dummies 然后强制列在测试和训练之间匹配 . 例如,您可能会执行以下操作:

    import pandas as pd
    
    train = pd.get_dummies(train_df)
    test = pd.get_dummies(test_df)
    
    # get the columns in train that are not in test
    col_to_add = np.setdiff1d(train.columns, test.columns)
    
    # add these columns to test, setting them equal to zero
    for c in col_to_add:
        test[c] = 0
    
    # select and reorder the test columns using the train columns
    test = test[train.columns]
    

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

  • 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)
    
  • 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
    

相关问题