Python GridsearchCV和Kfold交叉验证

Python GridsearchCV和Kfold交叉验证,python,machine-learning,scikit-learn,cross-validation,grid-search,Python,Machine Learning,Scikit Learn,Cross Validation,Grid Search,我在试着理解sklearn的意思。关于在GridsearchCV中使用交叉验证,我没有什么基本问题,那么我应该如何进一步使用GridsearchCV的建议呢 假设我声明一个GridsearchCV实例,如下所示 from sklearn.grid_search import GridSearchCV RFReg = RandomForestRegressor(random_state = 1) param_grid = { 'n_estimators': [100, 500, 10

我在试着理解sklearn的意思。关于在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_估计器=100
    max_depth=4
    被选择用于模型构建。现在将借助10倍交叉验证来选择该模型的
    得分

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

      • 1.
        X\u列
        y\u列
        将分为10组
      • 模型将在9组上进行训练,并在剩余的1组上进行测试,其分数将存储在一个列表中:比如
        score\u list
      • 此过程将再重复9次,这9个分数中的每一个都将添加到
        分数列表中
        ,总共得10分
      • 最后,将取得分列表的平均值,给出参数为:
        n\u估计器=100
        max\u depth=4
    • b。上述过程将与所有其他可能组合的
      n_估计值
      max_depth
      重复,每次我们都将得到该模型的最终_分数

    • c。最佳模型将是具有最高最终_分数的模型,我们将通过
      CV\rfc获得相应的“n_估计数”和“最大_深度”的最佳值。最佳_参数

  • 我对
    GridSearchCV
    的理解正确吗

  • 现在假设我得到的最佳模型参数为
    {'max_depth':10,'n_估计器]:100}
    。我声明模型的完整性如下
  • RFReg\u最佳=随机森林回归器(n\u估计值=100,最大深度=10,随机状态=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),你的理解确实是正确的;原则上需要纠正的措辞细节是“更好的<代码>最终评分”而不是“更高”,因为有几个性能指标(测量误差的所有指标,如MSE、MAE等)越低越好

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

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

    然而,从早期开始,从业者一直在想,他们是否可以避免仅为了测试(模型评估)目的而“牺牲”一部分宝贵数据,并试图看看他们是否可以真正跳过模型评估部分(以及测试集本身),使用从参数调整过程(步骤1)中获得的最佳结果作为模型评估。这显然是在抄近路,但通常的问题是,实际结果会有多差?这是否仍然有意义

    理论上,维韦克·库马尔(Vivek Kumar)在其著作中所写的同样正确:

    如果将整个数据用于GridSearchCV,那么将有测试数据泄漏到参数调整中,最终模型可能无法在新的看不见的数据上很好地执行

    但以下是(极力推荐)这本书(第78页)的相关摘录:

    简而言之:如果在步骤1中使用整个<代码> x <代码>,并将调谐结果视为模型评估,则确实存在偏置/泄漏,但通常是小的,至少对于中等大的训练集…


    总结:

    • 理论上“最正确”的程序实际上是步骤1和2b的组合
    • 您可以在步骤1中使用整个培训集
      X
      ,尝试走捷径,并且很可能您的模型评估仍在可接受的范围内
    关于(1),您的理解确实是正确的;原则上需要纠正的措辞细节是“更好的
    最终评分”
    ,而不是“更高”,因为有几个性能指标(测量误差的所有指标,如MSE、MAE等)越低越好

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

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

    然而,从早到晚,从业者一直在想,他们是否可以避免仅为了测试(模型评估)目的而“牺牲”一部分宝贵的数据,并试图看看他们是否真的可以跳过