正则化(线性回归)

正则化

这部分是结合统计机器学习的(李航)和吴恩达的机器学习视频写的,有什么不对的地方欢迎指出啊!

当数据量少,特征也少的时候,我们训练的模型是欠拟合,这时候我们会通过交叉验证来弥补。
当数据量少,特征非常多的时候,容易出现过拟合,这时要通过正则化调整。

1. 过拟合

过拟合例子

还是来看预测房价的这个例子,我们先对该数据做线性回归,也就是左边第一张图。

如果这么做,我们可以获得拟合数据的这样一条直线,但是,实际上这并不是一个很好的模型。我们看看这些数据,很明显,随着房子面积增大,住房价格的变化趋于稳定或者说越往右越平缓。因此线性回归并没有很好拟合训练数据。

我们将此类情况称为欠拟合(underfitting),或者叫做高偏差(bias)

第二幅图,我们在中间加入一个二次项,也就是说对于这幅数据我们用二次函数去拟合。自然,可以拟合出一条曲线,事实也证明这个拟合效果很好。

另一个极端情况是,如果在第三幅图中对于该数据集用一个四次多项式来拟合。因此在这里我们有五个参数θ0到θ4,这样我们同样可以拟合一条曲线,通过我们的五个训练样本,我们可以得到如右图的一条曲线。

一方面,我们似乎对训练数据做了一个很好的拟合,因为这条曲线通过了所有的训练实例。但是,这实际上是一条很扭曲的曲线,它不停上下波动。因此,事实上我们并不认为它是一个预测房价的好模型。

我们把这类情况叫做过拟合(overfitting),也叫高方差(variance)。

类似的情况也出现在逻辑回归当中:

逻辑回归过拟合

过拟合的模型泛化性能就会下降,所以我们希望找到一个既简单,又适合的模型。简单来说就是曲线更平滑,参数更少。

2. 解决方案

对于过拟合,应该如何处理呢?

过多的变量(特征),同时只有少量的训练数据,会导致过拟合的问题,解决方案:

过拟合解决方案

方法一:尽量减少选取变量的数量

具体而言,我们可以人工检查每一项变量,并以此来确定哪些变量更为重要,然后,保留那些更为重要的特征变量。至于,哪些变量应该舍弃,我们以后在讨论,这会涉及到模型选择算法,这种算法是可以自动选择采用哪些特征变量,自动舍弃不需要的变量。这类做法非常有效,但是其缺点是当你舍弃一部分特征变量时,你也舍弃了问题中的一些信息。例如,也许所有的特征变量对于预测房价都是有用的,我们实际上并不想舍弃一些信息或者说舍弃这些特征变量。

方法二:正则化

具体而言,我们可以人工检查每一项变量,并以此来确定哪些变量更为重要,然后,保留那些更为重要的特征变量。至于,哪些变量应该舍弃,我们以后在讨论,这会涉及到模型选择算法,这种算法是可以自动选择采用哪些特征变量,自动舍弃不需要的变量。这类做法非常有效,但是其缺点是当你舍弃一部分特征变量时,你也舍弃了问题中的一些信息。例如,也许所有的特征变量对于预测房价都是有用的,我们实际上并不想舍弃一些信息或者说舍弃这些特征变量。

3. 例子

3.1 正则化项

房屋正则化的例子

在前面的介绍中,我们看到了如果用一个二次函数来你和这些数据,那么它给了我们一个对数据很好的拟合。然而,如果我们用一个更高次的多项式去拟合,最终我们可能会得到一个曲线,它能很好地拟合训练集,但却并不是一个好的结果,因为它过度拟合了数据,因此,泛化能力并不是很好。

让我们考虑如下假设,假设 θ3 θ4 贡献很小,我们希望加入惩罚项,来使这两个参数变小。

惩罚 $\theta_3$,$\theta_4$

