我正在使用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.
答案 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})