GridsearchCV和Kfold Cross验证

时间:2018-11-26 12:41:29

标签: python machine-learning scikit-learn cross-validation grid-search

我试图理解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 = 100,然后选择max_depth = 4进行模型建立。现在,将借助10倍交叉验证为该模型选择score吗?

    • a。我对这个过程的理解如下

      • 1。X_trainy_train将被分成10套。
        1. 将对模型进行9组训练,并在其余1组上进行测试,其得分将存储在列表中:说score_list
        1. 此过程将再重复9次,并将这9个分数中的每个分数添加到score_list中,总共得到10个分数
        1. 最后,将使用score_list的平均值为参数为:n_estimators = 100max_depth = 4
        2. 的模型给出 final_score
    • 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)

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

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 个答案:

答案 0 :(得分:1)

关于(1),您的理解确实是正确的;原则上需要更正的措辞细节是“ 更好 final_score”,而不是“更高”,因为存在多个性能指标(所有衡量 error 的指标,例如(例如MSE,MAE等)更好的选择。

现在,步骤(2)更加棘手;它需要退后一步来检查整个过程...

首先,通常使用CV进行参数调整(您的步骤1)或进行模型评估(即您在步骤2中要做的工作) ),这的确是不同的东西。可以说,从一开始就将数据分为训练和测试集,然后依次执行步骤1(用于参数调整)和步骤2b(在看不见的数据中进行模型评估)是最有效的。原则上是“正确”的程序(至于您在评论中指出的偏见,这是我们必须忍受的,因为默认情况下,我们所有的拟合模型都“偏向”用于其训练的数据,因此这是不可避免的)。

尽管如此,从一开始,从业人员就一直在想是否可以避免仅出于测试(模型评估)目的而“牺牲”一部分宝贵数据,并试图查看他们是否真的可以跳过模型评估部分(以及测试集本身),将通过参数调整过程(步骤1)获得的最佳结果用作模型评估。显然这是偷工减料,但通常情况下,问题是实际结果会如何?并且它仍然有意义吗?

同样,在理论中,维维克·库马尔(Vivek Kumar)在他的linked answer中所写的是正确的:

  

如果将整个数据用于GridSearchCV,则测试数据会泄漏到参数调整中,因此最终模型可能无法在较新的看不见的数据上表现不佳。

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

enter image description here

简而言之:如果在步骤1中使用整个X并将调整结果视为模型评估,则确实会存在偏差/泄漏,但通常较小,至少对于中等较大训练集...


总结:

  • 理论上“最正确”的过程确实是步骤1和步骤2b的组合
  • 您可以尝试在第1步中使用整个训练集X来偷工减料,并且很可能您仍在模型评估的可接受范围内。