如何在caret中切换XGBoost模型的结果变量因子水平?
在Caret(xgbTree)中切换XGBoost模型的目标因子水平
要解决SHAP结果与领域知识倒置的问题,核心是让模型将「Yes(癌症存在)」作为目标类别,以下是两种可行方法:
方法1:调整结果变量的因子水平顺序
Caret默认将因子的第二个水平视为正类(模型会输出该类的预测概率)。只需把「Yes」设为因子的第二个水平即可:
# 重新定义结果变量的因子水平,No在前,Yes在后 data$cancer <- factor(data$cancer, levels = c("No", "Yes"))
重新训练模型后,XGBoost会以「Yes」为目标类别,特征与癌症的关联关系会符合预期。
方法2:在训练控制参数中指定正类
如果不想修改原始数据的因子顺序,可在trainControl中通过positive参数直接指定正类:
# 配置训练控制参数,指定正类为"Yes" ctrl <- trainControl( method = "cv", # 替换为你实际使用的验证方法 positive = "Yes" ) # 训练模型时传入控制参数 xgb_model <- train( x = your_predictors, # 你的特征数据集 y = data$cancer, # 原始结果因子变量 method = "xgbTree", trControl = ctrl, # 其他调参参数如tuneGrid等按需设置 )
验证调整效果
训练完成后,可通过输出预测概率确认是否生效:
# 输出测试集的类别概率 pred_probs <- predict(xgb_model, newdata = test_data, type = "prob") head(pred_probs)
若「Yes」列的概率随年龄增加而上升,说明调整成功。此时重新计算SHAP值,绘制的蜂群图、依赖图就会与领域知识一致。
注意:调整后必须重新训练模型,基于旧模型的SHAP结果不会自动更新。
内容的提问来源于stack exchange,提问作者Salman Khan
相关产品推荐
相关产品推荐

