机器学习基础---过拟合问题及正则化技术

到现在为止,我们已经学习了几种不同的学习算法,包括线性回归和逻辑回归,它们能够有效地解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合(over-fitting)的问题,可能会导致它们效果很差。

一:过度拟合问题

(一)线性回归中的过拟合问题

继续使用线性回归来预测房价的例子,我们通过建立以住房面积为自变量的函数来预测房价。

1.我们可以用一次函数拟合数据,这样我们可以获取拟合数据的这样一条直线。

但是这不是一个很好的模型,通过数据可以明显的看出随着数据房子面积的增大,住房价格逐渐稳定。---越往后越平缓。

所以该算法没有很好的拟合训练集。我们把这个问题称为欠拟合(underfitting)。这个问题的另一个术语叫做高偏差(bias)

这两种说法大致相似,意思是它只是没有很好地拟合训练数据。

它的意思是如果拟合一条直线到训练数据,就好像算法有一个很强的偏见或者说非常大的偏差,因为该算法认为房子价格与面积仅仅线性相关。
与实际数据规律不符合,先入为主的拟合一条直线,最终导致拟合数据效果很差。

2.使用二阶函数更好的拟合训练集

3.使用高阶函数,似乎很好的拟合了训练集(经过了所有的数据点),但是这是一条扭曲的曲线。事实上我们并不认为这是一个好的模型,这个问题我们称之为过度拟合(高方差)

(二)过拟合带来的问题

如果我们拟合一个高阶多项式,那么这个函数能很好的拟合训练集,能拟合几乎所有的训练数据。这就面临可能的函数,太过庞大,变量太多的问题。

同时如果我们没有足够的数据,去约束这个变量过多的模型,那么这就是过度拟合。

概括的说:过度拟合的问题,将会在变量过多的时候出现,这时训练出的假设能很好的拟合训练集。所以,代价函数实际上可能非常接近于0。

但是你可能会得到这样的曲线:

它虽然可以很好的拟合训练集,但是会导致它无法泛化到新的样本中,无法预测新样本的价格

泛化:一个假设模型应用到新样本的能力

新样本的数据:没有出现在训练集的数据

(三)逻辑回归中的过拟合问题

图一:不能很好的拟合数据---欠拟合

图二:很好的拟合了数据

图三:千方百计的找到一个判定边界,来拟合训练数据---过拟合

(四)发现了过拟合问题,应该如何处理?

1.丢弃一些不能帮助我们正确预测的特征(减少特征变量)。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA)---可以有效的减少过拟合的发生,但是也可能丢弃关于问题的一些信息

2.正则化。 保留所有的特征,但是减少量级或者参数θ_j的大小(magnitude)。---因为很可能我们的每一个特征变量都是有一定用的,因此我们不希望舍弃这些特征变量。

二:代价函数---正则化是怎样运行的?

(一)正则化前提了解

当我们进行正则化的时候,我们还将写出相应的代价函数。

由前面可以知道,下面两种拟合方式,第一个可以很好的拟合训练集,第二个则是过拟合(泛化得不好)

而我们想要保留所有得特征,那应该如何做?

我们不妨在函数中加入惩罚项。使得参数θ_3和θ_4都非常小---看后面1000*  看下

这是我们得优化目标。 我们要最小化其均方误差代价函数。----优化目标(代价函数)不等于假设函数(但是对其有影响)

我们对上面得函数进行了一些修改,对于θ_3方和θ_4方乘以一个很大的数(比如1000)

假如我们要最小化这个函数,那么要使修改后的函数尽可能的小的方法只有一个:就是θ_3和θ_4尽可能的小(这些参数越小,我们得到的函数就会越平滑,也简单)    启上

就好像省略的θ_3和θ_4这两项一样,那么这个函数还是相当于二次函数:最后我们拟合数据的函数,实际上还是一个二次函数

那么,这就是一种很好的假设模型。

