Datawhale开源学习,机器学习课程,项目地址:https://github.com/datawhalechina/leeml-notes
首先讲机器学习中的:回归,回归Regression可以做哪些东西呢?
输入为以往股票走势,预测未来走势
输入为无人驾驶检测的路况信息,输出为方向盘角度
输入为使用者A和商品B,输出为使用者A购买商品B的可能性
模型选择的步骤有三步:
那么以上这三步在之前的文章中也有提及,文章链接: 机器学习介绍
首先是模型假设,比如对于线性模型而言,可以根据特征多少来划分其为多少元的线性模型,如果只有一个特征 x c p x_{cp} xcp,那么线性模型可假设为 y = b + ω ∗ x c p y=b+\omega*x_{cp} y=b+ω∗xcp,所以 ω \omega ω和 b b b可以猜测很多模型:
当然实际应用中,由于特征数量不止一个,可能最终的结果和多个特征强相关,那么每个特征都有其相应的权重,就拿pokman中生物的cp值来说,其可能收到多个特征的影响,比如:物种类型、物种血量、物种的重量、物种的高度等等,那这时候就不仅只有一个 x c p x_{cp} xcp作为特征,特征有 x c p 、 x h p 、 x w e i g h t x_{cp}、x_{hp}、x_{weight} xcp、xhp、xweight等等,用线性模型表示就是: y = b + ∑ ω i x i y=b+\sum \omega_i x_i y=b+∑ωixi。
以上就是模型假设,有「单特征模型」和「多特征模型」两种大致分类,后面两个步骤的说明,我以单特征为例进行说明,一是为了简洁,而是为了方便理解。
对于单特征模型而言,要评估其模型的好坏,要将「预测模型」和「真实值」进行比对,求其方差即可。所以若有一系列预测数值,只需要统计真实值 y n y^n yn和预测值 f ( x c p n ) f(x^n_{cp}) f(xcpn)之间的方差即可,方差就是所谓的损失函数loss,即: ( y n − f ( x c p n ) ) 2 (y^n-f(x^n_{cp}))^2 (yn−f(xcpn))2。
比如统计10组原始数据的和,和越小模型越好,写出损失函数的公式就是:
L ( f ) = ∑ n = 1 10 ( y n − f ( x c p n ) ) 2 = ∑ n = 1 10 ( y n − ( b + ω ∗ x c p n ) ) 2 L(f)=\sum\limits_{n=1}^{10}(y^n-f(x^n_{cp}))^2=\sum\limits_{n=1}^{10}(y^n-(b+\omega*x^n_{cp}))^2 L(f)=n=1∑10(yn−f(xcpn))2=n=1∑10(yn−(b+ω∗xcpn))2
损失函数Loss分别由w和b确定,映射到二维坐标轴上时,就生成了一系列等高线,图像如下:
我们知道loss的大小决定了「预测模型」和「真实值」之间的差距,差距越小说明预测的越精准,因此就将问题转换成了求loss极小值的问题,也就是说,找到使得loss取最小值的w和b即可,那么我们可以通过梯度下降的方式不断迭代w和b的值,使得loss function迭代并取得一个极小值(这里之所以不一定取得最小值,是因为梯度下降不断迭代的时候可能只能陷入到某个极小值解中,而无法跳出该解,除非给梯度下降增加学习率,让其以更大幅度的迭代跳出当前的极小值而进入下一个极小值中,总之梯度下降便于我们去寻找极小值,而无法直接寻找到最小值),比如对于下图中的loss,计算对w的迭代:
上面也说到了学习率,那么什么是学习率?学习率就是移动的步长,如上图的 η \eta η,接下来我们来说下梯度下降迭代步骤:
>0
向右移动(增加 ω \omega ω)<0
向左移动(减少 ω \omega ω)重复以上步骤2和步骤3,知道找到极小值,以上就是梯度下降的过程,只不过根据随机选取的 ω 0 \omega^0 ω0的不同,很可能不断迭代后得到不同的极小值,不一定是最终的最小值,如下图:
以上都只是在说单个模型参数 ω \omega ω,便于理解,接下来引入两个模型参数 ω \omega ω和 b b b,这个过程需要做偏微分,过程如下,分别对 ω \omega ω和 b b b求偏导:
在求偏导数并且不断迭代的过程中,最终的loss会渠道一个较小的结果,比如说对于下图而言,相同等高线代表相同的loss,越往中心,越接近极小值,那么这张图就是loss function在不断迭代时的一个行为轨迹,会按照等高线切线的发现方向前进,这就是「梯度下降」,即按照梯度的方向下降:
那么以上就是梯度下降相关的知识,可以看到参数在迭代的过程中总是减去 η \eta η乘以对应参数关于loss的偏导数,根据其正负值进行迭代,那如果偏导数为0呢?或者趋近于0呢?又该如何解决?这也是梯度下降在当今现实世界中面临的挑战。
其实线性模型就是一个碗状模型,我们的目的就是找到最优解,但是往往由于很多模型的复杂性,导致在梯度下降的过程中,会出现偏导数为0或者趋近于0的情况,这样就会阻碍我们通过梯度下降去寻找最优解。
复杂模型与过拟合
通常在选取模型的时候,我们根据现有的已知数据去选择适合当下数据的模型,我们知道,若要让模型能够更加准确的预测更多的数据,变的「普世性」更强一些,那么我们需要更多的数据去建立更复杂的模型才行,所以往往随着数据量的增加,线性模型的局限性就出现了,通常一开始我们的做法是,将一元一次的线性模型变为一元二次的线性模型,甚至三次、四次等等,使得我们的线性模型能够进行更加复杂的表示,来拟合更多的数据,随着模型不断变的复杂,也确实让测试的loss变的越来越小,拟合的数据也越来越准确,但是「越来越准确」的前提是「只是基于当前已有数据进行的拟合」,那这就会引出一个问题,叫做「过拟合」。
什么是过拟合?为了能够拟合当下数据,而不断增加模型复杂度,使得模型为了「拟合」而「拟合」,反而丧失了模型的「普世性」,当加入一个新的数据时,该数据可能并不能被已有模型很好的预测到。
由上图可以得出结论就是,越简单的模型是越复杂的模型的一个子集,也就是复杂模型能够拟合出更多的信息,但是往往「过多的信息」反而会影响到真实的预测。接下来就是:如果出现过拟合,我们该如何解决这样的问题呢?主要方法有以下三点: