二进制单热(也称为 one-of-K)编码在于为分类变量的每个不同值制作一个二进制列。例如,如果一个颜色列(分类变量)采用值“红色”、“蓝色”、“黄色”和“未知”,则二进制单热编码会将颜色列替换为二进制列“颜色=”红色”、“颜色=蓝色”和“颜色=黄色”。我从 pandas 数据框中的数据开始,我想使用这些数据来训练带有 scikit-learn 的模型。我知道两种进行二进制单热编码的方法,但没有一种让我满意。
Pandas 和 get_dummies 在数据框的分类列中。就原始数据框包含可用的所有数据而言,此方法似乎非常出色。也就是说,您在将数据拆分为训练、验证和测试集之前进行一次性编码。但是,如果数据已经拆分成不同的集合,则此方法效果不佳。为什么?因为其中一个数据集(比如测试集)可以包含更少的给定变量值。例如,训练集可能包含变量颜色的值红色、蓝色、黄色和未知,而测试集仅包含红色和蓝色。所以测试集最终会比训练集有更少的列。 (我也不知道新列是如何排序的,即使有相同的列,每组中的顺序也可能不同)。
Sklearn 和 DictVectorizer 这解决了之前的问题,因为我们可以确保对测试集应用完全相同的转换。但是,转换的结果是一个 numpy 数组而不是 pandas 数据框。如果我们想将输出恢复为 pandas 数据帧,我们需要(或者至少这是我这样做的方式): 1) pandas.DataFrame(data=outcome of DictVectorizer transformation, index=index of original pandas data frame, columns= DictVectorizer().get_features_names) 和 2) 沿索引将生成的数据框与包含数字列的原始数据框连接起来。这可行,但有点麻烦。
如果我们将数据拆分为训练集和测试集,是否有更好的方法在 pandas 数据帧中进行二进制单热编码?
最佳答案
如果您的列顺序相同,您可以连接 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:, :]
如果您的列的顺序不同,那么无论您尝试什么方法,您都会遇到挑战。
关于python - python 中二进制单热(one-of-K)编码的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256415/