使用管道将MinMaxScaler()应用于RFECV()



我正在尝试进行特征选择,并使用RFECVLogisticRegression。要做到这一点,我需要缩放数据,因为否则回归不会收敛。然而,我认为如果我先缩放完整的数据,它会有偏差(基本上数据会泄漏到测试集(。

这是我迄今为止的代码:

from sklearn.feature_selection import RFECV
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline
cv = StratifiedKFold(5)
scaler = MinMaxScaler()
reg = LogisticRegression(max_iter=1000, solver="newton-cg")
pipeline = Pipeline(steps=[("scale",scaler),("lr",reg)])
visualizer = RFECV(pipeline, cv=cv, scoring='f1_weighted')

但它给了我一个错误:

Traceback (most recent call last):
File "<ipython-input-267-0073ead26d52>", line 1, in <module>
visualizer.fit(x_6, y_6)        # Fit the data to the visualizer
File "C:ProgramDataAnaconda3libsite-packagessklearnfeature_selection_rfe.py", line 550, in fit
scores = parallel(
File "C:ProgramDataAnaconda3libsite-packagessklearnfeature_selection_rfe.py", line 551, in <genexpr>
func(rfe, self.estimator, X, y, train, test, scorer)
File "C:ProgramDataAnaconda3libsite-packagessklearnfeature_selection_rfe.py", line 33, in _rfe_single_fit
return rfe._fit(
File "C:ProgramDataAnaconda3libsite-packagessklearnfeature_selection_rfe.py", line 204, in _fit
raise RuntimeError('The classifier does not expose '
RuntimeError: The classifier does not expose "coef_" or "feature_importances_" attributes

我甚至还没有将其与数据相匹配。

我试着搜索,但找不到任何有用的东西。有什么可能失败的想法吗?

这是Pipeline对象经常出现的问题。默认情况下,它们不暴露拟合估计量的内在特征重要性度量和其他属性。因此,您必须定义一个自定义的管道对象。

这里的答案已经提供了一个暴露特性重要性度量的解决方案:

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

使用这个,你可以创建你的管道对象,比如:

pipeline = MyPipeline(steps=[("scale",scaler),("lr",reg)])

现在RFECV对象可以毫无问题地访问拟合的LogisticRegression模型的系数。

最新更新