3. 过滤式方法基础:方差阈值法 (VarianceThreshold) 原理与适用场景
方差阈值法是过滤式特征选择中最基础、最直观的方法。它不依赖任何模型,仅通过特征本身的统计属性——方差——来筛选特征。其核心逻辑是:如果一个特征的取值在所有样本中几乎不变(方差趋近于零),则该特征对区分样本几乎没有贡献,可以安全移除。
3.1 核心原理
方差衡量的是数据围绕均值的离散程度。对于特征 \( X \),其方差计算公式为:
Var(X) = (1 / (n - 1)) * Σ (xᵢ - μ)²
其中 \( n \) 为样本数,\( xᵢ \) 为第 \( i \) 个样本的特征值,\( μ \) 为该特征的均值。VarianceThreshold 会计算每个特征的方差,然后移除所有方差低于设定阈值的特征。
关键假设: 低方差特征 = 低信息量。该假设在特征取值离散且无异常值时成立,但在某些场景下(如二值特征中 99:1 的极不平衡分布)可能失效。
3.2 算法流程
方差阈值法的执行步骤非常简洁,通常包含以下四个阶段:
- 数据标准化(可选但推荐): 由于方差受量纲影响,建议先对数据进行标准化(如 StandardScaler),使所有特征处于同一尺度。
- 计算方差: 对每个特征独立计算方差值。
- 设定阈值: 用户指定一个方差阈值(如 0.01、0.1 或 0.8)。
- 过滤特征: 保留方差 ≥ 阈值的特征,移除方差 < 阈值的特征。
实践建议: 对于二值特征(取值 0/1),方差最大值为 0.25(当正负样本各占 50% 时)。因此,若二值特征方差接近 0,说明几乎全为同一值,可直接剔除。
3.3 适用场景与局限性
| 维度 | 说明 |
|---|---|
| 适用场景 |
|
| 局限性 |
|
3.4 方差阈值法工作流程
下图展示了从原始特征矩阵到筛选后特征子集的完整流程:
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 编码)后再使用。此外,阈值的选择需要结合具体数据分布,建议通过直方图观察方差分布后再确定。