【特征选择】嵌入法(Embedded)

特征选择核心方法:嵌入法(Embedded)|原理+代码+可视化全攻略

嵌入法是机器学习里最高效、最常用、最适合论文与工程 的特征选择方式。它把特征选择直接嵌在模型训练里,一边训练一边自动筛选,不用单独跑特征筛选流程,速度快、效果稳。


一、什么是嵌入法?一句话看懂

嵌入法 = 训练模型时自动做特征选择,一步到位。

它不像过滤法(先筛选再训练)、包裹法(反复训练筛选),而是:

  • 模型训练
  • 特征打分
  • 特征筛选
    三件事同时完成

二、最通俗的比喻:边学边划重点

你在复习考试:

  • 过滤法:先划重点 → 再背书
  • 包裹法:背一遍 → 划重点 → 再背一遍
  • 嵌入法边背书边自动划重点

嵌入法就是模型自带特征筛选功能,训练完直接告诉你:哪些特征有用。


三、嵌入法靠什么实现?(两大核心)

嵌入法主要依靠正则化(Regularization)实现:

  1. L1 正则化(Lasso) → 直接把不重要特征的权重变成 0(真正删除)
  2. L2 正则化(Ridge) → 把不重要特征权重压缩变小(不删但减弱)

另外树模型(随机森林、XGBoost)也属于嵌入法。


四、嵌入法的 4 大优势(必背)

  1. 一步到位:训练 + 筛选同时完成
  2. 速度快:不用反复训练模型
  3. 减少过拟合:正则化本身就是防过拟合
  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

六、嵌入法完整流程(超清晰)

  1. 选择带正则化的模型(Lasso、Ridge、树模型)
  2. 训练模型
  3. 模型自动给特征权重/重要性
  4. 权重=0 或 权重小 → 删除
  5. 用筛选后的特征建模

七、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'])

八、嵌入法的优点

  1. 训练+筛选一步完成
  2. 自动防过拟合
  3. 高维数据非常好用
  4. 工业界最常用
  5. 可解释性强(看权重就知道谁重要)

九、嵌入法的缺点

  1. 依赖模型
  2. Lasso 只适合线性关系
  3. 必须标准化
  4. 多重共线性下会随机删特征

十、三种特征选择方法对比(必考)

方法 方式 速度 效果
过滤法 Filter 先统计筛选 → 再训练 最快 一般
包裹法 Wrapper 反复训练筛选 最慢 最好
嵌入法 Embedded 训练时自动筛选 很好

十一、什么时候必须用嵌入法?

  • 特征多、维度高
  • 希望训练+筛选一步完成
  • 做论文、做实验、写报告
  • 工程上线模型(速度快、稳定)
  • 需要可解释特征

十二、最简单总结(背诵版)

  • 嵌入法 = 模型训练时自动筛选特征
  • 最常用:Lasso(L1)
  • 特征权重 = 0 → 删除
  • 优点:快、稳、防过拟合、一步到位
  • 适合:高维数据、论文、工程建模
相关推荐
贾斯汀玛尔斯2 分钟前
每天学一个算法--动态规划(Dynamic Programming, DP)
算法·动态规划
水木流年追梦4 分钟前
CodeTop 热门题目汇总hot300题
算法·leetcode·职场和发展
薛定猫AI4 分钟前
【深度解析】AI 大模型新一轮竞速:Kimi K2.6、GPT-5.5、Gemini 新检查点与 Agent 化趋势全景拆解
人工智能·gpt
起这个名字5 分钟前
LangGraphJs 核心概念、工作流程理解及应用
前端·人工智能
djjdjdjdjjdj6 分钟前
bootstrap如何修改警告框(Alert)的边框粗细
jvm·数据库·python
科雷软件测试10 分钟前
Python中schedule库:轻松实现任务定时自动化
python
ZGi.ai14 分钟前
LangChain做了什么?企业场景中它和专用AI平台的定位区别
人工智能·开源框架·企业ai·- langchain·- ai应用开发
努力努力再努力wz15 分钟前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz18 分钟前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
tjc1990100519 分钟前
golang如何使用t.Cleanup清理测试_golang t.Cleanup测试清理使用策略
jvm·数据库·python