3. 过滤式方法基础:方差阈值法 (VarianceThreshold) 原理与适用场景

方差阈值法是过滤式特征选择中最基础、最直观的方法。它不依赖任何模型,仅通过特征本身的统计属性——方差——来筛选特征。其核心逻辑是:如果一个特征的取值在所有样本中几乎不变(方差趋近于零),则该特征对区分样本几乎没有贡献,可以安全移除。

3.1 核心原理

方差衡量的是数据围绕均值的离散程度。对于特征 \( X \),其方差计算公式为:

Var(X) = (1 / (n - 1)) * Σ (xᵢ - μ)²

其中 \( n \) 为样本数,\( xᵢ \) 为第 \( i \) 个样本的特征值,\( μ \) 为该特征的均值。VarianceThreshold 会计算每个特征的方差,然后移除所有方差低于设定阈值的特征。

关键假设: 低方差特征 = 低信息量。该假设在特征取值离散且无异常值时成立,但在某些场景下(如二值特征中 99:1 的极不平衡分布)可能失效。

3.2 算法流程

方差阈值法的执行步骤非常简洁,通常包含以下四个阶段:

  1. 数据标准化(可选但推荐): 由于方差受量纲影响,建议先对数据进行标准化(如 StandardScaler),使所有特征处于同一尺度。
  2. 计算方差: 对每个特征独立计算方差值。
  3. 设定阈值: 用户指定一个方差阈值(如 0.01、0.1 或 0.8)。
  4. 过滤特征: 保留方差 ≥ 阈值的特征,移除方差 < 阈值的特征。
实践建议: 对于二值特征(取值 0/1),方差最大值为 0.25(当正负样本各占 50% 时)。因此,若二值特征方差接近 0,说明几乎全为同一值,可直接剔除。

3.3 适用场景与局限性

维度 说明
适用场景
  • 特征维度极高(如文本 TF-IDF 矩阵、基因表达数据),需要快速粗筛。
  • 存在大量稀疏或常数特征(如 One-Hot 编码后出现大量全零列)。
  • 作为预处理第一步,先移除明显无用的特征,再使用其他方法。
局限性
  • 完全忽略特征与目标变量的关系,可能误删与目标相关但方差小的特征。
  • 对量纲敏感,未标准化时方差大的特征不一定更重要。
  • 无法处理特征间的交互作用或冗余性。

3.4 方差阈值法工作流程

下图展示了从原始特征矩阵到筛选后特征子集的完整流程:

方差阈值法工作流程 原始特征矩阵 (n_samples × n_features) 标准化 (可选,消除量纲影响) 计算各特征方差 Var(X₁), Var(X₂), ... 方差 ≥ 阈值? 保留特征 移除特征 筛选后特征子集 阈值设定建议 二值特征: 0.01 连续特征: 0.1~0.5

3.5 代码实现示例

以下代码展示了如何使用 scikit-learn 中的 VarianceThreshold 进行特征筛选:

from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
import pandas as pd

# 加载示例数据
iris = load_iris()
X = iris.data
feature_names = iris.feature_names

# 创建 VarianceThreshold 对象,设置阈值为 0.1
selector = VarianceThreshold(threshold=0.1)

# 执行特征选择
X_selected = selector.fit_transform(X)

# 查看哪些特征被保留
selected_mask = selector.get_support()
selected_features = [feature_names[i] for i in range(len(feature_names)) if selected_mask[i]]
removed_features = [feature_names[i] for i in range(len(feature_names)) if not selected_mask[i]]

print("保留的特征:", selected_features)
print("移除的特征:", removed_features)
print("原始特征数:", X.shape[1])
print("筛选后特征数:", X_selected.shape[1])

3.6 方差阈值法的决策逻辑

下图展示了方差阈值法在特征空间中的决策边界,帮助理解低方差特征为何被移除:

方差阈值法的特征空间决策 高方差特征(保留) 样本分布分散,方差大 包含区分信息 低方差特征(移除) 样本分布集中,方差小 几乎无区分信息 阈值
注意: 方差阈值法仅适用于数值型特征。对于类别型特征,需要先进行数值编码(如 One-Hot 编码)后再使用。此外,阈值的选择需要结合具体数据分布,建议通过直方图观察方差分布后再确定。