如何在Sklearn中使用分层K折交叉验证后输出分类结果?
问题原因
cross_validate函数的返回值是存储交叉验证性能指标(如拟合时间、测试得分等)的字典,并非训练完成的分类器对象,因此无法调用predict方法,这就是报错的核心原因。
解决方案
根据你的需求,分两种场景给出对应代码:
场景1:获取训练集的分层K折交叉验证预测结果
如果你想得到训练集中每个样本在交叉验证过程中的预测值(用于评估模型在训练集的交叉验证表现),可以使用cross_val_predict函数:
from sklearn.model_selection import cross_val_predict from sklearn.metrics import classification_report # 获取训练集的交叉验证预测结果 train_cv_pred = cross_val_predict(clf, X_train, y_train, cv=5, stratify=y_train) target_names = ['Alive', 'Dead'] # 输出训练集的交叉验证分类报告 print(classification_report(y_train, train_cv_pred, target_names=target_names))
场景2:用交叉验证评估后,预测测试集数据
如果你只是想用分层K折交叉验证评估模型的泛化能力,之后仍要预测测试集数据,需要先通过交叉验证确认性能,再用完整的训练集重新训练分类器,之后再进行测试集预测:
from sklearn.model_selection import cross_validate # 用分层K折交叉验证评估模型性能 cv_results = cross_validate(clf, X_train, y_train, cv=5, stratify=y_train) # 查看交叉验证的测试得分 print("交叉验证测试得分:", cv_results['test_score']) # 用完整训练集重新训练分类器 clf.fit(X_train, y_train) # 预测测试集 R_y_pred = clf.predict(X_test) target_names = ['Alive', 'Dead'] # 输出测试集分类报告 print(classification_report(y_test, R_y_pred, target_names=target_names))
如果需要在交叉验证过程中同时完成模型调优和最终训练,可以使用GridSearchCV,它会在交叉验证后自动用最优参数拟合完整训练集:
from sklearn.model_selection import GridSearchCV # 定义参数网格(示例) param_grid = {'n_estimators': [100, 200], 'max_depth': [None, 10]} # 初始化GridSearchCV,使用分层K折 grid_clf = GridSearchCV(clf, param_grid, cv=5, stratify=y_train) # 拟合训练集 grid_clf.fit(X_train, y_train) # 输出最优参数和交叉验证得分 print("最优参数:", grid_clf.best_params_) print("最优交叉验证得分:", grid_clf.best_score_) # 用最优模型预测测试集 R_y_pred = grid_clf.predict(X_test) print(classification_report(y_test, R_y_pred, target_names=target_names))
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