意思就是,在满足上式(尽量减少代价函数的均方误差)的情况下,对于这个函数我们对它添加一些项,比如加上 1000 乘以 θ3 的平方,再加上 1000 乘以 θ4 的平方,来使得 θ3 θ4 较小。

惩罚 $\theta_3$,$\theta_4$

1000 只是我随便写的某个较大的数字而已。现在,如果我们要最小化这个函数,那么为了最小化这个新的代价函数,我们要让 θ3 θ4 尽可能小。因为,如果你在原有代价函数的基础上加上 1000 乘以 θ3 这一项 ,那么这个新的代价函数将变得很大,所以,当我们最小化这个新的代价函数时, 我们将使 θ3 的值接近于 0,同样 θ4 的值也接近于 0,就像我们忽略了这两个值一样。如果我们做到这一点( θ3 θ4 接近 0),那么我们将得到一个近似的二次函数。

惩罚 $\theta_3$,$\theta_4$

因此,我们最终恰当地拟合了数据,我们所使用的正是二次函数加上一些非常小,贡献很小项(因为这些项的 θ3 θ4 非常接近于0)。显然,这是一个更好的假设。

正则化所有参数

更一般地,这里给出了正规化背后的思路。这种思路就是,如果我们的参数值对应一个较小值的话(参数值比较小),那么往往我们会得到一个形式更简单的假设。

在我们上面的例子中,我们惩罚的只是 θ3 θ4 ,使这两个值均接近于零,从而我们得到了一个更简单的假设,实际上这个假设大抵上是一个二次函数。

但更一般地说,如果我们像惩罚 θ3 θ4 这样惩罚其它参数,那么我们往往可以得到一个相对较为简单的假设。

实际上,这些参数的值越小,通常对应于越光滑的函数,也就是更加简单的函数。因此 就不易发生过拟合的问题。

来让我们看看具体的例子,对于房屋价格预测我们可能有上百种特征,与刚刚所讲的多项式例子不同,我们并不知道 θ3 和 θ4 是高阶多项式的项。所以,如果我们有一百个特征,我们并不知道如何选择关联度更好的参数,如何缩小参数的数目等等。

因此在正则化里,我们要做的事情,就是把减小我们的代价函数(例子中是线性回归的代价函数)所有的参数值,因为我们并不知道是哪一个或哪几个要去缩小。

因此,我们需要修改代价函数,在这后面添加一项,就像我们在方括号里的这项。当我们添加一个额外的正则化项的时候,我们收缩了每个参数。

线性回归正则化

顺便说一下,按照惯例,我们没有去惩罚 θ0 ,因此 θ0 的值是大的。这就是一个约定从 1 到 n 的求和,而不是从 0 到 n 的求和。但其实在实践中这只会有非常小的差异,无论你是否包括这 θ0 这项。但是按照惯例,通常情况下我们还是只从 θ1 θn 进行正则化。

下面的这项就是一个正则化项,并且 λ 在这里我们称做正则化参数,控制在两个不同的目标中的平衡关系。

第一个目标就是使假设更好的拟合训练数据
第二个目标就是使假设更好的拟合测试数据(是参数更小,模型更简单)

λj=1nθ2j

3.2 λ 的影响

正则化线性回归

在正则化线性回归中,如果正则化参数值 λ 被设定为非常大,那么将会发生什么呢?

我们将会非常大地惩罚参数θ1 θ2 θ3 θ4 … 也就是说,我们最终惩罚 θ1 θ2 θ3 θ4 … 在一个非常大的程度,那么我们会使所有这些参数接近于零。

如果我们这么做,那么就是我们的假设中相当于去掉了这些项,并且使我们只是留下了一个简单的假设,这个假设只能表明房屋价格等于 θ0 的值,那就是类似于拟合了一条水平直线,对于数据来说这就是一个欠拟合 (underfitting)。这种情况下这一假设它是条失败的直线,对于训练集来说这只是一条平滑直线,它没有任何趋势,它不会去趋向大部分训练样本的任何值。

