1、第8章 回归算法 回归算法是一种预测连续型变量的方法。它的根本思想是通过已给样本点的因变量和自变量的关系,进而设定一个数学模型,来拟合这些样本点。回归算法就是为了找到最佳的模型。回归方法的核心有两个。第一,假设合适的模型,比如使用一次曲线拟合,还是用二次曲线拟合?第二个是寻找最佳的拟合参数,不同的参数对应了模型的不同的形态,如何找到最佳的参数是关键的一步。8.1 从二次函数到机器学习 在高中的数学知识体系中,我们寻找二次曲线的最大值和最小值的方法是令导数为0,这样的方法也可以用在求解回归算法的问题中。但是在机器学习领域并不推崇这种思想,因为再实际应用中,使用导数为0的方法,会增加计算机计算的复
2、杂度,消耗大量计算资源。而机器学习的求解方法则会在高维空间的求解中体现出计算的优势。本章会详细介绍机器学习中求解回归曲线的方法梯度下降。并从求解二次曲线为起点,比较导数方法与梯度下降方法的异同,从而加深对梯度下降方法的理解。8.1.1 二次函数最优求解方法在高中时期,大家经常遇到函数最大值、最小值的求解问题。比如,给出方程,求其最小值(y值),以及最小值的所在位置(x值)。如图8.1所示,我们很容易看出的最小值是0,最小值的位置是。在高中我们使用的求解方法是求曲线的导数,令,求得。导数求解的方法的几何解释是最低点的位置是斜率为0的位置,也就是的位置。大家觉得这不就是简单的高中知识吗,机器学习有
3、什么联系呢?其实现在比较火热的深度学习和经典的线性回归、逻辑回归算法,最根本的思想就是求解类二次曲线的最小值。我们后续章节会深入探讨深度学习背后的数学思想。接下来,我们介绍机器学习中,求解二次函数最小值的方法。图8.1 二次函数曲线8.1.2 梯度下降 在已知曲线是,我们很容易通过求导来求得最小值以及它的位置。但如果你不知道曲线的全貌是,又该如何求解呢?如图8.2所示,现在已知点,6400和这个点周围曲线的形状。现在的任务是找到该曲线的最小值的点,你应该如何做呢?图8.2 二次函数曲线(部分)设想一下,你站在半山坡上,看不到山顶,也看不到山谷,只能看到周围的情景,你要下山,你要怎么做呢?对,沿
4、着山坡最大的坡度向下走!当走到下一个位置时,再选择最大的坡度向下走,这样不停的走,我们就可以走到山下。让我们一起来看一下,这个思想在数学上的解释。回到图8.2,按照下山的思想,我们应该将点向左移动一点。如图8.3所示,我们从点(80,6400)移动到了点(72,5184)。同样的道理,在这个点我们观察一下,应该继续向左移动。如图8.4所示,我们现在移动了点(64.8,4199.04)的位置,同样的道理,继续观察,我们还应该向左移动,这样循环往复,我们会不会走到山底呢?图8.3 二次函数曲线(部分)图8.4 二次函数曲线(部分)如图8.5所示,我们移动了93次,最终到达了点(0,0)位置(这里计
5、算精度是小数点后两位),也就是说我们已经逼近了最小值(0,0)点。在此过程中每一步下降过程的坐标。我们用梯度下降的方法实现了求解二次函数的最小值,虽然他不像导数方法那么完美能直接定位到原点(0,0),但是只要我们增加迭代次数,我们就能无限接近最小值点。接下来,我们需要懂得,梯度下降的一些细节,比如每次步长应该如何选择呢?如果步长选择太大,很有可能会越过最小值点。图8.5 二次函数曲线(部分)8.1.3 梯度下降python实现 已知函数,以及它的导数。伪代码:第1步,随机初始化一个坐标()第2步,将移动至位置,记为,并求出。这里是所谓的学习速率,是该点的导数。第3步,重复第二步,获得()点。第
6、1000步,获得()点的位置。Python实现:8.1.4 初始值的选择与学习速率的选择初始值的选择依托于所假设的数学模型,这里的数学模型会在今后的章节讨论。不同的数学模型反映在二次函数上则会是随机的初始点。速率的选择是以梯度下降思想的核心,选择直接影响了最后结果的好坏以及整个算法的效率。1.过小,将导致无法找到最小值如图8.6所示,初始点我们选择(100,100),当时,移动了100次,才到达x=55附近。虽然在这种情况下我们仍可以增加移动次数最终到达最小值的点,但是却耗费了大量的时间和算力。特别是在工程应用中,时间和算力决定了一个算法是否有实际价值。而在极端情况下,当足够小,将无法到达最小
7、值点。图8.6 过小导致迭代速度极慢 2.适中,将很快达到最小值 如图8.7所示,初始点我们选择(100,100),当时,只移动了2次就到达的最小值。图8.7 很快达到最小值 3.一定阈值,可能从两侧收敛到最低点 如图8.8,表8.2所示,初始点我们选择(40,1600),当时,将从两端收敛到最小值。表8.2 从两端收敛到最小值(保留2位小数)4.一定阈值,可能导致来回震荡 如图8.9所示,初始点我们选择(40,1600),当时,移动点将在(40,1600),(-40,1600)来回震动图8.8 从两端收敛到最小值图8.9 导致来回震荡 5.过大,将导致无法找到最小值,甚至发散 过小,虽然可能
8、到达不了最小值的点,但是移动的方向仍是正确的,既向着最小值方向移动。但过大,则可能造成偏离最小值的情况,既向着最小值的反方向移动。如图8.10,表8.3所示,初始点我们选择(20,400),当时,每次移动都跨越了最低值,而且越来越偏离最小值。图8.10 ,过大导致发散,无法收敛到最小值 表8.3 过大导致无法收敛到最小值(保留2位小数)综上所述,我们可以总结到的选择规律:既随着学习速率的递增,学习过程从速度极慢,到两边震荡收敛,再到两边震荡发散。那么在实际应用中我们应该如何选择呢?这个要根据不同的应用场景来具体设置。到目前为止,我们已经详细了解了机器学习中一个很重要的思想,既“梯度下降”。它是
9、线性回归,逻辑回归以及神经网络的核心思想,接下来就让我们看一下梯度下降是如何应用到这三类算法中的。8.2 线性回归 所谓的线性回归就是已知样本分布,选择合适的曲线取拟合它们,然后用拟合曲线预测新的样本。如图8.11所示,假设坐标系中有三点1,2,3,1,3,3,我们的目的是找一条经过(0,0)点的直线取拟合它们。图8.11 坐标系中三点1,2,3,1,3,3 如果不使用数学工具,直接用手画的话,我们很容易获得这样的直线。图下图8.12所示。这条曲线最大程度上拟合了三个点。那么如何用数学方法获得这个曲线呢?图8.12 手画拟合曲线8.2.1 回归曲线的数学解释8.2.2 梯度下降方法求解最优直线
10、图8.12 初始化直线 如图8.14,我们设置学习速率,直线初始化位置,右边图片记录了每次迭代直线的位置。我们迭代124次,得到了最优的直线。迭代过程,具体数据如表8.4所示。图8.14 梯度下降法求最优曲线8.2.3 理解“机器学习”中的“学习”至此,我们通过梯度下降方法求解了机器学习中一个重要的问题线性回归。您是否已经通过这个过程理解了“机器学习”中“学习”的意思?在求解最优直线过程中,我们随机假设一条直线,然后获得他与最优解的距离(差距),我们找到了到最优解的方向(曲线斜率),然后按着这个方向以一定的步长(学习速率)不断的移动(学习过程),最终得到了最优解。这就是所谓的“学习”。8.2.
11、4 导数求解与梯度下降 为什么在得到损失函数后不直接令,而求得最优的参数呢?这样只要一步,而且可以获得最优解,而不是像梯度下降方法一样,只能无限接近。因为我们所举的例子,只有一个参数,而在现实应用中,可能有n个参数,随着数量的增加,导数求解的方法的复杂度会急剧上升,计算的性能会下降。这时梯度下降的优势就展现出来了,梯度下降即使在面对高维空间求解(多个参数),计算性能也会很好。8.2.5 学习速率与迭代次数如何设置 具体情况应该看具体的模型以及损失函数。在实际应用中我们可以打印出每一次迭代的所有数据,与8.1.4章节中的情况相比对,从而得出最优的学习速率。一般情况下,取。而迭代次数也是决定最终模
12、型好坏的关键因素,同样的,在第一次迭代模型的时候可以设置一个比较大的值,每次迭代观察系数的变化。根据这些值获得最优的迭代值。一般设置迭代次数为1000。8.3 实战糖尿病患者病情预测回归算法被广泛应用于医学领域。本章节我们将通过糖尿病患者的体重,预测糖尿病患者接下来病情发展的情况。在实际应用中,我们就可以根据这样的预测模型,提前预知病患的病情发展,从而提前做好应对措施,改善患者的病情。(1)导入必要的模块。这里我们用到了sklearn中的diabetes数据集,所以要先导入数据集模块。然后我们会使用线性回归模型,所以导入了linear_model模块。在最后我们需要对模型进行评估所以需要导入m
13、ean_squared_error,r2_score模块。(2)导入数据集。(3)观察目标变量。这里我们导入目标变量,并对它的一些信息进行观察。(4)观察体重指标变量。这个模型中,我们主要想通过体重指标来预测目标变量,所以通过numpy的索引方法取得体重相关的数据。(5)处理训练集和测试集。分别对因变量和自变量进行分组,通过训练集来训练我们的模型,然后通过测试集评价我们的模型。这里取训练集和测试集是手工的方法,sklearn中还提供了专有的方法来取训练集和测试集。具体请看第6章。(6)训练模型并预测。(7)查看模型评价。(8)作图,如图8.14所示。通过模型我们可以看出,随着体重指标的增加,病情的级数也在增加。通过这个模型我们就可以预测某位患者接下来一年内病情将会如何发展。当然通过多变量分析我们可以得到更好的模型。图8.14 模型拟合曲线