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

如何解决嵌套交叉验证的正确程序是什么?

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

我一直在尝试了解最佳方法。但是阅读之后:

  1. https://stats.stackexchange.com/questions/229509/do-i-need-an-initial-train-test-split-for-nested-cross-validation
  2. https://stats.stackexchange.com/questions/410118/cross-validation-vs-train-validation-test/410206
  3. https://stats.stackexchange.com/questions/95797/how-to-split-the-dataset-for-cross-validation-learning-curve-and-final-evaluat

我仍然对最佳的前进方法不知所措。

到目前为止,我有

  1. 将整个数据集(80%/ 20%)分为训练和测试集
  2. 定义了我的内部简历,外部简历,参数网格和估计量(随机森林)
  3. 运行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','min_samples_leaf': [1,2,4,25],'min_samples_split': [2,5,10,'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')

我现在有2个问题:

  1. 如何找到总体最佳模型?
  2. 如何针对X_test和Y_test对此最佳模型进行测试?

解决方法

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

为了回答您的问题,在您对 X_train/y_train 完成嵌套 CV 后,您已经获得了对模型性能的无偏估计。接下来,在 X_train/y_train 上使用 RandomizedSearchCV 再次调整模型超参数。从此搜索中获取最佳模型并将其用于您的 X_test/y_test。

示例代码:

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','min_samples_leaf': [1,2,4,25],'min_samples_split': [2,5,10,'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,refit=True)
nested_cv_results = cross_val_score(rfclf,X_train,cv=outer_cv,scoring = 'accuracy')



random = RandomizedSearchCV(rfc,refit=True)

random.fit(X_train,Y_train)
random.best_estimator_.score(X_test,Y_test)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?