这句话的另​​一种方式来表达就是这种假设有过于强烈的”偏见” 或者过高的偏差 (bais),认为预测的价格只是等于 θ0 。对于数据来说这只是一条水平线。

因此,为了使正则化运作良好,我们应当注意一些方面,应该去选择一个不错的正则化参数 λ 。当我们以后讲到多重选择时我们将讨论一种方法来自动选择正则化参数λ ,为了使用正则化,接下来我们将把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。

4. 正则化的线性回归

4.1 岭回归

岭回归目标方程

求解线性回归,我们用两种算法,一种基于梯度下降,另外一种基于正规方程

梯度下降

梯度下降

正规方程

正规方程

这里写图片描述

现在考虑 M(即样本量), 比 N(即特征的数量)小或等于N。

通过之前的博文,我们知道如果你只有较少的样本,导致特征数量大于样本数量,那么矩阵 XTX 将是不可逆矩阵或奇异(singluar)矩阵,或者用另一种说法是这个矩阵是退化(degenerate)的,那么我们就没有办法使用正规方程来求出 θ 。

幸运的是,正规化也为我们解决了这个问题,具体的说只要正则参数是严格大于零,实际上,可以证明如下矩阵:

XTX+λ0111

将是可逆的。因此,使用正则还可以照顾任何 XTX 不可逆的问题。

类似的,我们将这种正则化的想法应用到 Logistic 回归,这样我们就可以让 Logistic 回归也避免过拟合。

4. 正则化的逻辑回归

Regularized Logistic Regression 实际上与 Regularized Linear Regression 是十分相似的。

这里写图片描述

同样适用梯度下降:

这里写图片描述

如果在高级优化算法中,使用正则化技术的话,那么对于这类算法我们需要自己定义costFunction

这里写图片描述

这个我们自定义的 costFunction 的输入为向量 θ ,返回值有两项,分别是代价函数 jVal 以及 梯度gradient。

总之我们需要的就是这个自定义函数costFunction,针对Octave而言,我们可以将这个函数作为参数传入到 fminunc 系统函数中(fminunc 用来求函数的最小值,将@costFunction作为参数代进去,注意 @costFunction 类似于C语言中的函数指针),fminunc返回的是函数 costFunction 在无约束条件下的最小值,即我们提供的代价函数 jVal 的最小值,当然也会返回向量 θ <script type="math/tex" id="MathJax-Element-46">θ</script> 的解。

上述方法显然对正则化逻辑回归是适用的。

  • 21
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Python 中实现正则化线性回归可以使用 Scikit-learn 库提供的 `Ridge` 或 `Lasso` 模型。这两个模型都是基于线性回归模型的正则化版本,可以通过添加 L1 或 L2 正则化项来控制模型的复杂度。 下面是使用 `Ridge` 模型实现正则化线性回归的示例代码: ```python from sklearn.linear_model import Ridge from sklearn.metrics import mean_squared_error from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import numpy as np # 生成数据 n_samples, n_features = 1000, 10 X = np.random.randn(n_samples, n_features) y = np.dot(X, np.random.randn(n_features)) + np.random.randn(n_samples) # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) y = scaler.fit_transform(y.reshape(-1, 1)) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练模型 alpha = 0.1 # 正则化参数 model = Ridge(alpha=alpha) model.fit(X_train, y_train) # 预测并计算 MSE y_pred = model.predict(X_test) mse = mean_squared_error(y_test, y_pred) print("MSE: %.4f" % mse) ``` 在上面的示例代码中,我们生成了一个随机的数据集,然后使用 `StandardScaler` 对数据进行标准化处理,接着使用 `train_test_split` 将数据划分为训练集和测试集。然后,我们使用 `Ridge` 模型进行训练,并使用 `mean_squared_error` 函数计算模型在测试集上的均方误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值