当我使用cross_val_score的嵌套交叉验证时,我想知道GridSearch的结果。
使用cross_val_score时,您会得到一系列分数。收到拟合的估算器或估算器所选参数的摘要将是有用的。
我知道你可以自己做,但只是手动实现交叉验证,但如果可以与cross_val_score一起完成,那就更方便了。
任何方式都可以这样做或者这是一个建议的功能吗?
答案 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()
。