二进制单热(也称为一个K)编码在于为分类变量的每个不同值创建一个二进制列。例如,如果有一个颜色列(分类变量)采用值“红色”,“蓝色”,“黄色”和“未知”,则二进制单热编码用二进制列替换颜色列'color =红色','颜色=蓝色'和'颜色=黄色'。我从pandas数据框架中的数据开始,我想使用这些数据来训练带有scikit-learn的模型。我知道有两种方法可以进行二进制单热编码,但这些方法对我来说都不令人满意。
Pandas和get_dummies 。只要原始数据框包含可用的所有数据,此方法就显得非常出色。也就是说,在训练,验证和测试集中分割数据之前,您需要执行单热编码。但是,如果数据已经分成不同的集合,则此方法不能很好地工作。为什么?因为其中一个数据集(例如,测试集)可以包含给定变量的较少值。例如,虽然训练集包含变量颜色的红色,蓝色,黄色和未知值,但测试集只包含红色和蓝色。因此,测试集的最终列数将少于训练集。 (我不知道新列是如何排序的,如果甚至具有相同的列,则每个集合的顺序可能不同。)
Sklearn和DictVectorizer 这解决了上一个问题,因为我们可以确保将相同的转换应用于测试集。但是,转换的结果是一个numpy数组而不是pandas数据框。如果我们想要将输出恢复为pandas数据帧,我们需要(或者至少这是我的方式):1)pandas.DataFrame(data = DictVectorizer转换的结果,index =原始pandas数据的索引frame,columns = DictVectorizer()。get_features_names)和2)沿索引连接结果数据框,原始数据框包含数字列。这有效,但有点麻烦。
如果我们在训练和测试集中分割数据,是否有更好的方法在pandas数据帧中进行二进制单热编码?
答案 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。