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

时间:2019-12-23 00:08:01

标签: scikit-learn data-science one-hot-encoding

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

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

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

下面是一种热门编码示例,用于kaggle竞赛/中级课程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)

2 个答案:

答案 0 :(得分:2)

我建议两件事:

  • OneHotEncoder是默认的参数handle_unknown="error"。如果您提到(培训期间未知的测试类别),应将其转到handle_unknow="ignore"
  • 使用包含预测变量的scikit学习管道而不是调用fit_transformtransform,然后将数据提供给预测变量

答案 1 :(得分:1)

据我所知,有两种可能的解决方案,在此我将举例说明,您可以选择适合您的任何一种。

解决方案1 ​​

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

解决方案2

如果您无法收集分类列的所有可能类别,则可以继续使用适合您的单编码器,并尝试转换测试数据以处理{找到新类时会遇到{1}}个问题,可以使用SimpleImputerIterativeImputer之类的插补技术来插补缺失的值并进一步处理。

希望这会有所帮助!