如何基于parsnip生成的_xgb.Booster model_fit对象计算提升曲线与分位数提升图
计算XGBoost模型的提升曲线与十分位数提升图
没问题,我来帮你一步步搞定用parsnip生成的XGBoost模型计算提升曲线和十分位数提升图的事儿!
首先,我们需要先从你的model_fit对象里拿到预测概率,然后用工具包来生成对应的图表。下面给你两种常用的方法,一种是适配tidymodels生态的方案,另一种是用专门的lift包快速实现。
第一步:获取预测概率
不管用哪种方法,第一步都是要得到模型对样本的预测概率(针对二分类任务的正类)。因为你的xgb是parsnip的model_fit对象,直接用predict()函数加上type="prob"参数就能拿到:
# 针对训练集生成预测概率(更建议用测试集看泛化能力) train_probs <- predict(xgb, new_data = train, type = "prob") # 如果有测试集,同样操作 test_probs <- predict(xgb, new_data = test, type = "prob")
这里的结果是一个数据框,列名会是.pred_类别名,比如你的正类是"1"的话,列名就是.pred_1。
方法一:用tidymodels生态的yardstick包(推荐,和parsnip配套)
yardstick是tidymodels里专门做模型评估的包,和parsnip完美兼容,而且输出的结果很容易用ggplot2可视化。
生成提升曲线
library(yardstick) library(ggplot2) # 把真实标签和预测概率合并成一个数据框 train_lift_data <- train %>% select(Y) %>% # 取出真实标签列 bind_cols(train_probs) # 和预测概率合并 # 生成提升曲线的计算数据 lift_curve_data <- lift_curve( train_lift_data, truth = Y, # 真实标签列名 .pred_1 # 正类的预测概率列名,根据你的类别调整 ) # 绘制提升曲线 ggplot(lift_curve_data, aes(x = percentage, y = lift)) + geom_line(color = "#2c3e50", linewidth = 1) + geom_abline(slope = 1, intercept = 1, linetype = "dashed", color = "#e74c3c") + labs(title = "模型提升曲线", x = "样本占比(从高概率到低概率排序)", y = "提升值") + theme_minimal()
虚线代表随机模型的提升值(始终为1),你的模型曲线越往上,说明在对应样本比例下的识别能力越强。
生成十分位数提升图
十分位数提升图是把样本按预测概率从高到低分成10组,计算每组的提升值:
# 手动计算十分位数的提升数据 train_decile_data <- train_lift_data %>% # 按预测概率从高到低分成10个分位数组 mutate(decile = ntile(desc(.pred_1), 10)) %>% group_by(decile) %>% summarise( # 计算每组的真实正样本数,替换成你的正类标签(比如"1"或者TRUE) actual_pos = sum(Y == "1"), # 全局总正样本数 total_pos = sum(train$Y == "1"), # 计算提升值:组内正样本占比 / 全局正样本占比 lift_value = (actual_pos / n()) / (total_pos / nrow(train)) ) # 绘制十分位数提升图 ggplot(train_decile_data, aes(x = factor(decile), y = lift_value)) + geom_col(fill = "#3498db", alpha = 0.8) + geom_hline(yintercept = 1, linetype = "dashed", color = "#e74c3c") + labs(title = "十分位数提升图", x = "分位数组(1组=最高预测概率)", y = "提升值") + theme_minimal()
方法二:用专门的lift包快速实现
如果你想要更快捷的方式,可以用lift包,它直接提供了生成提升曲线和分位数图的函数:
library(lift) # 准备数据:真实标签 + 预测概率 lift_input <- data.frame( actual = train$Y, predicted = train_probs$.pred_1 ) # 生成lift对象 lift_obj <- lift(lift_input) # 绘制提升曲线 plot(lift_obj, main = "模型提升曲线", col = "blue", lwd = 2) # 添加随机模型参考线 abline(a = 1, b = 0, lty = 2, col = "red") # 绘制十分位数提升图 lift_chart(lift_obj, main = "十分位数提升图", col = "steelblue")
注意事项
- 优先用测试集计算提升指标,这样能反映模型在 unseen data 上的真实表现,避免过拟合的干扰。
- 如果你的分类标签是因子类型,要确保正类的顺序正确,或者在
lift_curve()里用event_level="second"来指定正类。
内容的提问来源于stack exchange,提问作者Geet
相关产品推荐
相关产品推荐

