使用unbalanced包欠采样平衡不平衡汽车数据集时遇报错求助
汽车数据集欠采样代码报错的修复方案
首先,你的代码里有几个关键问题导致报错,我来逐一拆解并给出修正方案:
1. 类别标签转换的语法错误
你当前写的levels(car$class)[1]<"0"是比较操作,根本没有完成类别标签的赋值修改。如果要把原有的4个类别(acc、good、unacc、vgood)重新编码为0-3的标识,正确写法如下:
# 先确认当前类别的水平顺序,避免赋值错位 print(levels(car$class)) # 直接重新赋值水平(确保顺序和原类别一一对应) levels(car$class) <- c("0", "1", "2", "3") # 若需要转成数值型,再执行这一步 car$class <- as.numeric(as.character(car$class))
如果你的目标是二分类不平衡处理(unbalanced包的ubUnder默认仅支持二分类),建议把类别合并为两类,比如把占比最高的"unacc"作为多数类,其余归为少数类:
car$class <- ifelse(car$class == "unacc", "0", "1") car$class <- as.factor(car$class) # 必须转成因子类型,ubUnder要求Y为因子
2. ubUnder函数参数不完整
你的代码里ubUnder(X=input_car, Y= outcome_car, perc = 40, me...是截断状态,缺少必要的method参数,而且perc的含义是少数类占多数类的百分比(比如perc=100就是让少数类数量和多数类完全一致)。完整的调用示例如下:
library(unbalanced) # 分离输入和输出变量,用ncol代替硬编码的7,适配数据集列数变化 input_car <- car[, -ncol(car)] outcome_car <- car$class # 执行欠采样,method可选"percUnder"(按百分比采样)或"random"(随机欠采样) balanced_result <- ubUnder( X = input_car, Y = outcome_car, perc = 100, # 设置为100实现完全平衡 method = "percUnder" ) # 合并得到平衡后的完整数据集 car_balanced <- cbind(balanced_result$X, class = balanced_result$Y)
3. 多分类不平衡的特殊处理
如果你的需求是保留4个类别的多分类平衡,ubUnder并不直接支持,这时可以考虑两种方案:
- 手动对每个类别进行欠采样,以数量最少的类别为基准,对其他类别随机剔除样本
- 使用支持多分类不平衡的工具包,比如
smotefamily或UBL
最后,验证平衡效果:
# 查看原数据集类别分布 table(car$class) # 查看平衡后的类别分布 table(car_balanced$class)
内容的提问来源于stack exchange,提问作者Fatima Mb
相关产品推荐
相关产品推荐

