Python 嵌套交叉验证的正确程序是什么?

Python 嵌套交叉验证的正确程序是什么?,python,machine-learning,scikit-learn,cross-validation,Python,Machine Learning,Scikit Learn,Cross Validation,我正在尝试使用scikit学习制作分类器,然后预测分类器的准确性。我的数据集相对较小,我不确定最佳参数。因此,我转向嵌套交叉验证(nCV)来制作和测试我的模型 我一直在努力理解最好的方法。然而,阅读之后: 我仍然不知道最好的办法是什么 到目前为止,我已经: 将(80%/20%)整个数据集拆分为训练集和测试集 定义了我的内cv、外cv、参数网格和估计器(随机森林) 运行nCV以获得平均准确度分数 为此,到目前为止,我的代码是: X_train, X_test, Y_train, Y_test

我正在尝试使用scikit学习制作分类器,然后预测分类器的准确性。我的数据集相对较小,我不确定最佳参数。因此,我转向嵌套交叉验证(nCV)来制作和测试我的模型

我一直在努力理解最好的方法。然而,阅读之后:

  • 我仍然不知道最好的办法是什么

    到目前为止,我已经:

  • 将(80%/20%)整个数据集拆分为训练集和测试集
  • 定义了我的内cv、外cv、参数网格和估计器(随机森林)
  • 运行nCV以获得平均准确度分数
  • 为此,到目前为止,我的代码是:

    X_train, X_test, Y_train, Y_test = train_test_split(X_res, Y_res, test_size=0.2)
    inner_cv = KFold(n_splits=2, shuffle=True)
    outer_cv = KFold(n_splits=2, shuffle=True)
    rfc = RandomForestClassifier()
    param_grid = {'bootstrap': [True, False],
                  'max_depth': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, None],
                  'max_features': ['auto', 'sqrt', 'log2', None],
                  'min_samples_leaf': [1, 2, 4, 25],
                  'min_samples_split': [2, 5, 10, 25],
                  'criterion': ['gini', 'entropy'],
                  'n_estimators': [200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000]}
    rfclf = RandomizedSearchCV(rfc, param_grid, cv=inner_cv, n_iter=100, n_jobs=-1, scoring='accuracy', verbose=1)
    nested_cv_results = cross_val_score(rfclf, X_train, Y_trin, cv=outer_cv, scoring = 'accuracy')
    
    我现在有两个问题:

  • 如何找到总体上最好的模型
  • 我如何用X_检验和Y_检验来检验这个最佳模型

  • 交叉验证用于评估模型性能或调整超参数。假设您使用CV来调整超参数,您不能使用这些CV分数来评估模型性能,也就是说,由于数据泄漏,您得到了过于乐观的估计。这是嵌套CV可以帮助您的地方。通过添加额外的CV层,可以防止数据泄漏。因此,嵌套CV用于获得模型性能的无偏估计

    为了回答您的问题,在您完成X_-train/y_-train上的嵌套CV后,您已经获得了对模型性能的无偏估计。接下来,在X_系列/y_系列上使用随机搜索CV再次调整模型超参数。通过此搜索获得最佳模型,并将其用于X_测试/y_测试

    示例代码:

    X\u列,X\u测试,Y\u列,Y\u测试=列测试分割(X\u res,Y\u res,测试大小=0.2)
    内部循环=KFold(n\u分割=2,随机播放=真)
    外部循环=KFold(n次分割=2,随机播放=真)
    rfc=RandomForestClassifier()
    param_grid={'bootstrap':[True,False],
    “最大深度”:[10,20,30,40,50,60,70,80,90,100,无],
    “最大功能”:[“自动”、“sqrt”、“日志2”,无],
    “min_samples_leaf”:[1,2,4,25],
    “最小样本分割”:[2,5,10,25],
    “标准”:[“基尼”,“熵”],
    “n_估计量”:[2004006008001000120014016018002000]}
    rfclf=RandomizedSearchCV(rfc,参数网格,cv=Internal\u cv,n\u iter=100,n\u作业=-1,评分='Accurance',verbose=1,refit=True)
    嵌套的cv结果=交叉值分数(rfclf,X序列,Y序列,cv=外部cv,分数='准确性')
    random=RandomizedSearchCV(rfc,参数网格,cv=Internal\u cv,n\u iter=100,n\u作业=-1,评分='准确性',详细=1,重新调整=真)
    随机拟合(X_序列,Y_序列)
    随机最佳估计得分(X检验,Y检验)