【问题标题】:GridsearchCV and Kfold Cross validationGridsearchCV 和 Kfold 交叉验证
【发布时间】:2019-04-28 02:41:28
【问题描述】:

我试图了解 sklearn 的 GridSearchCV。我对在 GridsearchCV 中使用交叉验证有几个基本问​​题,然后我应该如何进一步使用 GridsearchCV 的 recommendations

假设我声明一个 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 吗?

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

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

    • c。最佳模型将是具有最高 final_score 的模型,我们将通过CV_rfc.best_params_

    • 获得相应的最佳值 'n_estimators' 和 'max_depth'

我对@9​​87654336@的理解正确吗?

  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.是的,你的理解是正确的。 2. 我会更多地依赖b,尽管您并没有真正对模型进行更多测试。绝对不是a,因为在你找到最好的模型之后再做简历是没有意义的。使用整个训练集上的最佳模型进行训练,并在 X_test 上进行预测。
  • 我有一个答案(以及该答案中的其他答案)来解释这个here。
  • @VivekKumar 你的解释确实很棒。谢谢!!
  • @Scratch'N'Purr 但是如果我选择 2 个b,那么最好的模型不会只在X_train 和y_train 上进行训练。模型系数不会偏向X_train。如果我的理解有误,请见谅。机器学习领域的新成员
  • @Scratch'N'Purr 请注意,我正在考虑在 2 中使用 X, y 而不是 X_train、y_train

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


【解决方案1】:

关于(1),你的理解确实是正确的;原则上要更正的措辞细节是“更好final_score”而不是“更高”,因为有几个性能指标(所有衡量错误的指标,例如 MSE , MAE 等),它们是-更低的-更好的。

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

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

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

同样,在理论上,Vivek Kumar 在他的linked answer 中所写的内容是正确的:

如果您将整个数据用于 GridSearchCV,那么测试数据会泄漏到参数调整中,然后最终模型可能无法在较新的未见数据上表现得那么好。

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

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


总结:

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

【讨论】:

  • 如果我选择2 b 那么我认为系数会有点偏向X_train、y_train。请注意,在2 中,我传递了整个X, y 而不仅仅是X_train 和y_train。如果我错了,我会纠正我的疑问
  • 您的回答总结得很好。请您告诉我您对为什么使用2 a 不合适的想法。我只是想知道您对使用2 a 的感受
  • @Rookie_123 执行了第 1 步后,第 2a 步以一种不太有意义的方式与其重叠:通常,您要么拆分为训练/测试(步骤 1+2b),要么不这样做您一直使用 CV(仅第 1 步,但使用 X 而不是 X_train); step 2a 是一种中间立场,意义不大,因为模型已经在 step 1 中看到了部分数据(X_train)...
  • @Rookie_123 如果答案确实有帮助,请接受它(也欢迎投票;)
  • 答案不仅仅是提供帮助。感谢您付出的努力:) 谢谢
猜你喜欢
  • 2018-08-27
  • 1970-01-01
  • 2019-09-06
  • 2018-08-16
  • 2020-08-31
  • 2013-09-22
  • 2020-10-17
  • 2018-06-24
  • 2018-05-07
相关资源
最近更新 更多