正则化(Regularization)和梯度下降——线性回归和逻辑回归

本文探讨了在机器学习中如何使用正则化技术来防止过拟合问题。介绍了正则化的概念及其目的,通过调整参数大小而非简单地删除特征来改善模型泛化能力。并详细展示了正则化在梯度下降过程中的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在阅读原作者文章时,感觉写的很好,也很清楚,因此转载过来,作为学习笔记。在原文基础上,加入一些自己的理解。很感激原作者!!!

正则化(Regularization)

针对于回归类算法或者分类算法,如线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fitting)的问题,可能会导致它们效果很差。

如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为0),但是可能会不能推广到新的数据。

下图是一个回归问题的例子:
在这里插入图片描述
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。
除了在回归问题中,过拟合会严重影响算法的在新数据中的使用效果,分类中也是如此:


就以多项式理解,x的次数越高,拟合的越好,当出现过拟合时,其预测的能力就可能变差。

对于过拟合问题,可采取如下措施:

  1. 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA和LDA)(也就是进行维度稀疏,降维)。

  2. 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

正则化的目的

通过上述图片可以看出,较高的x的次数,较高的模型复杂度,会提高模型的在训练集的拟合效果,但在模型预测在新数据集上的效果会出奇的差。这就是过拟合。
设想,将x3和x4消除或者等于0,便可以降低模型的复杂度,这便是利用降维的方式,防止了过拟合。
在设想,在不改变模型复杂度的情况下,让x3和x4的系数尽可能的接近于0,两者相乘的结果,也会更靠近于0。这便实现了正则化的方式,来实现防止过拟合。
所以,要做的就是在一定程度上减小这些参数θ 的值,这就是正则化的基本方法。

例子
上面的回归问题中如果我们的模型是:

我们决定要减少θ3和θ4的大小,我们要做的便是修改代价函数,在其中θ3和θ4设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的θ3和θ4。 修改后的代价函数如下:

通过这样的代价函数选择出的θ3和θ4 对预测结果的影响就比之前要小许多。

梯度下降实现参数更新

假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚。则代价函数可以表示为:

其中𝜆称为正则化参数(Regularization Parameter)。
借用原作者的公式:
通过求上述代价函数的偏导,获得对于每一个参数θ的更新量。
在这里插入图片描述
j=1,2,…,n。逐次求导,并进行累加实现对参数的更新。

这边只进行了线性回归函数的梯度下降的参数更新,对于逻辑回归,也采用同样的方式。
在逻辑回归中,主要需要注意的是
在这里插入图片描述1. g(*)函数是sigmoid的函数,求导是需要注意。
2. 代价函数的表达式的不同:
在这里插入图片描述
转载

### 关于正则化线性回归正则化逻辑回归的实验指导 在实现正则化线性回归正则化逻辑回归的过程中,通常会涉及以下几个核心部分: #### 数据准备 为了完成这些实验,首先需要下载 `ex5Data.zip` 并解压其中的内容[^1]。该压缩包包含了两组数据集:一组适用于线性回归的任务,而另一组则是为逻辑回归设计的数据。 #### 特征处理 对于逻辑回归任务,可能还需要使用到名为“映射特征.m”的辅助函数来扩展原始输入特征的空间。这一步骤有助于提高模型拟合复杂模式的能力。如果是在 Python 中实现,则可以通过 NumPy 或 Pandas 来构建类似的多项式特征矩阵。 #### 正则化线性回归实现 以下是基于 Python 的正则化线性回归的一个简单实现示例: ```python import numpy as np def compute_cost(X, y, theta, lambda_): m = len(y) h = X @ theta regularization_term = (lambda_ / (2 * m)) * np.sum(theta[1:] ** 2) cost = (1/(2*m)) * np.sum((h-y)**2) + regularization_term return cost def gradient_descent(X, y, theta, alpha, num_iters, lambda_): m = len(y) J_history = [] for _ in range(num_iters): error = X @ theta - y grad_theta = (X.T @ error) / m reg_term = (lambda_ / m) * theta reg_term[0] = 0 # 不对截距项应用正则化 theta -= alpha * (grad_theta + reg_term) J_history.append(compute_cost(X, y, theta, lambda_)) return theta, J_history ``` 上述代码实现了带有 L2 正则化梯度下降方法,并通过调整参数 `lambda_` 控制正则化的强度。 #### 正则化逻辑回归实现 下面是针对正则化逻辑回归的部分代码片段: ```python from scipy.optimize import minimize def sigmoid(z): return 1 / (1 + np.exp(-z)) def log_reg_cost_function(theta, X, y, lambda_): m = len(y) h = sigmoid(X @ theta) base_cost = (-1/m) * (y.T @ np.log(h) + (1-y).T @ np.log(1-h)) reg_term = (lambda_ / (2 * m)) * np.sum(theta[1:]**2) return base_cost + reg_term def optimize_logistic_regression(X, y, initial_theta, lambda_): result = minimize( fun=log_reg_cost_function, x0=initial_theta, args=(X, y, lambda_), method='BFGS', options={'disp': True} ) return result.x ``` 这段代码定义了一个优化目标函数以及调用 SciPy 库中的最小化器来进行求解最优参数的过程。 #### 偏置计算补充说明 另外,在某些情况下可能会涉及到偏置(bias)的额外计算公式[^3]。虽然这里主要讨论的是正则化问题,但如果遇到特定场景下的偏差修正需求时也可以参考相关内容进行适当修改。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值