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

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

问题原因

  1. 数据类型不统一:第一段代码将字符型转成因子再转数值,但第二段直接调用cor(data),如果data中存在非数值型特征(如未转换的因子、字符),cor()会自动忽略这些列,导致cor_matrix的列数和原数据集列数不一致,最终选列时出现"undefined columns selected"。
  2. 高相关判断逻辑缺陷:原代码只判断了正相关(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 06:45:30