R 4版本下实现类别不平衡数据过采样的方法咨询
R 4版本过采样实现方法
旧版unbalanced包的ubBalance函数已经长期未维护,在R4环境下很容易出现依赖报错、运行异常的问题,以下是几个适配R4版本、操作简便的过采样方案:
1. 用caret包实现快速随机过采样
caret是目前R机器学习领域通用的预处理包,内置的upSample函数开箱即用,不需要复杂配置:
- 安装加载包(首次使用需安装)
install.packages("caret") library(caret)
- 执行过采样
# 传入特征列和标签列,自动对少数类做有放回抽样平衡类别 df_balanced <- upSample( x = df[, c("x1", "x2")], y = df$y, yname = "y" ) # 校验平衡后的类别分布 table(df_balanced$y)
运行后得到的数据集里Yes和No类各90条,直接满足类别平衡要求。
2. 用themis包实现SMOTE等高级过采样
如果觉得随机过采样容易过拟合,需要用SMOTE、ADASYN这类合成少数类样本的算法,可以选themis包,属于tidymodels生态,维护活跃适配R4全版本:
- 安装加载
install.packages("themis") library(themis)
- SMOTE过采样示例
df_smote <- smote(df, y ~ ., over_ratio = 1) table(df_smote$y)
参数over_ratio控制采样后少数类和多数类的样本量比例,设为1就是完全平衡,设为0.5就是少数类样本量为多数类的一半,可以根据建模需求调整。
3. 无依赖手动实现随机过采样
如果不想额外安装第三方包,用基础R代码几行就能实现随机过采样:
# 拆分多数类、少数类样本 major <- df[df$y == "Yes", ] minor <- df[df$y == "No", ] # 对少数类做有放回抽样,样本量对齐多数类 minor_over <- minor[sample(nrow(minor), nrow(major), replace = T), ] # 合并得到平衡数据集 df_manual <- rbind(major, minor_over) table(df_manual$y)
提示:如果数据集本身样本量很小,随机过采样会因为重复采样提升过拟合风险,这种场景优先选SMOTE类的合成采样方法。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

