二进制单热(也称为一个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 回答
如果列的顺序相同,则可以连接dfs,使用
get_dummies
,然后再将它们拆分,例如,如果您的列的顺序不同,那么无论您尝试何种方法,都会遇到挑战 .
您可以将数据类型设置为分类:
请参阅Pandas的this issue .