本文基于吴恩达老师的机器学习课程。看了吴恩达老师的机器学习课程,收获很多,想把课上学做的笔记结合自己的理解以及找到的一些资料综合起来做一个总结。大家感兴趣也可以自己去看一看吴恩达老师的课,这套课程,被公认为最好的机器学习的入门教程,下面是课程视频链接:
上一篇博客机器学习(四):批量梯度下降法(BGD)、随机梯度下降法(SGD)和小批量梯度下降法(MBGD)讲了梯度下降的三种方式和调优方法。这篇博客讲什么是欠拟合与过拟合和局部加权回归算法。
一、欠拟合与过拟合
我们先来看一张图:
第一个图是欠拟合,用一条直线来拟合样本,样本分布比较分散,直线难以拟合全部训练集样本,所以模型拟合能力不足。第二个图显示的曲线就很好的拟合样本分布情况,虽然并没有完全的跟这些样本点重合,但是曲线比较贴近样本分布轨迹。第三张图是过拟合,曲线很好的拟合了样本,几乎跟样本重叠,同时样本中的噪音数据也被拟合,噪音数据影响了模型训练。
我们还用房屋价格来做例子,我们使用梯度下降算法,当我们只用房屋面积大小这一个特征时,用x1表示,得到的假设函数为一个一次函数,如上面图一,X轴为房屋面积大小,Y轴为房屋价格。若我们定义特征集合为:x1表示房屋大小,x2表示房屋大小的平方,使用相同的算法,拟合后会得到一个二次函数,在图中为抛物线,如上面图二,这样基于数据特点会拟合的更好。以此类推,若数据集有7个数据,我们可以令x3表示房屋大小的三次方......最高可以拟合出一个6次多项式。这样,我们可以得到一个精确拟合所有数据的模型,它的曲线可以完美通过每个数据点,如上面图三。但是没有人会认为这个模型是对房屋价格的一个非常好的预测,因为它仅仅反应了所给的特定数据集合的特质,而不是隐藏在其下的房屋价格随房屋大小变化的一般规律。
我们把第一种使用过小的特征集合的使得模型过于简单的称为欠拟合,它的缺点简单点理解就是模型简单,在训练集上的准确率不高,同时在测试集上的准确率也不高,这样如何训练都无法训练出有意义的参数,模型也得不到较好的效果。
把第三种由于使用了过大的特征集合使得模型过于复杂的称为过拟合。我们做机器学习的一个目的就是预测,对训练集所做的拟合都是在已知目标变量的基础上进行的,拟合的再好,这些都是已经知道的,而我们想要的就是能够对未知的事情进行预测,过拟合最大的缺陷就在这里,已知的拟合的好,未知的却不能很好预测。这里给出它们一个不那么正式的定义:
欠拟合(Underfitting):在出现欠拟合的情况下,数据中的某些非常明显的模式没有被成功的拟合出来。
过拟合(Overfitting):在出现过拟合的情况下,算法拟合出的结果仅仅反应了所给的特定数据的特质。
过拟合和欠拟合都是我们在特征选择中会出现的问题,有几个方法可以用来解决这类学习问题,比如我们之后会讲到的特征选择算法,这是一类自动化算法,可以在这类回归问题中选择要用到的特征。还有一类非参数学习算法可以缓解我们选取特征的需求——局部加权回归算法。
二、局部加权回归算法(Locally Weighted Regression)
首先定义这两个概念:
参数学习算法(parametric learning algorithm)
定义:参数学习算法是一类有固定数目的参数,以用来进行数据拟合的算法。所以在线性回归中,我们有固定的参数集合,它可以用来拟合数据。
非参数学习算法(Non-parametric learning algorithm)
定义:非参数学习算法是一个参数数量会随m(训练集大小)增长的算法。通常定义为参数数量随m线性增长。换句话说,就是算法所需要的东西会随着训练集合线性增长,算法的维持是基于整个训练集合的,即使是在学习以后。
下面来看局部加权回归算法(Locally Weighted Regression):
局部加权回归算法一种特定的非参数学习算法,也称作Loess。由于它是非参数学习算法,这使得特征的选择对于算法来说没那么重要,也就避免了上面我们由于特征选择的不当导致的欠拟合和过拟合。
举个例子,有一组像这样的训练集合如下:
当我们对于一个确定的查询点X,在X处对假设H进行求值,在线性回归中,我们先拟合出使得损失函数最小化,求得,再返回我们要求的值,作为算法返回的结果。但是这样可能会拟合出上图中红色线这样的一条有些单调平坦的直线,这样的一条线当然不能很好的拟合这组数据。可能我们不断的修改特征,最后可能得到一组特征并得到适当的模型,但是如果我们使用局部加权回归算法可以使我们不需要做这些工作。
使用局部加权回归算法时,我们会先检查数据集合,并只考虑那些位于X周围固定区域内的数据点。然后取这些点,对于这个数据的子集使用线性回归,拟合出一条直线,再根据这条直线求出具体的值,作为算法返回的结果。
在线性回归中,我们要拟合使最小化。在局部加权回归算法中,对数据的子集使用的线性回归需要多加一个参数,我们要拟合使。其中,称之为权值,对权值的选择有很多,其中一种是:
这意味着,如果你有一个训练样本与非常接近,会非常小,那么,即。如此,我们就给那些离查询点较远的点赋予较小的权值,离的近的点赋予较大的权值。所以使用这种权值计算方法的效果是通过使用局部加权回归拟合出的一组参数向量。来更多的注重对临近点的精确拟合,同时忽略那些离的很远的点的贡献。我们还可以为这个权值函数做一点小的改变,加一个参数:
这个参数被称为波长参数,它控制了权值随距离下降的速率。如果较大,下降速度会非常慢,如果较小,下降速度会非常快。
总结:
对于局部加权回归,每进行一次预测,都要重新拟合一条曲线。但如果沿着x轴对每个点都进行同样的操作,你会得到对于这个数据集的局部加权回归预测结果,追踪到一条非线性曲线。由于每次进行预测都需要全部的训练数据(每次进行的预测得到不同的参数),没有固定的参数,所以是非参数算法。
局部加权回归的问题:
由于每次进行预测都要根据训练集拟合曲线,若训练集太大,每次进行预测的用到的训练集就会变得很大,学习效率很低,并且局部加权回归也不是一定就能避免欠拟合。有方法可以让局部加权回归对于大型数据集更高效,可以看之后的关于KD-tree的内容。
写的若有错误之处,欢迎大家批评指正!