用Keras实战解析L1正则化:从稀疏性原理到房价预测特征选择
第一次接触L1正则化时,我被它神奇的"特征选择"能力所吸引——为什么简单的绝对值惩罚项就能自动筛选重要特征?直到在波士顿房价预测项目中亲手实现后,才真正理解其背后的数学之美。本文将通过完整的代码案例,带你体验L1正则化如何从包含20+特征的原始数据中,自动识别出真正影响房价的关键因素。不同于理论讲解,我们将重点关注:
- 冗余特征如何干扰模型表现
- L1惩罚项在训练过程中如何产生稀疏权重
- 如何解读被压缩为零的系数
- 特征选择后的模型效果对比
1. 环境准备与数据探索
1.1 工具链配置
确保已安装以下Python包(推荐使用conda环境):
bash复制pip install keras tensorflow pandas scikit-learn matplotlib
关键版本要求:
- TensorFlow ≥ 2.4
- Keras ≥ 2.4
- scikit-learn ≥ 0.24
1.2 波士顿房价数据集分析
加载数据并观察特征分布:
python复制from sklearn.datasets import load_boston
import pandas as pd
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['PRICE'] = boston.target
print(f"特征数量: {len(boston.feature_names)}")
print(df.describe().loc[['mean', 'std']])
输出显示13个原始特征(如犯罪率、房间数等)的统计信息。为模拟真实场景,我们人工构造7个随机噪声特征:
python复制import numpy as np
np.random.seed(42)
noise_features = np.random.randn(len(df), 7)
df_noise = pd.concat([
df,
pd.DataFrame(noise_features, columns=[f'noise_{i}' for i in range(7)])
], axis=1)
此时特征矩阵包含20个维度(13真实+7噪声),为后续的特征选择提供挑战场景。
1.3 基线模型构建
建立不含正则化的全连接网络作为基准:
python复制from keras.models import Sequential
from keras.layers import Dense
model = Sequential([
Dense(64, activation='relu', input_shape=(20,)),
Dense(32, activation='relu'),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
使用5折交叉验证评估表现:
| 验证折数 | 训练MAE | 验证MAE |
|---|---|---|
| 1 | 2.31 | 3.87 |
| 2 | 2.05 | 4.12 |
