在R语言中使用SMOTE算法时出现invalid 'labels'报错如何解决?
报错原因
- 该报错并非来自target列,问题出在数据集的特征列中存在零方差因子变量:即某一列的所有样本取值完全一致,只存在1个因子水平。SMOTE算法生成合成样本时,需要基于原特征的因子水平给新样本赋值,当遇到只有1个水平的因子特征时,内部的水平匹配逻辑出错,就会触发labels长度不匹配的报错。
- 前期出现的「NAs introduced by coercion」警告也对应这个问题:SMOTE在处理特征类型转换时,无法正常识别零方差特征的取值范围,强制类型转换后生成了缺失值。
解决方法
- 先过滤数据集中的零方差特征,再执行SMOTE操作,示例代码如下:
# 没有安装caret包先执行 install.packages("caret") library(caret) # 识别所有零方差特征 zero_var_info <- nearZeroVar(dataset, saveMetrics = TRUE) # 剔除零方差特征 dataset <- dataset[, !zero_var_info$zeroVar]
- 重新运行SMOTE代码,同时注意target列转数值的写法:原代码直接对因子执行
as.numeric会把原本的0/1转为1/2,需要先转成字符再转数值
library(DMwR) dataset$target <- as.factor(dataset$target) dataset <- SMOTE(target ~ ., dataset, perc.over = 100, perc.under = 200) # 修正target转数值的写法 dataset$target <- as.numeric(as.character(dataset$target))
内容的提问来源于stack exchange,提问作者user1758952
相关产品推荐
相关产品推荐

