如何在Scikit-learn中使用分层交叉验证处理多分类任务
用Scikit-learn实现多分类任务的分层交叉验证
分层交叉验证(Stratified Cross Validation)在多分类任务里堪称实用工具——它能保证每个交叉验证折(fold)的类别分布和整个数据集完全匹配,避免随机划分带来的类别失衡问题,让模型的评估结果更精准可信。下面我就一步步带你实现,附上完整可运行的代码示例:
完整代码示例
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV from sklearn.metrics import roc_auc_score from sklearn.metrics import precision_recall_fscore_support as score from sklearn.model_selection import StratifiedKFold from xgboost import XGBClassifier import time # 1. 定义模型超参数搜索空间 params = { 'min_child_weight': [1, 5, 10], 'gamma': [0.5, 1, 1.5, 2, 5], 'subsample': [0.6, 0.8, 1.0], 'colsample_bytree': [0.6, 0.8, 1.0], 'max_depth': [3, 4, 5] } # 2. 初始化XGBoost多分类模型 # 注意:多分类任务要设置objective为'multi:softprob',并指定类别数num_class xgb = XGBClassifier( learning_rate=0.02, n_estimators=600, objective='multi:softprob', num_class=3, # 这里替换成你的任务实际类别数 seed=42, use_label_encoder=False, eval_metric='mlogloss' ) # 3. 设置分层交叉验证策略 # n_splits是折数,shuffle=True保证每次划分随机,random_state固定结果可复现 stratified_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) # 4. 用网格搜索(或随机搜索)结合分层交叉验证调参 # 这里以GridSearchCV为例,也可以换成RandomizedSearchCV提升调参效率 grid_search = GridSearchCV( estimator=xgb, param_grid=params, cv=stratified_kfold, scoring='roc_auc_ovr', # 多分类的ROC-AUC用ovr(一对多)或ovo(一对一) n_jobs=-1, # 用所有CPU核心加速计算 verbose=2 ) # 5. 拟合数据(假设你已经准备好X特征矩阵和y标签) # grid_search.fit(X, y) # 6. 查看最佳参数和评估结果 # print("最佳超参数:", grid_search.best_params_) # best_model = grid_search.best_estimator_ # 7. 模型评估示例 # y_pred = best_model.predict(X_test) # y_proba = best_model.predict_proba(X_test) # precision, recall, fscore, support = score(y_test, y_pred) # roc_auc = roc_auc_score(y_test, y_proba, multi_class='ovr') # print(f"多分类ROC-AUC: {roc_auc:.4f}") # print("各类别精确率:", precision) # print("各类别召回率:", recall) # print("各类别F1分数:", fscore)
关键要点说明
- 分层交叉验证的核心:
StratifiedKFold会根据标签y的分布来划分数据集,每个fold的类别占比和原始数据一致,这对样本不平衡的多分类任务尤其重要。 - XGBoost多分类设置:必须指定
objective='multi:softprob'(输出每个类别的概率),同时用num_class指定任务的类别数量;关闭use_label_encoder并设置eval_metric='mlogloss'可以避免版本兼容警告。 - 多分类评估指标:ROC-AUC在多分类场景下要指定
multi_class参数(ovr或ovo),而precision_recall_fscore_support会直接返回每个类别的精确率、召回率和F1分数,方便你细致分析模型表现。
这样一套流程下来,你就能在多分类任务中充分利用分层交叉验证的优势,得到更可靠的模型评估和调参结果啦~
内容的提问来源于stack exchange,提问作者Bratt Swan
相关产品推荐
相关产品推荐

