GridsearchCV 和 Kfold 交叉验证

GridsearchCV and Kfold Cross validation

我试图理解 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)

我有以下问题:

  1. 说在第一次迭代中 n_estimators = 100max_depth = 4 被选择为模型 building.Now 将在以下的帮助下选择此模型的 score 10 折交叉验证 ?

    • 一个。我对流程的理解如下

      • 1.X_trainy_train将分成10组。
        1. 模型将在 9 组上训练并在剩余的 1 组上进行测试,其分数将存储在列表中:比如 score_list
        1. 这个过程会再重复 9 次,这 9 个分数中的每一个都会被添加到 score_list 中,总共得到 10 个分数
        1. 最后,score_list 的平均值将被取为参数为 final_score 的模型:n_estimators = 100max_depth = 4
    • b.上述过程将重复 n_estimatorsmax_depth 的所有其他可能组合,每次我们都会得到该模型的 final_score

    • c。最佳模型将是具有最高 final_score 的模型,我们将通过 CV_rfc.best_params_[ 获得相应的 'n_estimators' 和 'max_depth' 最佳值

我对 GridSearchCV 的理解正确吗?

  1. 现在假设我得到最好的模型参数 {'max_depth': 10, 'n_estimators': 100}。我声明模型的实例如下

RFReg_best = RandomForestRegressor(n_estimators = 100, max_depth = 10, random_state = 1)

我现在有两个选择,我想知道哪个是正确的

一个。对整个数据集使用交叉验证来查看模型的性能,如下所示

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),你的理解确实是正确的;原则上要更正的措辞细节是“更好 final_score”而不是 "higher",因为有几个性能指标(所有衡量 error,例如 MSE、MAE 等)是-更低-更好的。

现在,第(2)步比较棘手;它需要退一步检查整个过程...

首先,一般来说,CV 用于 参数调整 (您的第 1 步)或 模型评估(即什么您正在尝试在步骤 2) 中执行此操作,这确实是不同的事情。正如您在此处所做的那样,从一开始就将您的数据拆分为训练和测试集,然后依次执行步骤 1(用于参数调整)和 2b(在 unseen 数据中进行模型评估)是原则上可以说是最 "correct" 的程序(至于您在评论中指出的偏差,这是我们必须忍受的,因为默认情况下我们所有的拟合模型都 "biased" 用于他们的数据培训,这是不可避免的)。

然而,从很早开始,从业者就一直在想,是否可以避免"sacrificing"他们宝贵的一部分数据仅用于测试(模型评估)目的,并试图看看他们是否真的可以跳过模型评估部分(和测试集本身),使用从参数调整过程(您的步骤 1)获得的最佳结果作为模型评估。这显然是在偷工减料,但是,一如既往,问题是 实际结果会有多大偏差? 并且 它仍然有意义吗?

同样,在 理论 中,Vivek Kumar 在他的 中写的是正确的:

If you use the whole data into GridSearchCV, then there would be leakage of test data into parameter tuning and then the final model may not perform that well on newer unseen data.

但这里是(强烈推荐)Applied Predictive Modeling 书(第 78 页)的相关摘录:

简而言之:如果在步骤1中使用整个X并将调优的结果作为模型评估,确实会有bias/leakage,但通常很小,在对于中等规模的训练集最少...


总结:

  • 理论上的"most correct"过程确实是你的步骤1和2b的组合
  • 您可以尝试走捷径,在第 1 步中使用整个训练集 X,您的模型评估很可能仍在可接受的范围内。