如何在一次热编码后预处理测试数据



>我在这里有点困惑,我有一个热编码的分类列,用于所有这些<10 个唯一值low_cardinality_cols,并删除了训练和验证数据的剩余分类列。

现在,我的目标是将我的模型应用于新数据,test.csv。预处理测试数据以匹配训练/验证格式的最佳方法是什么?

我担心的是:
1.Test_data.csv肯定会对这些列有不同的基数
2.如果我使用训练中的低基数列对测试数据进行热编码,我会得到Input contains NaN但我的训练、有效和测试列都是相同的数字。

下面的示例一个热编码,这是用于kaggle比赛/中级课程

# Apply one-hot encoder to each column with categorical data
OH_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
OH_cols_train = pd.DataFrame(OH_encoder.fit_transform(X_train[low_cardinality_cols]))
OH_cols_valid = pd.DataFrame(OH_encoder.transform(X_valid[low_cardinality_cols]))
# One-hot encoding removed index; put it back
OH_cols_train.index = X_train.index
OH_cols_valid.index = X_valid.index
# Remove categorical columns (will replace with one-hot encoding)
# This also saves us the hassle of dropping columns 
num_X_train = X_train.drop(object_cols, axis=1)
num_X_valid = X_valid.drop(object_cols, axis=1)
# Add one-hot encoded columns to numerical features
OH_X_train = pd.concat([num_X_train, OH_cols_train], axis=1)
OH_X_valid = pd.concat([num_X_valid, OH_cols_valid], axis=1)

我会建议两件事:

  • OneHotEncoder是默认handle_unknown="error"的参数。在您提到的情况下,应该将其转向handle_unknow="ignore"(训练期间未知的测试类别(。
  • 使用包含预测器的scikit-learn管道,而不是调用fit_transformtransform然后将数据提供给预测器

据我所知,有两种可能的解决方案,我将在这里说明这两种解决方案,您可以选择适合您的解决方案。

解决方案 1

如果可以获取计划编码的分类变量的所有可能级别/值,则可以在执行独热编码时将它们作为categories参数传递,categories的默认值auto,它根据训练数据自动确定类别,并且不会考虑在测试数据中找到的新类别。将categories强制作为所有可能类别的列表将有助于我们解决此问题。因为即使您的测试数据具有训练/验证数据中不存在的新类别,它们也会正确编码,并且您不会得到NaN

解决方案 2

如果您无法收集分类列的所有可能类别,您可以继续按照您所做的方式安装独热编码器,并且当您尝试转换测试数据以处理NaN时,当您找到新类时会遇到, 您可以使用某种插补技术(如 SimpleImputer 或 IterativeImputer(来插补缺失值并进一步处理。

最新更新