如何阅读sklearn网格搜索估算器的选定内置参数?

时间:2018-03-05 17:44:44

标签: python scikit-learn grid-search

我正在使用sklearn'gridsearchcv'来查找我的特征选择方法的最佳超参数,这里是'selectkbest'。我正在使用“特征选择”管道和我的岭回归。

此类管道的一个示例是here

然而,我正在使用'RidgeCV'选择它自己的正规化器和高效的内置loocv。在这种情况下,我无法访问我的Ridgecv的参数。

k_range = [10, 15, 30, 50, 150, 300, 500]
alpha_range = [0.01, 0.05, 
           0.1, 0.5, 
           1,
           2,
           5, 
            10,
            100]
featureSelection = SelectKBest(f_classif)
ridgecv = linear_model.RidgeCV(alphas=alpha_range, gcv_mode='eigen', 
                           store_cv_values=True)
pipe = Pipeline([('anova', featureSelection), ('ridgecv', ridgecv)])
grid = GridSearchCV(pipe, param_grid={'anova__k':k_range}, 
cv=inner_cv)
grid.fit(x_train, y_train)
print(grid.best_params_)

在这段代码的putput中,我可以看到'anova'特征选择的所选k是什么,但我找不到一种方法来访问我''ridgecv'所选择的'alpha'

{'anova__k': 15}

我试着获得最好的估算器,并像这样读取它的alpha参数:

es = grid.estimator.named_steps['ridgecv'].score(x,y)
es.alpha_

但它说:

NotFittedError: This RidgeCV instance is not fitted yet. Call 'fit' with appropriate arguments before using this method.

1 个答案:

答案 0 :(得分:0)

您可能想尝试best_estimator_而不是estimator,即

es = grid.best_estimator_.named_steps['ridgecv']

在另一个主题上,虽然功能严格,但在RidgeCV级别和GridSearchCV级别进行交叉验证却很奇怪。在这种情况下,我建议使用sklearn.linear_model.Ridge类,并在GridSearchCV级别进行alpha交叉验证,例如

ridge = Ridge()
pipe = Pipeline([('anova', featureSelection), ('ridge', ridge)])
grid = GridSearchCV(pipe, param_grid={'anova__k':k_range, 'ridge__alpha': alpha_range})