R语言移除高相关特征求助:处理rf1数据集时遇报错
移除高相关特征时出现"undefined columns selected"报错的解决方法
我有一个包含845个特征、1052行的数据集rf1,为开展机器学习需要移除高相关特征。我编写了如下代码,仅能展示特征及相关性,无法实现移除操作:
corr_simple<-function(rf1,sig=0.9) {df_cor <- rf1 %>% mutate_if(is.character, as.factor) df_cor <- df_cor %>% mutate_if(is.factor, as.numeric) corr<-cor(df_cor) corr[lower.tri(corr,diag=TRUE)] <- NA corr[corr == 1] <- NA corr <- as.data.frame(as.table(corr)) corr <- na.omit(corr) corr <- subset(corr, abs(Freq) > sig) corr <- corr[order(-abs(corr$Freq)),] print(corr) mtx_corr <- reshape2::acast(corr, Var1~Var2,value.var="Freq")} corr_simple(rf1)
尝试以0.9为阈值移除变量时,运行以下代码出现报错:
data<-data.frame(rf1) cor_matrix <- cor(data) cor_matrix_rm <- cor_matrix cor_matrix_rm[upper.tri(cor_matrix_rm)] <- 0 diag(cor_matrix_rm) <- 0 cor_matrix_rm data_new <- data[ , !apply(cor_matrix_rm, 2, function(x) any(x > 0.90))]
报错信息:
Error in [.data.frame(data, , !apply(cor_matrix_rm, 2, function(x) any(x > : undefined columns selected
问题原因
- 数据类型不统一:第一段代码将字符型转成因子再转数值,但第二段直接调用
cor(data),如果data中存在非数值型特征(如未转换的因子、字符),cor()会自动忽略这些列,导致cor_matrix的列数和原数据集列数不一致,最终选列时出现"undefined columns selected"。 - 高相关判断逻辑缺陷:原代码只判断了正相关(
x > 0.9),但负相关绝对值>0.9也属于高相关,且直接移除所有相关列的逻辑会导致过度删除。
解决方案
方案1:使用caret包的findCorrelation智能移除(推荐)
findCorrelation会自动识别并移除冗余的高相关特征,优先保留信息更丰富的特征,操作简单可靠:
# 先安装并加载caret包(如果未安装) # install.packages("caret") library(caret) library(dplyr) # 统一处理数据类型,确保所有特征为数值型 data_processed <- rf1 %>% mutate_if(is.character, as.factor) %>% mutate_if(is.factor, as.numeric) # 计算相关矩阵,处理缺失值 cor_matrix <- cor(data_processed, use = "complete.obs") # 找出需要移除的高相关特征索引(阈值0.9) high_cor_cols <- findCorrelation(cor_matrix, cutoff = 0.9, verbose = TRUE) # 移除高相关特征,得到新数据集 data_new <- data_processed[, -high_cor_cols]
方案2:手动修正矩阵处理逻辑
如果不想依赖caret包,可修正原代码的逻辑:
library(dplyr) # 统一转换数据类型 data_processed <- rf1 %>% mutate_if(is.character, as.factor) %>% mutate_if(is.factor, as.numeric) # 计算相关矩阵 cor_matrix <- cor(data_processed, use = "complete.obs") # 生成仅保留下三角的相关矩阵(避免重复判断) cor_matrix_rm <- cor_matrix cor_matrix_rm[upper.tri(cor_matrix_rm)] <- 0 diag(cor_matrix_rm) <- 0 # 找出所有与其他特征相关性绝对值>0.9的列 cols_to_remove <- apply(cor_matrix_rm, 2, function(x) any(abs(x) > 0.9)) # 移除高相关特征 data_new <- data_processed[, !cols_to_remove]
内容的提问来源于stack exchange,提问作者NDe
相关产品推荐
相关产品推荐

