【问题标题】:How to preprocess test data after one hot encoding如何在一次热编码后预处理测试数据
【发布时间】:2020-04-14 08:51:58
【问题描述】:

我在这里有点困惑,我对所有那些 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)

【问题讨论】:

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


    【解决方案1】:

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

    解决方案 1

    如果您有可能获得您计划编码的分类变量的所有可能级别/值,您可以在执行one-hot encoding 时将它们作为categories 参数传递@987654325 的默认值@ 是 auto,它自动从训练数据中确定类别,并且不会考虑在测试数据中发现的新类别。强制执行categories 作为所有可能类别的列表将帮助我们解决这个问题。即使您的测试数据包含训练/验证数据中不存在的新类别,它们也会被正确编码,并且您不会收到NaNs。

    解决方案 2

    如果您无法收集分类列的所有可能类别,您可以继续按照您的方式安装 one-hot 编码器,并且当您尝试转换测试数据以处理 @ 987654329@s,当你找到一个新的类时,你可以使用某种插补技术,如SimpleImputerIterativeImputer 来插补缺失值并进一步处理。

    希望这会有所帮助!

    【讨论】:

    • 解决方案 1 是一种解决方法(您在训练期间泄漏了一些测试信息,想想)。不应使用解决方案 2。插补在这里没有任何意义。
    【解决方案2】:

    我会建议两件事:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-19
      • 2018-10-31
      • 2021-02-23
      • 2019-05-02
      • 2020-07-07
      • 2020-05-13
      • 2018-01-04
      • 2020-08-05
      相关资源
      最近更新 更多