特征选择核心方法:嵌入法(Embedded)|原理+代码+可视化全攻略
嵌入法是机器学习里最高效、最常用、最适合论文与工程 的特征选择方式。它把特征选择直接嵌在模型训练里,一边训练一边自动筛选,不用单独跑特征筛选流程,速度快、效果稳。
一、什么是嵌入法?一句话看懂
嵌入法 = 训练模型时自动做特征选择,一步到位。
它不像过滤法(先筛选再训练)、包裹法(反复训练筛选),而是:
- 模型训练
- 特征打分
- 特征筛选
三件事同时完成。
二、最通俗的比喻:边学边划重点
你在复习考试:
- 过滤法:先划重点 → 再背书
- 包裹法:背一遍 → 划重点 → 再背一遍
- 嵌入法 :边背书边自动划重点
嵌入法就是模型自带特征筛选功能,训练完直接告诉你:哪些特征有用。
三、嵌入法靠什么实现?(两大核心)
嵌入法主要依靠正则化(Regularization)实现:
- L1 正则化(Lasso) → 直接把不重要特征的权重变成 0(真正删除)
- L2 正则化(Ridge) → 把不重要特征权重压缩变小(不删但减弱)
另外树模型(随机森林、XGBoost)也属于嵌入法。
四、嵌入法的 4 大优势(必背)
- 一步到位:训练 + 筛选同时完成
- 速度快:不用反复训练模型
- 减少过拟合:正则化本身就是防过拟合
- 高维数据友好:特征几百上千也能跑
五、核心公式(简单看懂)
1. Lasso(L1)嵌入法公式
Loss=MSE+λ∑∣w∣ Loss = MSE + \lambda \sum|w| Loss=MSE+λ∑∣w∣
- 后面那项就是惩罚
- λ 越大 → 惩罚越强 → 越多特征权重变 0
2. Ridge(L2)嵌入法公式
Loss=MSE+λ∑w2 Loss = MSE + \lambda \sum w^2 Loss=MSE+λ∑w2
- 权重被压缩,但不会变成 0
六、嵌入法完整流程(超清晰)
- 选择带正则化的模型(Lasso、Ridge、树模型)
- 训练模型
- 模型自动给特征权重/重要性
- 权重=0 或 权重小 → 删除
- 用筛选后的特征建模
七、Python 完整实战(房价预测)
直接复制可运行!
1. 导入库
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectFromModel
from sklearn.metrics import mean_squared_error, r2_score
2. 加载数据
python
# 波士顿房价(经典回归数据集)
data = load_boston()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
print("特征数量:", X.shape[1])
print("样本数量:", X.shape[0])
X.head()
3. 查看特征相关性
python
plt.figure(figsize=(12, 8))
corr = pd.concat([X, y], axis=1).corr()
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('特征相关性热力图')
plt.show()
4. 标准化(Lasso 必须做)
python
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.2, random_state=42
)
5. Lasso 嵌入法训练(自动特征选择)
python
# Lasso 自带嵌入特征选择
lasso = Lasso(alpha=0.1, random_state=42)
lasso.fit(X_train, y_train)
# 查看特征系数
coef_df = pd.DataFrame({
'feature': X.columns,
'coef': lasso.coef_
}).sort_values(by='coef', ascending=False)
print("=== 特征权重(越大越重要)===")
print(coef_df)
6. 可视化特征权重
python
plt.figure(figsize=(12, 5))
sns.barplot(x='feature', y='coef', data=coef_df)
plt.xticks(rotation=45)
plt.title('Lasso 特征权重(嵌入法筛选)')
plt.tight_layout()
plt.show()
7. 自动筛选重要特征
python
# 自动选重要特征
sfm = SelectFromModel(lasso, threshold='mean')
X_train_selected = sfm.fit_transform(X_train, y_train)
X_test_selected = sfm.transform(X_test)
# 查看哪些被选中
selected = X.columns[sfm.get_support()]
print("=== 嵌入法筛选后的特征 ===")
print(selected.tolist())
print(f"从 {X.shape[1]} 个 → 筛选到 {len(selected)} 个")
8. 用筛选后的特征建模
python
# 重新训练
lasso_final = Lasso(alpha=0.1)
lasso_final.fit(X_train_selected, y_train)
y_pred = lasso_final.predict(X_test_selected)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("===== 模型效果 =====")
print(f"MSE: {mse:.4f}")
print(f"R2: {r2:.4f}")
9. 真实值 vs 预测值
python
plt.figure(figsize=(10, 5))
plt.scatter(y_test, y_pred, alpha=0.7)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')
plt.xlabel('真实房价')
plt.ylabel('预测房价')
plt.title('嵌入法筛选后模型效果')
plt.show()
10. 自动找最优 α
python
param = {'alpha': np.logspace(-4, 0, 30)}
grid = GridSearchCV(Lasso(), param, cv=5, scoring='neg_mean_squared_error')
grid.fit(X_train, y_train)
print("最优 alpha:", grid.best_params_['alpha'])
八、嵌入法的优点
- 训练+筛选一步完成
- 自动防过拟合
- 高维数据非常好用
- 工业界最常用
- 可解释性强(看权重就知道谁重要)
九、嵌入法的缺点
- 依赖模型
- Lasso 只适合线性关系
- 必须标准化
- 多重共线性下会随机删特征
十、三种特征选择方法对比(必考)
| 方法 | 方式 | 速度 | 效果 |
|---|---|---|---|
| 过滤法 Filter | 先统计筛选 → 再训练 | 最快 | 一般 |
| 包裹法 Wrapper | 反复训练筛选 | 最慢 | 最好 |
| 嵌入法 Embedded | 训练时自动筛选 | 快 | 很好 |
十一、什么时候必须用嵌入法?
- 特征多、维度高
- 希望训练+筛选一步完成
- 做论文、做实验、写报告
- 工程上线模型(速度快、稳定)
- 需要可解释特征
十二、最简单总结(背诵版)
- 嵌入法 = 模型训练时自动筛选特征
- 最常用:Lasso(L1)
- 特征权重 = 0 → 删除
- 优点:快、稳、防过拟合、一步到位
- 适合:高维数据、论文、工程建模