Я пытаюсь выполнить 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, но мне было интересно, есть ли какое-либо обходное решение.
I 'также хотел бы поднять это как проблему дизайна RFECV
(он сначала преобразует X в массив numpy, в то время как другие подходы со встроенной перекрестной проверкой, например GridSearchCV
не сделай это)