python - GridsearchCV 和 Kfold 交叉验证

标签 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 = 100max_depth = 4 进行模型构建。现在将为此计算score借助 10 倍交叉验证来选择模型?

    • a。我对流程的理解如下

      • 1.X_trainy_train 将分为 10 组。
      • 模型将在 9 组上进行训练,并在剩余 1 组上进行测试,其得分将存储在列表中:例如 score_list
  • 此过程将再重复 9 次,这 9 个分数中的每一个都会添加到 score_list 中,总共得到 10 分
  • 最后,将取 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的理解正确吗?

  • 现在假设我获得的最佳模型参数为 {'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),你的理解确实是正确的;原则上需要纠正的措辞细节是“更好final_score”而不是“更高”,因为有几个性能指标(衡量错误的所有指标) >,例如 MSE、MAE 等),越低越好。

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

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

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

    再次,在理论上,Vivek Kumar 在他的 linked answer 中写道。正确的是:

    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 页):

    enter image description here

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

    <小时/>

    总结:

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

    关于python - GridsearchCV 和 Kfold 交叉验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481349/

    相关文章:

    python - Django 评论重定向

    python - 导入导入 GPL 库的库?

    python - TF*IDF 用于搜索查询

    python - 在不平衡数据集上计算 ROC AUC 时应使用哪种平均值?

    machine-learning - 重新加载 pickle 的 sklearn 管道时出现问题。未导入计数向量分析器功能

    python - 无法在单个连接中发送多个请求数据 — 套接字错误

    python - 如何在 Databricks 上使用 HoloViews/hvPlot

    machine-learning - 用于一类与所有声学信号分类的 SVM

    python - 从特征集中选择集成特征

    image-processing - 机器学习框架caffe支持不同的数据类型精度吗?