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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:27:39