使用R语言ROSE包处理德国信用风险不平衡数据集时预测变量被修改的求助
处理German Credit Risk数据集不平衡问题时ROSE包修改预测变量的解决方案
问题本质
ROSE包的核心逻辑是生成合成样本——它会基于原始数据的特征分布,对预测变量进行调整来构建新的平衡数据集,所以你看到预测变量被修改是该包的正常行为。如果你的需求是保留原始预测变量的分布,仅调整目标变量的样本比例,ROSE并非最优选择。
替代解决方案
1. 过采样:SMOTE算法
SMOTE针对少数类样本,基于其近邻生成新的合成样本,不会改动原始多数类的预测变量:
# 加载依赖包 library(DMwR) library(caret) # 确保目标变量为因子类型 ds$CreditStatus <- as.factor(ds$CreditStatus) # 生成平衡数据集 set.seed(1) ds_balanced <- SMOTE(CreditStatus ~ ., data = ds, perc.over = 200, perc.under = 150)
perc.over:少数类过采样比例(200代表每个少数类样本生成2个新样本)perc.under:多数类欠采样比例(150代表为每个新生成的少数类样本,从多数类中选取1.5个样本)
2. 欠采样:随机裁剪多数类样本
若数据集规模足够大,可直接随机删除多数类样本,完全保留原始特征分布:
set.seed(1) # 分离少数类与多数类样本 minority <- subset(ds, CreditStatus == levels(ds$CreditStatus)[2]) majority <- subset(ds, CreditStatus == levels(ds$CreditStatus)[1]) # 抽取与少数类数量匹配的多数类样本 majority_sampled <- majority[sample(nrow(majority), nrow(minority)), ] # 合并得到平衡数据集 ds_balanced <- rbind(minority, majority_sampled)
3. 不修改数据:使用对不平衡鲁棒的模型
如果不想改动原始数据集,可直接采用适配不平衡场景的模型:
- 加权模型:给少数类样本赋予更高权重,以抵消数量劣势
# 计算权重:少数类权重为多数类样本数/少数类样本数,多数类权重为1 weight <- ifelse(ds$CreditStatus == levels(ds$CreditStatus)[2], nrow(subset(ds, CreditStatus == levels(ds$CreditStatus)[1]))/nrow(subset(ds, CreditStatus == levels(ds$CreditStatus)[2])), 1) # 训练加权逻辑回归模型 model <- glm(CreditStatus ~ ., data = ds, weights = weight, family = binomial)
- 树模型:XGBoost、LightGBM等内置
scale_pos_weight参数,可直接适配不平衡数据
平衡效果验证
处理完成后,可通过以下代码确认目标变量的分布:
table(ds_balanced$CreditStatus)
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

