机器学习特征选择:深入理解移除低方差特征与sklearn的VarianceThreshold
- 引言:为什么特征选择如此重要?
- 一、低方差特征为什么需要移除?
-
- [1.1 低方差特征的问题](#1.1 低方差特征的问题)
- [1.2 低方差特征的典型场景](#1.2 低方差特征的典型场景)
- [1.3 数学表达](#1.3 数学表达)
- 二、sklearn的VarianceThreshold详解
-
- [2.1 基本用法](#2.1 基本用法)
- [2.2 关键参数说明](#2.2 关键参数说明)
- [2.3 重要属性](#2.3 重要属性)
- 三、实战案例:电商用户行为分析
-
- [3.1 数据集描述](#3.1 数据集描述)
- [3.2 应用VarianceThreshold](#3.2 应用VarianceThreshold)
- [3.3 结果分析](#3.3 结果分析)
- 四、进阶技巧与注意事项
-
- [4.1 数据标准化的重要性](#4.1 数据标准化的重要性)
- [4.2 与其它特征选择方法的结合](#4.2 与其它特征选择方法的结合)
- [4.3 阈值选择的经验法则](#4.3 阈值选择的经验法则)
- 五、可视化分析
-
- [5.1 特征方差分布图](#5.1 特征方差分布图)
- [5.2 特征相关性矩阵(筛选前后对比)](#5.2 特征相关性矩阵(筛选前后对比))
- 六、总结与最佳实践
-
- [6.1 关键要点](#6.1 关键要点)
- [6.2 推荐工作流程](#6.2 推荐工作流程)
- [6.3 常见误区](#6.3 常见误区)
引言:为什么特征选择如此重要?
在机器学习项目中,特征工程是决定模型性能的关键因素之一。特征选择作为特征工程的核心环节,能够帮助我们:
- 减少维度灾难风险
- 提高模型训练效率
- 降低过拟合可能性
- 增强模型可解释性
今天,我们将重点探讨一种简单但非常有效的特征选择方法------移除低方差特征 ,以及其在sklearn中的实现------VarianceThreshold。
一、低方差特征为什么需要移除?
1.1 低方差特征的问题
低方差特征指的是那些在数据集中取值几乎不变的特征。这类特征通常表现为:
- 所有样本的取值完全相同(方差为0)
- 取值仅有微小波动(接近0的方差)
特征
高方差特征
低方差特征
对模型有区分价值
对模型无区分价值
可能引入噪声
1.2 低方差特征的典型场景
- 数据收集问题:传感器故障导致采集的值不变
- 数据预处理问题:错误的填充导致特征值单一化
- 业务特性:某些属性在特定数据集中确实无变化
1.3 数学表达
方差公式:
σ 2 = 1 n ∑ i = 1 n ( x i − μ ) 2 \sigma^2 = \frac{1}{n}\sum_{i=1}^n (x_i - \mu)^2 σ2=n1i=1∑n(xi−μ)2
其中:
- σ 2 \sigma^2 σ2:方差
- n n n:样本数量
- x i x_i xi:第i个样本的特征值
- μ \mu μ:特征均值
二、sklearn的VarianceThreshold详解
2.1 基本用法
python
from sklearn.feature_selection import VarianceThreshold
# 创建转换器,默认threshold=0(移除方差为0的特征)
selector = VarianceThreshold(threshold=0.1)
# 拟合和转换数据
X_new = selector.fit_transform(X)
2.2 关键参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
| threshold | 方差阈值,低于此值的特征将被移除 | 0 |
2.3 重要属性
| 属性 | 说明 |
|---|---|
| variances_ | 各特征的方差 |
| n_features_in_ | 输入特征数量 |
| feature_names_in_ | 输入特征名称 |
三、实战案例:电商用户行为分析
3.1 数据集描述
我们模拟一个电商用户行为数据集,包含以下特征:
- 用户ID(唯一值,方差极高)
- 年龄(有一定分布)
- 性别编码(0/1,方差适中)
- 是否会员(大部分是会员,方差低)
- 最近登录城市(某些城市样本极少)
3.2 应用VarianceThreshold
python
import pandas as pd
from sklearn.feature_selection import VarianceThreshold
# 模拟数据
data = {
'user_id': range(1000),
'age': np.random.normal(30, 5, 1000),
'gender': np.random.randint(0, 2, 1000),
'is_vip': [1]*950 + [0]*50,
'city': ['BJ']*800 + ['SH']*150 + ['GZ']*50
}
df = pd.DataFrame(data)
X = pd.get_dummies(df) # 处理分类变量
# 应用特征选择
selector = VarianceThreshold(threshold=0.01)
X_new = selector.fit_transform(X)
print(f"原始特征数: {X.shape[1]}")
print(f"筛选后特征数: {X_new.shape[1]}")
3.3 结果分析
原始特征数: 6
筛选后特征数: 3
被移除的特征:
- is_vip(方差过低)
- city_GZ(出现频率过低)
- user_id(虽然方差高,但对模型无意义)
四、进阶技巧与注意事项
4.1 数据标准化的重要性
在使用VarianceThreshold前,必须考虑数据标准化:
原始数据
标准化
VarianceThreshold
有效特征选择
4.2 与其它特征选择方法的结合
推荐的工作流程:
- 首先移除低方差特征
- 然后使用统计方法(如卡方检验)
- 最后使用模型相关方法(如基于重要性的选择)
4.3 阈值选择的经验法则
| 数据类型 | 建议阈值 |
|---|---|
| 二值特征 | 0.1-0.2 |
| 连续特征 | 数据标准差的10% |
| 分类特征 | 根据类别分布调整 |
五、可视化分析
5.1 特征方差分布图
python
import matplotlib.pyplot as plt
variances = selector.variances_
plt.figure(figsize=(10, 6))
plt.bar(range(len(variances)), variances)
plt.axhline(y=0.1, color='r', linestyle='--')
plt.title('Feature Variances')
plt.xlabel('Feature Index')
plt.ylabel('Variance')
plt.show()
5.2 特征相关性矩阵(筛选前后对比)
高维
低维
筛选前
相关性矩阵混乱
筛选后
清晰的相关性模式
六、总结与最佳实践
6.1 关键要点
- 低方差特征通常对模型预测无贡献,应优先考虑移除
- VarianceThreshold是无监督方法,不依赖目标变量
- 阈值选择需要结合业务理解 和数据特性
6.2 推荐工作流程
- 数据预处理 → 2. 探索性分析 → 3. 移除低方差特征 → 4. 其他特征选择
6.3 常见误区
- 忽略数据标准化导致错误判断
- 过度依赖自动阈值而缺乏业务验证
- 在时间序列数据中直接应用(需要考虑时间维度)

通过合理使用VarianceThreshold,我们可以在机器学习项目中显著提高特征质量,为后续建模打下坚实基础。记住:好的特征工程是成功模型的一半!