Python GridsearchCV和Kfold交叉验证
我在试着理解sklearn的意思。关于在GridsearchCV中使用交叉验证,我没有什么基本问题,那么我应该如何进一步使用GridsearchCV的建议呢 假设我声明一个GridsearchCV实例,如下所示Python GridsearchCV和Kfold交叉验证,python,machine-learning,scikit-learn,cross-validation,grid-search,Python,Machine Learning,Scikit Learn,Cross Validation,Grid Search,我在试着理解sklearn的意思。关于在GridsearchCV中使用交叉验证,我没有什么基本问题,那么我应该如何进一步使用GridsearchCV的建议呢 假设我声明一个GridsearchCV实例,如下所示 from sklearn.grid_search import GridSearchCV RFReg = RandomForestRegressor(random_state = 1) param_grid = { 'n_estimators': [100, 500, 10
from sklearn.grid_search import GridSearchCV
RFReg = RandomForestRegressor(random_state = 1)
param_grid = {
'n_estimators': [100, 500, 1000, 1500],
'max_depth' : [4,5,6,7,8,9,10]
}
CV_rfc = GridSearchCV(estimator=RFReg, param_grid=param_grid, cv= 10)
CV_rfc.fit(X_train, y_train)
我有以下问题:
n_估计器=100
和max_depth=4
被选择用于模型构建。现在将借助10倍交叉验证来选择该模型的得分
- a。我对这个过程的理解如下
- 1.
和X\u列
将分为10组y\u列
- 模型将在9组上进行训练,并在剩余的1组上进行测试,其分数将存储在一个列表中:比如
score\u list
- 1.
- 此过程将再重复9次,这9个分数中的每一个都将添加到
,总共得10分分数列表中
n\u估计器=100
和max\u depth=4
n_估计值
和max_depth
重复,每次我们都将得到该模型的最终_分数CV\rfc获得相应的“n_估计数”和“最大_深度”的最佳值。最佳_参数
GridSearchCV
的理解正确吗
{'max_depth':10,'n_估计器]:100}
。我声明模型的完整性如下RFReg\u最佳=随机森林回归器(n\u估计值=100,最大深度=10,随机状态=1)
我现在有两个选择,我想知道哪一个是正确的
a。对整个数据集使用交叉验证,以查看模型的性能,如下所示
scores = cross_val_score(RFReg_best , X, y, cv = 10, scoring = 'mean_squared_error')
rm_score = -scores
rm_score = np.sqrt(rm_score)
b。在X_-train、y_-train上安装模型,然后在X_-test、y_-test上进行测试
RFReg_best.fit(X_train, y_train)
y_pred = RFReg.predict(X_test)
rm_score = np.sqrt(mean_squared_error(y_test, y_pred))
或者两者都是正确的关于(1),你的理解确实是正确的;原则上需要纠正的措辞细节是“更好的<代码>最终评分代码>”而不是“更高”,因为有几个性能指标(测量误差的所有指标,如MSE、MAE等)越低越好
现在,第(2)步更加棘手;它需要后退一步来检查整个过程
首先,CV通常用于参数调整(您的步骤1)或模型评估(即您在步骤2中尝试执行的操作),这两种方法实际上是不同的。正如您在这里所做的那样,从一开始就将您的数据拆分为训练集和测试集,然后依次执行步骤1(用于参数调整)和2b(在看不见的数据中进行模型评估),这可以说是原则上最“正确”的程序(至于你在评论中提到的偏见,这是我们不得不忍受的,因为默认情况下,我们所有的拟合模型都“偏向”于用于训练的数据,这是无法避免的)
然而,从早期开始,从业者一直在想,他们是否可以避免仅为了测试(模型评估)目的而“牺牲”一部分宝贵数据,并试图看看他们是否可以真正跳过模型评估部分(以及测试集本身),使用从参数调整过程(步骤1)中获得的最佳结果作为模型评估。这显然是在抄近路,但通常的问题是,实际结果会有多差?这是否仍然有意义
理论上,维韦克·库马尔(Vivek Kumar)在其著作中所写的同样正确:
如果将整个数据用于GridSearchCV,那么将有测试数据泄漏到参数调整中,最终模型可能无法在新的看不见的数据上很好地执行
但以下是(极力推荐)这本书(第78页)的相关摘录:
简而言之:如果在步骤1中使用整个<代码> x <代码>,并将调谐结果视为模型评估,则确实存在偏置/泄漏,但通常是小的,至少对于中等大的训练集…
总结:
- 理论上“最正确”的程序实际上是步骤1和2b的组合
- 您可以在步骤1中使用整个培训集
,尝试走捷径,并且很可能您的模型评估仍在可接受的范围内X
最终评分”
,而不是“更高”,因为有几个性能指标(测量误差的所有指标,如MSE、MAE等)越低越好
现在,步骤(2)更加棘手;它需要后退一步来检查整个过程
首先,CV通常用于参数调整(您的步骤1)或模型评估(即您在步骤2中尝试执行的操作),这两种操作实际上是不同的。从一开始就将数据拆分为训练集和测试集,就像您在这里所做的那样,然后依次执行步骤1(用于参数调整)2b(看不见的数据中的模型评估)可以说是原则上最“正确”的程序(至于您在评论中注意到的偏差,这是我们必须忍受的,因为默认情况下,我们所有的拟合模型都“偏向”用于训练的数据,这是无法避免的)
然而,从早到晚,从业者一直在想,他们是否可以避免仅为了测试(模型评估)目的而“牺牲”一部分宝贵的数据,并试图看看他们是否真的可以跳过