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

归一化数据后使用low variance filter做特征筛选的R语言实现疑问

核心问题说明

你使用的scale()函数本质是Z-score标准化,会强制把每列的数值缩放为均值为0、方差为1的分布,自然会出现所有列方差一致的问题,完全不适合用于低方差过滤前的预处理。你需要改用min-max归一化将所有数值列的取值范围统一到[0,1]区间,此时计算的方差才具备跨列可比性。

R语言低方差过滤完整实现

前置处理:先剔除无效列

首先直接剔除方差为0的列(整列取值完全一致,无任何区分度),同时过滤非数值列:

# 假设你的原始数据集命名为df
# 筛选数值列
numeric_cols <- sapply(df, is.numeric)
df_numeric <- df[, numeric_cols]

# 剔除方差为0的列
col_var_raw <- apply(df_numeric, 2, var, na.rm = TRUE)
df_numeric <- df_numeric[, col_var_raw > 0]

步骤1:实现min-max归一化

自定义归一化函数,将每列数值缩放到[0,1]区间:

min_max_norm <- function(x) {
  (x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE))
}

# 对数值列做归一化
df_norm <- as.data.frame(lapply(df_numeric, min_max_norm))

步骤2:低方差过滤

设置方差阈值(常用阈值为0.01,可根据业务需求调整),筛选符合要求的特征:

# 计算归一化后各列的方差
col_var_norm <- apply(df_norm, 2, var, na.rm = TRUE)

# 设置阈值,保留方差大于阈值的列
variance_threshold <- 0.01
keep_cols <- names(col_var_norm)[col_var_norm > variance_threshold]

# 得到最终过滤后的数据集
df_filtered <- df[, keep_cols]
注意事项
  • 若数据集存在缺失值,可根据场景先做缺失值填充再运行上述代码,避免na.rm = TRUE对方差计算结果的干扰
  • 分类特征、ID列、时间列等非数值特征无需参与方差计算,可在预处理阶段单独拆分处理
  • 阈值没有统一标准:如果需要保留更多特征可降低阈值到0.005,若需要更严格的降维可提升阈值到0.05

内容的提问来源于stack exchange,提问作者RofyRafy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:09:04