Использование преобразователя столбцов в Scikit для предварительной обработки обучающих и тестовых данных с целевой переменной

#python #scikit-learn #pipeline #training-data

Вопрос:

У меня есть проблемы с предварительной обработкой набора данных в целом с помощью 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)
 

Это приводит к ошибке: данный столбец не является столбцом фрейма данных

И это в некотором смысле имеет смысл, потому что я использую препроцессор для выполнения функции nlog1p в target_y, которая в основном является моей целевой функцией, которая присутствует только в y_train и y_test. Я предполагаю, что это вызывает ошибку, потому что цель не находится в X_train.

Вопрос: Можно ли предварительно обработать X и y сразу или обязательно использовать другой преобразователь/конвейер столбцов для моих значений y? Есть ли какое-нибудь хорошее решение для этого?

Комментарии:

1. Вы исправили синтаксис, так как в предварительной обработке отсутствует » (цитата), где вы указали log_p

Ответ №1:

Вы не можете предварительно обработать целевые объекты в ColumnTransformer или Pipeline (если только вы не планируете объединить их с независимыми переменными, а затем разделить их позже); однако TransformedTargetRegressor для этого варианта использования есть (документы).

Комментарии:

1. Спасибо, это решает мою проблему, я не знал, что это существует!

2. Пожалуйста, предоставьте минимальный фрагмент кода

Ответ №2:

обычно один выполняет конвейер для функций , а другой-для целевых значений .