归一化数据后使用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
相关产品推荐
相关产品推荐

