python

时间:2015-08-27 18:00:08

标签: python pandas scikit-learn categorical-data

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

    数据框的分类列中的
  1. Pandas和get_dummies 。只要原始数据框包含可用的所有数据,此方法就显得非常出色。也就是说,在训练,验证和测试集中分割数据之前,您需要执行单热编码。但是,如果数据已经分成不同的集合,则此方法不能很好地工作。为什么?因为其中一个数据集(例如,测试集)可以包含给定变量的较少值。例如,虽然训练集包含变量颜色的红色,蓝色,黄色和未知值,但测试集只包含红色和蓝色。因此,测试集的最终列数将少于训练集。 (我不知道新列是如何排序的,如果甚至具有相同的列,则每个集合的顺序可能不同。)

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

  3. 如果我们在训练和测试集中分割数据,是否有更好的方法在pandas数据帧中进行二进制单热编码?

1 个答案:

答案 0 :(得分: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