首页 > 解决方案 > one-hot 编码的可用类别的一致性

问题描述

假设我有两个数据集,一个用于训练,一个用于预测。

在这两个数据集中,我有相同的分类变量,我希望使用 sklearn 进行一次热编码preprocessing.OneHotEncoder()

接下来,让我们看看变量 X 可能的唯一值:['a', 'b', 'c', 'd', 'e']

因此,变量 X 存在于训练和测试数据集中。但是,只有值'a''b'出现在训练集中,而只有'c''d'出现'e'在测试集中。

因此,如果我将以下代码应用于这两个数据集:

enc1 = pre.OneHotEncoder()
to_encode = train_df.select_dtypes(include='object')
encoded = enc1.fit_transform(to_encode).toarray()
dum_df = pd.DataFrame(encoded, columns=enc1.get_feature_names(to_encode.columns))
train_df = train_df.join(dum_df)
train_df.drop(to_encode.columns, axis=1, inplace=True)

# And repeat, just replace train_df with test_df

我得到两个单热编码数据帧。但是,它们的维度会有所不同,因为训练集中的一些值没有出现在测试集中(反之亦然)。

假设我已经在训练集上训练了一个算法:

  1. 当我将测试集中的数据输入到机器学习算法中时会发生什么,该算法是在具有不同维度的训练集上训练的?
  2. 算法是否会关心某些数据列是否丢失?具体来说,我正在使用XGBoost.XGBRegressor(),但我也有兴趣知道是否有一个通用的答案。

标签: pythonpandasscikit-learnxgboostone-hot-encoding

解决方案


我认为 align 是您正在寻找的。如下例所示

train = pd.get_dummies(train)   #assume it  gives (1451, 221)  
test = pd.get_dummies(test)    #assume it gives (1459, 206)
# now doing alignment of train and test will do the trick  
final_train, final_test = train.align(test, join='inner', axis=1)  # inner join

推荐阅读