在该例子中,可以看到,加入了惩罚项,增大两个参数所带来的效果。

总的来说:这就是正则化背后的思想。

(二)正则化理解

比如:我们有很多特征变量(这里101个),我们并不知道谁的相关性比较小,那么我们应该决定缩小哪一个特征变量呢?

正则化处理:直接修改代价函数,在后面添加一个新的项(额外的正则化项)---来缩小每一个参数,从θ_1到θ_100(约定),实际上假设θ_0也没有影响

 

其中入是正则化参数---控制两个不同目标之间的取舍(平衡关系):

第一个目标:与目标函数的第一项有关,该目标是想要更好的拟合数据,训练集

第二个目标:与目标函数第二项(正则化项)有关,该目标就是要保持参数尽量的小

从而简化模型,避免过拟合的情况。 

如果正则化参数入设置过大:结果会导致对正则化项中的参数θ_j的惩罚程度太大。导致这些参数都会接近于0

这样的话,就相当于把假设函数的全部项都忽略掉了。导致假设模型最后只剩下一个θ_0。

导致使用一条直线去拟合训练集,导致欠拟合。

所以为了让正则化起到好的效果,我们应该去选择一个更加合适的正则化参数入。

三:线性回归中的正则化 

对于线性回归的求解,我们之前推导了两种学习算法: 

一种基于梯度下降

一种基于正规方程

这里,我们将继续学习这两个算法,并把它们推广到正则化线性回归中去。

这是我们之前学到的,正则化线性回归的代价函数。

(一)梯度下降法

如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对θ_0进行正则化,所以梯度下降算法将分两种情形:

对上面两种情况进行合并简化:

其中α一般很小,而m比较大。所以会导致1-α入/m接近1:比如可以想成0.99

只是把θ_j变小的速度降低了。其他的没有太大区别。

其优点:可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令值减少了一个额外的值。

(二)正规方程

含推导过程:https://www.cnblogs.com/ssyfj/p/12791935.html---就是将代价函数的偏导求0,即可。

其中X是一个m*(n+1)维矩阵,y会是一个m维向量。

其中m是训练样本数量,n是特征变量数。n+1是因为我加的这个额外的特征变量x0。

上面的正规方程,还是没有正则化项的。

正则化处理:

正则化处理:不可逆问题

 

其实就是,C=AB,r(C)<=min(A,B)<=m,由于m<n,这里的C是XT*X,为(n+1)*(n+1)的矩阵,秩最大为m所以不可逆

其中当入>0时,后面的矩阵的秩=n,与前面的XTX相加,可以解决一些不可逆问题。

四:逻辑回归中的正则化

针对逻辑回归问题,已经学习过两种优化算法:

1.我们首先学习了使用梯度下降法来优化代价函数J(θ)

2.接下来学习了更高级的优化算法,这些高级优化算法需要自己设计代价函数J(θ)

使用正则化改进这两种算法 。

(一)正则化解决逻辑回归过拟合问题

可以很好的区分正样本和负样本。

代码实现:

import numpy as np
def costReg(theta, X, y, learningRate):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
    second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
    reg = (learningRate / (2 * len(X))* np.sum(np.power(theta[:,1:theta.shape[1]],2))
    return np.sum(first - second) / (len(X)) + reg

(二)正则化改进梯度下降法

与线性回归不同之处就在于假设函数的不同。

(三)在高级算法中使用正则化

对于高级算法,我们想要自己定义一个costFunction函数:---使用fminuc函数调用函数costFunction或者其他高级优化函数

这个函数以参数向量θ为输入 。

返回:实现正则化代价函数:

返回:梯度求取:

总之:对于θ_j(j>0)来说,其梯度偏导为:

注意:

(一)虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但由于两者的h_θ(x)不同所以还是有很大差别。

(二)θ_0不参与其中的任何一个正则化。

posted @ 2020-05-01 11:17  山上有风景  阅读(1038)  评论(0编辑  收藏  举报