正则化参数λ的选择

正则化参数λ的选择

正则化参数λ的选择:通过选择不同的λ,求出不同λ对应的最小化J(θ),取出向量θ,使用交叉验证集来评价,也即测出每个参数θ在交叉验证集上的平均的误差平方和,然后取12个模型中交叉验证集最小的哪个模型作为最终选择。

  • 图片选自吴恩达机器学习视频。

只有训练集的损失函数有正则化项,验证集和训练集均没有。
在这里插入图片描述

### 带有L2正则化的最大后验估计 在机器学习中,当采用最大后验概率(MAP)估计时,目标是从给定的数据集中找到最有可能产生该数据集的参数配置。对于线性回归或其他模型而言,在引入先验分布的情况下,可以通过最大化联合概率 \(P(\theta|D)\),即条件于观测数据\(D\)下参数\(\theta\)的概率密度函数来进行优化。 假设选择高斯分布作为权重向量 \(\mathbf{w}\) 的先验,则对应的负对数似然可写成二次项的形式: \[ P(w|\alpha)=N(0,\frac{1}{\sqrt{\alpha}}I), \] 这里 \(\alpha=\lambda/\sigma^{2}\),其中 \(\sigma^2\) 是噪声方差[^3]。因此,加入此先验后的代价函数变为原始误差平方和加上由超参 \(\lambda\) 控制强度的惩罚项——这正是L2正则化的效果[^2]。 为了实现基于同伦算法动态调整正则化系数 \(\lambda\) 并获得一系列不同 \(\lambda\) 下的最佳解,可以遵循如下思路: #### 同伦方法简介 同伦连续法是一种用于解决非线性问题的技术,它通过构建一条连接初始易处理状态到最终难以直接求解的状态之间的路径来逐步逼近最优解。具体来说,在本场景中意味着从无正则化 (\(\lambda=0\)) 开始直到强正则化 (\(\lambda>0\)) 进行平滑过渡。 #### 实现过程 考虑到上述理论基础,下面给出Python代码片段展示如何利用`scikit-learn`库配合自定义逻辑完成这一任务: ```python import numpy as np from sklearn.linear_model import Ridge, lasso_path import matplotlib.pyplot as plt def homotopy_ridge(X_train, y_train, lambdas=None): """ 使用Ridge回归模拟同伦路径. 参数: X_train (array-like): 训练样本特征矩阵 y_train (array-like): 对应标签数组 lambdas (list or None): 如果提供具体的lambda列表, 则按照这些值迭代;否则自动创建. 返回: coefs_ (ndarray): 每个lambda对应的一组系数 alphas_ (ndarray): 所使用的实际lambda序列 """ if lambdas is not None and isinstance(lambdas, list): alphas_ = sorted(set([abs(x) for x in lambdas]), reverse=True) else: # 自动取合适的lambda范围 max_lambda = abs(np.dot(X_train.T, y_train)).max() / len(y_train) min_lambda_ratio = 0.001 n_lambdas = 100 log_max_alpha = np.log(max_lambda * min_lambda_ratio) log_min_alpha = np.log(min_lambda_ratio) alphas_ = np.exp(np.linspace(log_max_alpha, log_min_alpha, num=n_lambdas)) model = Ridge(fit_intercept=False) coefs_ = [] for alpha in alphas_: ridge = model.set_params(alpha=alpha).fit(X_train, y_train) coefs_.append(ridge.coef_) return np.array(coefs_), np.array(alphas_) if __name__ == "__main__": from sklearn.datasets import make_regression # 创建合成数据集 X, y = make_regression(n_samples=100, n_features=5, noise=0.1, random_state=42) # 获取同伦路径上的系数变化情况 coefs, alphas = homotopy_ridge(X, y) fig, ax = plt.subplots(figsize=(8, 6)) colors = ['b', 'g', 'r', 'c', 'm'] for i in range(len(colors)): ax.plot(-np.log10(alphas), coefs[:, i], color=colors[i]) ax.set_xlabel('-log(lambda)') ax.set_ylabel('Coefficients') ax.legend(['Feature %d' % i for i in range(5)]) plt.title("Homotopy Path of Coefficients with Varying Lambda Values") plt.show() ``` 这段脚本首先定义了一个名为 `homotopy_ridge()` 的辅助函数,它可以接受训练数据以及一组预设或自动生成的正则化因子 \(\lambda\) 来追踪随着 \(\lambda\) 变化而改变的回归系数轨迹。最后部分展示了绘制出各特征随 \(\lambda\) 改变的趋势图的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值