You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的XGBoost多分类模型超参数调优后准确率下降,原因何在?

XGBoost多分类调参后准确率下降的问题分析与解决

核心问题排查

  • 训练数据使用错误:你调用clf.fit(X,Y)时用了全量数据(含测试集),而非仅训练集X_train,y_train,这会导致数据泄露——RandomizedSearchCV的交叉验证本该基于训练集内部划分,但混入测试数据后,调参结果会过度拟合测试集,到真正测试时表现自然下滑。同时初始模型用训练集训练,调参模型用全量数据,两者训练基准不同,准确率对比毫无意义。
  • RandomizedSearchCV参数设置冗余:你的param_distributions仅learning_rate有2个候选值,其余参数都是单值,此时n_iter=1000完全是重复采样,纯浪费计算资源;且搜索空间过小,根本无法找到真正更优的参数组合。
  • 准确率计算冗余:多分类任务无需用LabelBinarizer转换标签,直接调用accuracy_score(y_test, val)即可得到准确率,多余的标签转换不会改变结果,反而增加代码复杂度。

修正后的代码示例

调参部分

# 初始化模型(无需提前fit,RandomizedSearchCV会自动处理训练流程)
xgb = XGBClassifier(booster='gbtree', objective='multi:softmax', random_state=42, 
                    eval_metric="mlogloss",  # 多分类优先用mlogloss,auc更适合二分类
                    num_class=num_of_classes, tree_method='gpu_hist', importance_type='gain')

# 扩展参数搜索空间,覆盖更多可能的最优值
params={
    "colsample_bytree": [0.7, 0.8, 0.9, 1.0],
    "gamma": [0, 0.1, 0.2, 0.3],
    "learning_rate": [0.05, 0.1, 0.2, 0.3],  # 扩大学习率的搜索范围
    "max_delta_step": [0, 1],
    "max_depth": [4, 5, 6, 7],
    "min_child_weight": [1, 2, 3],
    "n_jobs": [12],
    "subsample": [0.7, 0.8, 0.9, 1.0]
}

# 合理设置迭代次数,20次足够覆盖大部分有价值的参数组合
clf = RandomizedSearchCV(xgb, param_distributions=params, n_iter=20, scoring='accuracy', 
                         cv=10, verbose=3, random_state=42)
clf.fit(X_train, y_train)  # 仅用训练集进行调参,避免数据泄露

准确率计算部分

val = clf.predict(X_test)
# 直接计算多分类准确率,无需额外标签转换
acc = accuracy_score(y_test, val)
print(f"测试集准确率: {acc}")

额外优化建议

  • 多分类任务中,eval_metric优先选择mlogloss(多分类对数损失),用auc会导致模型优化方向偏离多分类任务的核心目标。
  • 调参时建议先从学习率、树深度这类影响较大的参数入手,逐步缩小搜索范围,不要一开始就限定死大部分参数的取值。
  • 对比不同模型的性能时,必须保证训练数据完全一致(均使用X_train,y_train),这样的准确率对比才有参考价值。

内容的提问来源于stack exchange,提问作者mvinegret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:32:48