【问题标题】:Using Column Transformer in Scikit to preprocess train and test data with target variable在 Scikit 中使用 Column Transformer 使用目标变量预处理训练和测试数据
【发布时间】:2021-10-04 10:07:02
【问题描述】:

我在使用 columntransformer 对整个数据集进行预处理时遇到问题 - 也许您可以提供帮助:

首先我读取了我的数据集:

X_train, X_test, y_train, y_test = train_test_split(df, target, test_size=0.2, random_state=seed)

然后我进行预处理:

preprocessor = ColumnTransformer(
    transformers=
    [
        ("col_drop", "drop",["col1","col2",]),
        ('enc_1', BinaryEncoder(), ["Bank"]),
        ('enc_2', OneHotEncoder(), ["Chair"]),
        ('log', FunctionTransformer(np.log1p, validate=False), log_features),
        ('log_p', FunctionTransformer(np.log1p, validate=False), ["target_y]),
        ('pow', PowerTransformer(method="yeo-johnson"), pow_features)
      
    ],
     remainder='passthrough',n_jobs=-1)

然后我用我的预处理器调用管道:

pipe.fit_transform(X_train, y_train)

这会产生错误:给定的列不是数据框的列

这在某种程度上是有道理的,因为我使用预处理器在 target_y,这基本上是我的目标特征,它只存在于 y_train 和 y_test 中。 我假设这会导致错误,因为目标不在 X_train 中。

问题:是否可以同时预处理 X 和 y,或者是否必须为我的 y 值使用另一个列转换器/管道?有什么好的解决办法吗?

【问题讨论】:

  • 您是否更正了语法,因为在您指定 log_p 的预处理中缺少“(引号)

标签: python scikit-learn pipeline training-data


【解决方案1】:

您不能在ColumnTransformerPipeline 中预处理目标(除非您计划将它们与自变量放在一起,然后再将它们分开);但是,TransformedTargetRegressor (docs) 用于此用例。

【讨论】:

  • 谢谢这解决了我的问题,不知道这存在!
  • 请提供最小代码sn-p
【解决方案2】:

通常,一个管道用于特征和其他管道用于目标值。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2017-06-21
    • 2020-10-13
    • 2012-12-25
    • 2020-03-09
    • 2021-01-06
    • 1970-01-01
    • 2018-05-07
    • 2021-12-30
    相关资源
    最近更新 更多