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

How to preprocess test data after one hot encoding

我在这里有点困惑,我为所有那些 < 10 个唯一值 low_cardinality_cols 对我的分类列进行了热编码,并删除了训练和验证数据的其余分类列。

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

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

在下面示例一个热编码,这是针对 kaggle competition/intermediate 课程 here

# 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)

据我所知,有两种可能的解决方案,我将在此处进行说明,您可以选择适合您的方法。

解决方案 1

如果您有可能获得您计划编码的分类变量的所有可能 levels/values,您可以在执行 [=16] 时将它们作为 categories 参数传递=] categories 的默认值为 auto,它会根据训练数据自动确定类别,并且不会考虑在测试数据中发现的新类别。强制 categories 作为所有可能类别的列表将帮助我们解决这个问题。即使您的测试数据有 training/validation 数据中不存在的新类别,它们也会被正确编码,您不会得到 NaNs.

解决方案 2

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

希望对您有所帮助!

我有两点建议:

  • OneHotEncoder 默认是一个参数 handle_unknown="error"。如果您提到(训练期间未知的测试类别),它应该变成 handle_unknow="ignore"
  • 使用包含预测器的 scikit-learn 管道而不是调用 fit_transformtransform,然后将数据提供给预测器