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

dra*_*ake 7 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)沿索引连接结果数据框,原始数据框包含数字列.这有效,但有点麻烦.

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

inv*_*ion 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:, :] 
Run Code Online (Sandbox Code Playgroud)

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