机器学习过拟合解决:正则化(L1/L2)与交叉验证实战方案
·
机器学习过拟合解决方案:正则化与交叉验证实战指南
一、过拟合核心问题
当模型在训练集表现优异($R^2 \approx 1$)但在测试集表现显著下降时,即发生过拟合: $$ \text{训练误差} \ll \text{测试误差} $$
二、正则化实战方案
1. L1正则化(Lasso)
- 数学原理:损失函数添加权重绝对值之和 $$ J(\theta) = \text{MSE}(\theta) + \lambda \sum_{i=1}^{n} |\theta_i| $$
- 特征选择:自动筛选重要特征(稀疏解)
- Python实现:
from sklearn.linear_model import Lasso # 通过交叉验证选择最佳λ lasso = LassoCV(alphas=[0.001, 0.01, 0.1, 1.0], cv=5) lasso.fit(X_train, y_train) print(f"最优alpha: {lasso.alpha_}, 非零特征数: {sum(lasso.coef_ != 0)}")
2. L2正则化(Ridge)
- 数学原理:损失函数添加权重平方和 $$ J(\theta) = \text{MSE}(\theta) + \lambda \sum_{i=1}^{n} \theta_i^2 $$
- 适用场景:特征间存在多重共线性
- Python实现:
from sklearn.linear_model import RidgeCV ridge = RidgeCV(alphas=np.logspace(-3, 3, 20), scoring='neg_mean_squared_error') ridge.fit(X_train, y_train) print(f"最优alpha: {ridge.alpha_}")
3. ElasticNet(L1+L2组合) $$ J(\theta) = \text{MSE}(\theta) + \lambda_1 \sum |\theta_i| + \lambda_2 \sum \theta_i^2 $$
from sklearn.linear_model import ElasticNetCV
enet = ElasticNetCV(l1_ratio=[.1, .5, .9], cv=5)
enet.fit(X_train, y_train)
三、交叉验证实战方案
1. K折交叉验证流程
graph TD
A[原始数据集] --> B[划分K等份]
B --> C1[第1折验证]
B --> C2[第2折验证]
B --> C3[...]
B --> Ck[第K折验证]
C1 --> D[平均评估指标]
C2 --> D
Ck --> D
2. 代码实现
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
kf = KFold(n_splits=5, shuffle=True)
scores = []
for train_index, val_index in kf.split(X):
X_train, X_val = X[train_index], X[val_index]
y_train, y_val = y[train_index], y[val_index]
model = Ridge(alpha=0.5)
model.fit(X_train, y_train)
preds = model.predict(X_val)
score = mean_squared_error(y_val, preds)
scores.append(score)
print(f"平均MSE: {np.mean(scores):.4f} ± {np.std(scores):.4f}")
3. 进阶技巧
# 嵌套交叉验证(超参数优化+模型评估)
outer_cv = KFold(n_splits=5)
inner_cv = KFold(n_splits=3)
for train_idx, test_idx in outer_cv.split(X):
# 超参数搜索
grid_search = GridSearchCV(estimator=Ridge(),
param_grid={'alpha': [0.1, 1.0, 10]},
cv=inner_cv)
grid_search.fit(X[train_idx], y[train_idx])
# 最终评估
best_model = grid_search.best_estimator_
score = best_model.score(X[test_idx], y[test_idx])
四、综合解决方案
-
特征工程阶段
- 使用L1正则化筛选特征
- 对高维特征进行PCA降维
-
模型训练阶段
pipeline = make_pipeline( StandardScaler(), SelectFromModel(LassoCV(cv=5)), # 特征选择 RidgeCV(cv=5) # 正则化建模 ) pipeline.fit(X_train, y_train) -
模型评估阶段
- 使用分层K折交叉验证(StratifiedKFold)处理不平衡数据
- 记录每折验证结果,分析模型稳定性
五、效果评估指标
- 正则化效果:比较训练/验证集损失曲线 $$ \Delta\text{Loss} = \left| \text{Loss}{\text{train}} - \text{Loss}{\text{val}} \right| $$
- 泛化能力:测试集上的$R^2$和RMSE $$ \text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} $$
最佳实践:结合早停机制(Early Stopping),当验证误差连续3轮不下降时终止训练,防止过拟合。
更多推荐
所有评论(0)