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

XGBoost预测阶段真实标签异常篡改问题求助(附可复现代码)

多任务XGBoost分类中重采样导致真实标签错位的问题

问题描述

在多任务场景下运行XGBoost分类模型时,提取验证集和测试集的预测结果时发现真实标签(ground truth)出现错位:

  • 对比验证集预测结果与原数据第70-80行的真实标签,多处不一致
  • 已排查任务配置、数据拆分(无重叠、行数一致)、col_roles设置,均无异常
  • 定位到问题源于重采样环节,但即使将rowname列设为order角色仍无法解决
  • 运行完整可复现代码后,测试集预测结果中的0和1数量与原测试集差异显著

解决思路

1. 重采样时绑定完整样本行

重采样过程中必须保证每一行的特征、标签、原始索引始终绑定,禁止单独对特征或标签子集进行采样:

# 正确:对整个数据集行采样
resampled_data <- original_data[sample(nrow(original_data)), ]

# 错误:拆分后分别采样会导致标签错位
# resampled_features <- original_features[sample(nrow(original_features)), ]
# resampled_labels <- original_labels[sample(nrow(original_labels)), ]

2. 配置id角色替代order角色

如果使用mlr3这类框架,order角色仅控制排序逻辑,无法保证重采样时的样本唯一性关联。应将原始索引列设为id角色:

# 将rowname列添加为id角色
task$col_roles$id <- c(task$col_roles$id, "your_rowname_col")
# 移除该列的order角色(若无需排序)
task$col_roles$order <- setdiff(task$col_roles$order, "your_rowname_col")

3. 校验重采样前后的标签分布

重采样后立即对比标签分布,确认采样逻辑未引入偏差:

# 原始测试集标签分布
table(original_test$label)
# 重采样后测试集标签分布
table(resampled_test$label)

若分布差异显著,需检查重采样方法是否未按标签分层,或多任务下未按任务维度分层。

4. 通过原始索引对齐预测结果

预测完成后,不要依赖默认的结果顺序,通过原始索引将预测值与真实标签关联:

# 生成带原始索引的预测结果
predictions <- predict(model, newdata = test_data, keep.data = TRUE)
# 合并真实标签与预测结果
aligned_results <- merge(
  predictions[, c("your_rowname_col", "response")],
  test_data[, c("your_rowname_col", "label")],
  by = "your_rowname_col"
)

5. 修正重采样方法参数

若使用框架内置重采样函数,确保配置正确的分层维度:

# 单任务场景:按标签分层采样
resampling <- rsmp("stratified", stratify = "label")

# 多任务场景:按任务ID+标签分层采样
resampling <- rsmp("stratified", stratify = c("task_id", "label"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:58:13