Использование конвейера, содержащего ColumnTransformer, в RFECV SciKit

Я пытаюсь сделать RFECV преобразованные данные с помощью SciKit.

Для этого я создаю конвейер и передаю его в RFECV. Он отлично работает, если у меня нет ColumnTransformer в качестве этапа конвейера. Это дает мне следующую ошибку:

ValueError: Specifying the columns using strings is only supported for pandas DataFrames

Я проверил ответ на этот вопрос, но я не уверен, применимы ли они здесь. Код выглядит следующим образом:

import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import Normalizer
from sklearn.pipeline import Pipeline
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LinearRegression

class CustomPipeline(Pipeline):
    @property
    def coef_(self):
        return self._final_estimator.coef_
    @property
    def feature_importances_(self):
        return self._final_estimator.feature_importances_

X = pd.DataFrame({
    'col1': [i for i in range(100)] , 
    'col2': [i*2 for i in range(100)],
})
y = pd.DataFrame({'out': [i*3 for i in range(100)]})
ct = ColumnTransformer([("norm", Normalizer(norm='l1'), ['col1'])])

pipe = CustomPipeline([
    ('col_transform', ct),
    ('lr', LinearRegression())
])

rfecv = RFECV(
    estimator=pipe, 
    step=1,
    cv=3,
)
#pipe.fit(X,y) # pipe can fit, no problems
rfecv.fit(X,y)

Очевидно, я могу выполнить этот шаг преобразования вне конвейера, а затем использовать преобразованный X, но мне было интересно, есть ли какое-либо обходное решение.

Я также хотел бы поднять это как проблему дизайна RFECV (он сначала преобразует X в массив numpy, в то время как другие подходы со встроенной перекрестной проверкой, например GridSearchCV, этого не делают)


person towi_parallelism    schedule 12.07.2020    source источник
comment
Мне любопытно, что вы в итоге делаете ... У меня точно такая же проблема   -  person Guillermo.D    schedule 26.05.2021
comment
@ Guillermo.D, я сделал преобразование до конвейера и передал преобразованный X в конвейер, не идеально, но не мог придумать более аккуратного способа   -  person towi_parallelism    schedule 26.05.2021