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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:22:33