机器学习核心:特征选择(超通俗完整版)

特征选择 = 从一堆特征里,挑出最有用、不冗余、能让模型又快又准的关键特征,是数据预处理必做步骤,本科/研究生面试、论文、项目都高频用到。


一、先搞懂:什么是特征?什么是特征选择?

1. 特征是什么?

用来描述一个样本的属性/变量

  • 预测房价:面积、房间数、地段、年份
  • 预测疾病:年龄、血压、血糖、肿瘤大小
  • 预测用户购买:性别、收入、浏览记录、消费频次

2. 特征选择是什么?

从全部特征里,筛选出对预测目标最有价值的子集。

  • 去掉没用的噪声特征
  • 去掉高度重复的冗余特征
  • 保留关键、高区分度的特征

3. 为什么一定要做特征选择?

  1. 降维提速:特征越少,模型训练越快、占用资源越少
  2. 提升精度:去掉干扰项,模型更专注真实规律
  3. 防止过拟合:避免模型“死记硬背”训练数据
  4. 可解释性更强:知道模型到底靠什么做判断

二、3大类特征选择方法(最核心!)

所有特征选择都归为三类:Filter、Wrapper、Embedded


🔹 1. Filter 过滤法(最快、最简单、不依赖模型)

核心思想

先筛选特征,再训练模型,完全独立于模型,靠统计指标打分。

常用方法

  1. 方差选择:方差接近0 → 全样本几乎一样 → 没用,直接删
  2. 皮尔逊相关系数:看特征与标签的线性相关程度
  3. 互信息(MI):看特征给标签带来多少信息量(非线性也能测)
  4. 卡方检验 / F检验:分类任务常用,衡量相关性

优点

  • 速度极快
  • 通用、不挑模型
  • 适合高维数据粗筛

缺点

  • 不考虑特征之间互相影响
  • 可能保留冗余特征

🔹 2. Wrapper 包装法(最准、最贴合模型)

核心思想

把特征选择当成“试错”:用模型性能直接评价一组特征好不好。

代表算法:RFE 递归特征消除

  1. 用全部特征训练模型
  2. 删掉最不重要的特征
  3. 重复训练→删除→直到保留指定数量

优点

  • 考虑特征组合效果
  • 选出的特征最贴合你的模型
  • 效果通常最好

缺点

  • 非常慢
  • 容易过拟合
  • 高维数据扛不住

🔹 3. Embedded 嵌入法(训练时自动选,兼顾速度与效果)

核心思想

特征选择 + 模型训练 一起做,模型自带筛选能力。

常用方法

  1. L1正则(Lasso):自动把不重要特征的权重压为0
  2. 树模型重要性:决策树、随机森林、XGBoost自带特征重要度
  3. 深度学习权重:靠网络权重自动筛选

优点

  • 速度快、效率高
  • 不易过拟合
  • 工业界最常用

缺点

  • 依赖模型本身
  • 线性模型对非线性关系筛选较弱

三、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

七、特征选择常见误区

  1. 特征越多越好
    冗余+噪声 → 过拟合 → 精度下降

  2. 只看单个特征相关性
    要考虑组合与冗余

  3. 训练集筛选完直接用
    必须先分训练集/测试集,只在训练集上做筛选

  4. 归一化/标准化可以省
    线性模型、Lasso、RFE 都对尺度敏感,必须先缩放


八、总结(面试/论文万能背诵版)

  1. 特征选择 = 去噪、去冗余、保关键
  2. 三大流派:Filter(快)、Wrapper(准)、Embedded(稳)
  3. 常规项目首选 Embedded(Lasso / 树重要性)
  4. 高维粗筛用 Filter
  5. 小数据、高精度用 Wrapper(RFE)
  6. 先划分数据集 → 再做特征选择 → 最后训练模型
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