首页 文章

python中二进制单热(一K)编码的问题

提问于
浏览
7

二进制单热(也称为一个K)编码在于为分类变量的每个不同值创建一个二进制列 . 例如,如果有一个颜色列(分类变量)采用值“红色”,“蓝色”,“黄色”和“未知”,则二进制单热编码用二进制列替换颜色列'color =红色','颜色=蓝色'和'颜色=黄色' . 我从pandas数据框架中的数据开始,我想使用这些数据来训练带有scikit-learn的模型 . 我知道有两种方法可以进行二进制单热编码,但这些方法对我来说都不令人满意 .

  • Pandas and get_dummies 在数据框的分类列中 . 只要原始数据框包含可用的 all 数据,此方法就显得非常出色 . 也就是说,在训练,验证和测试集中分割数据之前,您需要执行单热编码 . 但是,如果数据已经拆分为不同的集合,则此方法不会知道新列的排序方式,即使具有相同的列,也可能在每个集合中的顺序不同 .

  • Sklearn and DictVectorizer 这解决了上一个问题,因为我们可以确保将相同的转换应用于测试集 . 但是,转换的结果是一个numpy数组而不是pandas数据框 . 如果我们想要将输出恢复为pandas数据帧,我们需要(或者至少这是我的方式):1)pandas.DataFrame(data = DictVectorizer转换的结果,index =原始pandas数据的索引frame,columns = DictVectorizer() . get_features_names)和2)沿索引连接结果数据框,原始数据框包含数字列 . 这有效,但有点麻烦 .

Is there a better way to do a binary one-hot encoding within a pandas data-frame if we have our data split in training and test set?

2 回答

  • 9

    如果列的顺序相同,则可以连接dfs,使用 get_dummies ,然后再将它们拆分,例如,

    encoded = pd.get_dummies(pd.concat([train,test], axis=0))
    train_rows = train.shape[0]
    train_encoded = encoded.iloc[:train_rows, :]
    test_encoded = encoded.iloc[train_rows:, :]
    

    如果您的列的顺序不同,那么无论您尝试何种方法,都会遇到挑战 .

  • 0

    您可以将数据类型设置为分类:

    In [5]: df_train = pd.DataFrame({"car":Series(["seat","bmw"]).astype('category',categories=['seat','bmw','mercedes']),"color":["red","green"]})
    
    In [6]: df_train
    Out[6]: 
        car  color
    0  seat    red
    1   bmw  green
    
    In [7]: pd.get_dummies(df_train )
    Out[7]: 
       car_seat  car_bmw  car_mercedes  color_green  color_red
    0         1        0             0            0          1
    1         0        1             0            1          0
    

    请参阅Pandas的this issue .

相关问题