Scikit learn 如何使用交叉值从网格搜索中获得最佳估计参数?

Scikit learn 如何使用交叉值从网格搜索中获得最佳估计参数?,scikit-learn,Scikit Learn,为了方便起见,我想知道当我使用带有cross_val_分数的嵌套交叉验证时GridSearch的结果 使用cross_val_score时,您会得到一个分数数组。收到拟合的估计器或该估计器所选参数的摘要将是有用的 我知道你可以自己做这件事,但只是手动实现交叉验证,但如果可以结合交叉验证分数来做,那就方便多了 有什么方法可以做到这一点,或者这是一个建议功能?scikit learn中的GridSearchCV类已经在内部进行了交叉验证。您可以将任意值作为GridSearchCV的构造函数的cv参数

为了方便起见,我想知道当我使用带有cross_val_分数的嵌套交叉验证时GridSearch的结果

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

我知道你可以自己做这件事,但只是手动实现交叉验证,但如果可以结合交叉验证分数来做,那就方便多了


有什么方法可以做到这一点,或者这是一个建议功能?

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

您的问题的答案是,这是一个值得推荐的功能。不幸的是,您无法使用
cross\u val\u 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_'
从sklearn导入数据集
从sklearn.linear\u模型导入线性回归
从sklearn.grid\u搜索导入GridSearchCV
从sklearn.cross_验证导入cross_val_分数
数字=数据集。加载数字()
X=数字。数据
y=数字。目标
超参数=[{'fit_intercept':[True,False]}]
algo=线性回归()
grid=GridSearchCV(algo,超参数,cv=5,评分='mean_squared_error')
#嵌套交叉验证
交叉值(网格,X,y)
grid.best_分数_
[Out]:
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
15#嵌套交叉验证
16交叉分数(网格,X,y)
--->17.最佳成绩_
AttributeError:“GridSearchCV”对象没有“最佳分数”属性

(还请注意,您从
cross_val_score
中获得的分数不是
评分中定义的分数,这里是均方误差。您看到的是最佳估计器的分数函数。v0.14的错误已被描述。)

sklearn v0.20.0
中(将于2018年底发布),如果需要,经过训练的估计器将通过函数
交叉验证
公开

有关新功能,请参见此处相应的。类似这样的方法会奏效:

从sklearn.metrics.scorer导入检查\u评分
从sklearn.model_选择导入交叉验证
评分员=检查评分(估计员=网格搜索,评分=评分)
cvRet=交叉验证(估计器=网格搜索,X=X,y=y,
得分={'score':得分者},cv=cvOuter,
return\u train\u score=False,
返回值_估计值=真,
n_jobs=nJobs)
分数=cvRet[“测试分数”]#相当于交叉分数的输出()
估计量=cvRet[“估计量”]

如果
return\u estimator=True
,则可以从返回的字典中检索估计器作为
cvRet['estimator']
。存储在
cvRet['test\u score']
中的列表相当于
cross\u val\u score
的输出。查看如何通过
cross\u validate()
实现
cross\u validate()

啊,谢谢!这是令人困惑的,因为在文档中,进行嵌套交叉验证的示例方法是将GridSearchCV对象传递给cross_val_scoreYes。这是一种很好的方法来评估模型选择本身的泛化误差方差。网格搜索是一种元学习算法,在某些情况下可能会导致过度拟合。这并不能回答嵌套交叉验证的问题,在嵌套交叉验证中,仍然需要使用
GridSearchCV
估计器调用
cross\val\u score
。例如,请参阅。您知道现在是否可以获取网格搜索对象的信息?顺便说一句,对于cross_val_score调用中的每个折叠,将构造一个不同的网格对象。那么,难道不应该有一个“cross_val”对象,其中包含对应折叠的每个最佳“网格”对象的信息吗?@Quickbeam2k1尚未检查。如果你让我们知道这里。GitHub可能是建议对scikit进行更改的更好地方。不确定相关人员是否正在阅读本文。感谢回复。我搜索了一下,发现:所以一般的建议是构建自己的cross_val_score函数实现。如何做到这一点,可能会在将来的文档中显示