特征选择(超通俗完整版)
·
机器学习核心:特征选择(超通俗完整版)
特征选择 = 从一堆特征里,挑出最有用、不冗余、能让模型又快又准的关键特征,是数据预处理必做步骤,本科/研究生面试、论文、项目都高频用到。
一、先搞懂:什么是特征?什么是特征选择?
1. 特征是什么?
用来描述一个样本的属性/变量。
- 预测房价:面积、房间数、地段、年份
- 预测疾病:年龄、血压、血糖、肿瘤大小
- 预测用户购买:性别、收入、浏览记录、消费频次
2. 特征选择是什么?
从全部特征里,筛选出对预测目标最有价值的子集。
- 去掉没用的噪声特征
- 去掉高度重复的冗余特征
- 保留关键、高区分度的特征
3. 为什么一定要做特征选择?
- 降维提速:特征越少,模型训练越快、占用资源越少
- 提升精度:去掉干扰项,模型更专注真实规律
- 防止过拟合:避免模型“死记硬背”训练数据
- 可解释性更强:知道模型到底靠什么做判断
二、3大类特征选择方法(最核心!)
所有特征选择都归为三类:Filter、Wrapper、Embedded。
🔹 1. Filter 过滤法(最快、最简单、不依赖模型)
核心思想
先筛选特征,再训练模型,完全独立于模型,靠统计指标打分。
常用方法
- 方差选择:方差接近0 → 全样本几乎一样 → 没用,直接删
- 皮尔逊相关系数:看特征与标签的线性相关程度
- 互信息(MI):看特征给标签带来多少信息量(非线性也能测)
- 卡方检验 / F检验:分类任务常用,衡量相关性
优点
- 速度极快
- 通用、不挑模型
- 适合高维数据粗筛
缺点
- 不考虑特征之间互相影响
- 可能保留冗余特征
🔹 2. Wrapper 包装法(最准、最贴合模型)
核心思想
把特征选择当成“试错”:用模型性能直接评价一组特征好不好。
代表算法:RFE 递归特征消除
- 用全部特征训练模型
- 删掉最不重要的特征
- 重复训练→删除→直到保留指定数量
优点
- 考虑特征组合效果
- 选出的特征最贴合你的模型
- 效果通常最好
缺点
- 非常慢
- 容易过拟合
- 高维数据扛不住
🔹 3. Embedded 嵌入法(训练时自动选,兼顾速度与效果)
核心思想
特征选择 + 模型训练 一起做,模型自带筛选能力。
常用方法
- L1正则(Lasso):自动把不重要特征的权重压为0
- 树模型重要性:决策树、随机森林、XGBoost自带特征重要度
- 深度学习权重:靠网络权重自动筛选
优点
- 速度快、效率高
- 不易过拟合
- 工业界最常用
缺点
- 依赖模型本身
- 线性模型对非线性关系筛选较弱
三、3大类方法一张表看懂
| 类型 | 代表方法 | 是否依赖模型 | 速度 | 效果 | 适用场景 |
|---|---|---|---|---|---|
| Filter | 互信息、相关系数、方差 | ❌ 不依赖 | ⚡ 最快 | ⭐⭐ | 高维粗筛、快速预处理 |
| Wrapper | RFE递归消除 | ✅ 强依赖 | 🐢 最慢 | ⭐⭐⭐⭐⭐ | 特征少、追求极致精度 |
| Embedded | Lasso、树模型重要性 | ✅ 依赖 | ⚡⚡ 快 | ⭐⭐⭐⭐ | 工业项目、常规建模首选 |
四、必须掌握的5个核心指标(通俗解释)
1. 方差 Variance
- 含义:数据波动大不大
- 规则:方差≈0 → 全一样 → 删掉
2. 皮尔逊相关系数
- 范围:[-1,1]
- 越接近±1 → 线性相关性越强
3. 互信息 Mutual Information
- 含义:特征能给标签带来多少信息量
- 优点:能捕捉非线性关系
4. mRMR(最小冗余最大相关)
- 既要和标签相关
- 又要特征之间不重复
5. L1正则(Lasso)
- 自动把不重要特征权重变0
- 自带“特征筛选”功能
五、完整实战代码(乳腺癌数据集)
可直接复制运行,包含:
数据加载 → 可视化 → 3种特征选择 → 模型对比
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, mutual_info_classif, RFE
from sklearn.linear_model import LogisticRegression, LassoCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, roc_auc_score
# 加载数据
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# ======================
# 1. Filter 法:互信息
# ======================
mi_selector = SelectKBest(score_func=mutual_info_classif, k=10)
X_mi = mi_selector.fit_transform(X_scaled, y)
mi_selected = X.columns[mi_selector.get_support()]
# 可视化得分
mi_scores = mi_selector.scores_
mi_df = pd.DataFrame({'Feature': X.columns, 'Score': mi_scores})
mi_df = mi_df.sort_values('Score', ascending=False).head(15)
plt.figure(figsize=(10,5))
sns.barplot(x='Score', y='Feature', data=mi_df)
plt.title('Top 15 互信息得分')
plt.show()
# ======================
# 2. Wrapper 法:RFE
# ======================
model = LogisticRegression(max_iter=5000)
rfe = RFE(estimator=model, n_features_to_select=10)
X_rfe = rfe.fit_transform(X_scaled, y)
rfe_selected = X.columns[rfe.support_]
# ======================
# 3. Embedded 法:Lasso
# ======================
lasso = LassoCV(cv=5)
lasso.fit(X_scaled, y)
lasso_selected = X.columns[lasso.coef_ != 0]
# ======================
# 模型效果对比
# ======================
def test_features(features, name):
X_sub = X_scaled[:, [X.columns.get_loc(f) for f in features]]
X_train, X_test, y_train, y_test = train_test_split(
X_sub, y, test_size=0.3, random_state=42
)
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
acc = accuracy_score(y_test, clf.predict(X_test))
auc = roc_auc_score(y_test, clf.predict_proba(X_test)[:,1])
print(f"[{name}] 准确率={acc:.4f} AUC={auc:.4f}")
print("\n===== 特征选择效果对比 =====")
test_features(X.columns, "全部特征")
test_features(mi_selected, "Filter(互信息)")
test_features(rfe_selected, "Wrapper(RFE)")
test_features(lasso_selected, "Embedded(Lasso)")
六、哪些模型特别需要特征选择?
✅ 必须做
- KNN、SVM、K-Means(距离敏感)
- 线性回归、逻辑回归
- 神经网络、PCA
✅ 自带筛选(可做可不做)
- 决策树、随机森林、XGBoost、LightGBM
七、特征选择常见误区
-
特征越多越好 ❌
冗余+噪声 → 过拟合 → 精度下降 -
只看单个特征相关性 ❌
要考虑组合与冗余 -
训练集筛选完直接用 ❌
必须先分训练集/测试集,只在训练集上做筛选 -
归一化/标准化可以省 ❌
线性模型、Lasso、RFE 都对尺度敏感,必须先缩放
八、总结(面试/论文万能背诵版)
- 特征选择 = 去噪、去冗余、保关键
- 三大流派:Filter(快)、Wrapper(准)、Embedded(稳)
- 常规项目首选 Embedded(Lasso / 树重要性)
- 高维粗筛用 Filter
- 小数据、高精度用 Wrapper(RFE)
- 先划分数据集 → 再做特征选择 → 最后训练模型
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)