python机器学习——正则化

咱们在训练的时候常常会遇到这两种状况:函数

一、模型在训练集上偏差很大。学习

二、模型在训练集上偏差很小,表现不错,可是在测试集上的偏差很大测试

咱们先来分析一下这两个问题:spa

对于第一个问题,明显就是没有训练好,也就是模型没有很好拟合数据的能力,并无学会如何拟合,多是由于在训练时咱们选择了较少的特征,或者是咱们选择的模型太简单了,不能稍微复杂的拟合数据,咱们能够经过尝试选取更多的特征、增长一些多项式特征或者直接选用非线性的较复杂的模型来训练。blog

对于第二个问题,能够说是第一个问题的另一个极端,就是模型对训练集拟合的太好了,以致于把训练集数据中的那些可有可无的特征或者噪音也学习到了,致使的结果就是当咱们使用测试集来评估模型的泛化能力时,模型表现的不好。打个不恰当比方就是你平时把做业都背下来了,可是其实你并无学会如何正确解题,因此遇到考试就考的不好。解决方法就是增长训练集的数据量或者减小特征数量来尝试解决。it

第一个问题咱们叫作欠拟合(underfitting),第二个问题咱们叫作过拟合(overfitting)
class

这两个问题还存在一种解决方法,就是我接下来要说的正则化。lambda

咱们以前说模型学习的过程也就是调整权重参数的过程,经过训练集中的数据来将模型的权重参数调整到一个使得损失函数最小的值。方法

对于一个分布较复杂的样本,若是训练获得的权重参数维度太少或者参数太小,也就是特征项不多,一些重要的特征没有起到做用,那么这条拟合曲线就会变得很简单,咱们看上图的欠拟合图像,里面的拟合曲线是一条直线,这就是权重参数维度太少的结果。而若是权重参数维度过多或者参数过大,致使拟合曲线过于复杂,如上图的过拟合图像,拟合曲线能够完美的将两类不一样的样本点区分开,可是咱们也能够看出这条曲线很复杂,权重参数的项数必定不少。im

如今进入正题,对于正则化,咱们常见的形式是L2正则:
\[ \frac \lambda 2\lVert w \lVert^2 = \frac \lambda 2 \sum_{j=1}^m{w_j^2} \]
这里的
\[ \lambda \]
就是正则化系数。

咱们将正则项直接添加到损失函数后便可使用,好比对于逻辑回归模型,带有L2正则项的损失函数为:
\[ J(w)=\sum_{i=1}^n\left[-y^{(i)}log(\phi(z^{(i)}))-(1-y^{(i)})log(1-\phi(z^{(i)}))\right] + \frac \lambda 2\lVert w \lVert^2 \]
咱们经过控制正则化系数来控制权重参数的大小。通常正则化用于解决模型过拟合的问题,咱们的训练目标是为了使损失函数最小,可是若是权重参数过大会致使过拟合,模型泛化能力降低,那么为了解决这个问题,将正则项加到损失函数后面,组成一个新的损失函数,为了最小化这个新的损失函数,咱们在训练过程当中不只要使得偏差小,还要保证正则项不能太大,因而若是咱们选择一个较大的正则化系数,那么为了保证正则项不能太大,就会使得权重参数变小,这也就是咱们的最终目的:在保证偏差不大的状况下,使得权重参数也不能太大,缓解了过拟合问题。正则化系数越大,正则化越强,权重参数越小。

因此对于欠拟合的模型,咱们也能够尝试减少正则化系数来增大权重参数,而对于过拟合模型,咱们尝试增大正则化系数来减少权重参数。

相关文章
相关标签/搜索