如何基于训练集分箱区间自动划分验证集样本分组?
基于训练组分组区间划分验证集score的实现方案
核心逻辑
从训练组生成的groups矩阵列名中解析分位数区间规则,再将验证集的score_val逐一匹配到对应区间,生成与训练组结构一致的分组矩阵。
具体步骤(R语言,适配GenericML包场景)
1. 解析训练组的区间规则
先从groups的列名中提取每个分组对应的数值上下限:
# 获取训练组分组的列名 group_cols <- colnames(groups) # 解析每个列名的区间边界 interval_list <- lapply(group_cols, function(col) { # 剔除括号符号,分割出上下限字符串 bounds <- gsub("\\[|\\)|\\]", "", col) %>% strsplit(", ") %>% unlist() list( lower = as.numeric(bounds[1]), upper = as.numeric(bounds[2]), group_name = col ) })
2. 匹配验证集score到对应分组
初始化验证组分组矩阵,遍历每个score值匹配区间:
# 创建空的验证组分组矩阵 groups_val <- matrix(0, nrow = length(score_val), ncol = length(group_cols)) colnames(groups_val) <- group_cols # 逐个匹配score值 for (i in seq_along(score_val)) { current_score <- score_val[i] # 找到符合条件的区间索引 match_pos <- which(sapply(interval_list, function(interval) { current_score >= interval$lower & current_score < interval$upper })) # 处理刚好等于最大上限的特殊情况(如score=1.0) if (length(match_pos) == 0) { match_pos <- which(sapply(interval_list, function(interval) { interval$upper == max(sapply(interval_list, function(x) x$upper)) })) } # 标记对应分组 groups_val[i, match_pos] <- 1 }
3. 验证分组正确性
随机抽取样本检查匹配结果:
# 随机选5个样本验证 check_idx <- sample(length(score_val), 5) cbind(score_val[check_idx], groups_val[check_idx, ])
关键注意点
- 必须保证训练集和验证集的score是用同一scoring rule生成的,否则区间匹配无效。
- 区间的开闭逻辑要和
quantile_group函数的参数保持一致(比如是否包含上限)。 - 若
groups是因子类型,需先转换为列名再解析区间。
内容的提问来源于stack exchange,提问作者riccardo-df
相关产品推荐
相关产品推荐

