如何使用cross_val_score从GridSearch获取best_estimator参数?

时间:2013-06-22 21:51:28

标签: scikit-learn

当我使用cross_val_score的嵌套交叉验证时,我想知道GridSearch的结果。

使用cross_val_score时,您会得到一系列分数。收到拟合的估算器或估算器所选参数的摘要将是有用的。

我知道你可以自己做,但只是手动实现交叉验证,但如果可以与cross_val_score一起完成,那就更方便了。

任何方式都可以这样做或者这是一个建议的功能吗?

3 个答案:

答案 0 :(得分:6)

scikit-learn中的GridSearchCV类已在内部进行交叉验证。您可以将任何CV iterator作为cv的构造函数的GridSearchCV参数传递。

答案 1 :(得分:2)

您的问题的答案是,这是一个建议的功能。不幸的是,您无法使用cross_val_score(截至目前,scikit 0.14)获得嵌套交叉验证模型的最佳参数。

见这个例子:

from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import cross_val_score

digits = datasets.load_digits()
X = digits.data
y = digits.target

hyperparams = [{'fit_intercept':[True, False]}]
algo = LinearRegression()

grid = GridSearchCV(algo, hyperparams, cv=5, scoring='mean_squared_error')

# Nested cross validation
cross_val_score(grid, X, y)
grid.best_score_

[Out]:
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-4c4ac83c58fb> in <module>()
     15 # Nested cross validation
     16 cross_val_score(grid, X, y)
---> 17 grid.best_score_

AttributeError: 'GridSearchCV' object has no attribute 'best_score_'

(另请注意,您从cross_val_score获得的分数不是scoring中定义的分数,这里是均方误差。您看到的是最佳估算器的分数函数。 v0.14描述为here。)

答案 2 :(得分:1)

sklearn v0.20.0(将于2018年末发布)中,如果需要,经过训练的估计量将通过函数cross_validate公开。

有关新功能,请参见此处相应的pull-request。这样的事情会起作用:

from sklearn.metrics.scorer import check_scoring
from sklearn.model_selection import cross_validate
scorer = check_scoring(estimator=gridSearch, scoring=scoring)
cvRet = cross_validate(estimator=gridSearch, X=X, y=y,
                       scoring={'score': scorer}, cv=cvOuter,
                       return_train_score=False,
                       return_estimator=True,
                       n_jobs=nJobs)

scores = cvRet['test_score']  # Equivalent to output of cross_val_score()
estimators = cvRet['estimator']

如果为return_estimator=True,则可以从返回的字典中以cvRet['estimator']的形式获取估计量。存储在cvRet['test_score']中的列表等同于cross_val_score的输出。请参见here如何通过cross_val_score()实现cross_validate()