如何解决嵌套交叉验证的正确程序是什么?
我正在尝试使用scikit-learn进行分类,然后预测分类器的准确性。我的数据集相对较小,我不确定最佳参数。因此,我转向嵌套交叉验证(nCV)来制作和测试我的模型。
我一直在尝试了解最佳方法。但是阅读之后:
- https://stats.stackexchange.com/questions/229509/do-i-need-an-initial-train-test-split-for-nested-cross-validation
- https://stats.stackexchange.com/questions/410118/cross-validation-vs-train-validation-test/410206
- https://stats.stackexchange.com/questions/95797/how-to-split-the-dataset-for-cross-validation-learning-curve-and-final-evaluat
我仍然对最佳的前进方法不知所措。
到目前为止,我有:
- 将整个数据集(80%/ 20%)分为训练和测试集
- 定义了我的内部简历,外部简历,参数网格和估计量(随机森林)
- 运行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个问题:
- 如何找到总体最佳模型?
- 如何针对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 举报,一经查实,本站将立刻删除。