机器学习过拟合解决方案:正则化与交叉验证实战指南

一、过拟合核心问题

当模型在训练集表现优异($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])

四、综合解决方案
  1. 特征工程阶段

    • 使用L1正则化筛选特征
    • 对高维特征进行PCA降维
  2. 模型训练阶段

    pipeline = make_pipeline(
        StandardScaler(),
        SelectFromModel(LassoCV(cv=5)),  # 特征选择
        RidgeCV(cv=5)  # 正则化建模
    )
    pipeline.fit(X_train, y_train)
    

  3. 模型评估阶段

    • 使用分层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轮不下降时终止训练,防止过拟合。

更多推荐