我试图理解sklearn的GridSearchCV。我对在GridsearchCV中使用交叉验证有几个基本问题,然后我该如何进一步使用GridsearchCV的建议
说我声明一个GridsearchCV实例如下
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_estimators = 100
,然后选择max_depth = 4
进行模型建立。现在,将借助10倍交叉验证为该模型选择score
吗?
a。我对这个过程的理解如下
X_train
和y_train
将被分成10套。score_list
score_list
中,总共得到10个分数n_estimators = 100
和max_depth = 4
b。重复上述过程,并使用n_estimators
和max_depth
的所有其他可能组合,每次我们为该模型获得 final_score
c。最好的模型将是具有最高 final_score 的模型,我们将通过CV_rfc.best_params_
我对GridSearchCV
的理解正确吗?
{'max_depth': 10, 'n_estimators': 100}
。我在下面声明该模型的一个实例 RFReg_best = RandomForestRegressor(n_estimators = 100, max_depth = 10, random_state = 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))
或者它们都是正确的
答案 0 :(得分:1)
关于(1),您的理解确实是正确的;原则上需要更正的措辞细节是“ 更好 final_score
”,而不是“更高”,因为存在多个性能指标(所有衡量 error 的指标,例如(例如MSE,MAE等)更好的选择。
现在,步骤(2)更加棘手;它需要退后一步来检查整个过程...
首先,通常使用CV进行参数调整(您的步骤1)或进行模型评估(即您在步骤2中要做的工作) ),这的确是不同的东西。可以说,从一开始就将数据分为训练和测试集,然后依次执行步骤1(用于参数调整)和步骤2b(在看不见的数据中进行模型评估)是最有效的。原则上是“正确”的程序(至于您在评论中指出的偏见,这是我们必须忍受的,因为默认情况下,我们所有的拟合模型都“偏向”用于其训练的数据,因此这是不可避免的)。
尽管如此,从一开始,从业人员就一直在想是否可以避免仅出于测试(模型评估)目的而“牺牲”一部分宝贵数据,并试图查看他们是否真的可以跳过模型评估部分(以及测试集本身),将通过参数调整过程(步骤1)获得的最佳结果用作模型评估。显然这是偷工减料,但通常情况下,问题是实际结果会如何?并且它仍然有意义吗?
同样,在理论中,维维克·库马尔(Vivek Kumar)在他的linked answer中所写的是正确的:
如果将整个数据用于GridSearchCV,则测试数据会泄漏到参数调整中,因此最终模型可能无法在较新的看不见的数据上表现不佳。
但这是(强烈推荐的)Applied Predictive Modeling书(第78页)的相关摘录:
简而言之:如果在步骤1中使用整个X
并将调整结果视为模型评估,则确实会存在偏差/泄漏,但通常较小,至少对于中等较大训练集...
总结:
X
来偷工减料,并且很可能您仍在模型评估的可接受范围内。