说明

    回归问题、分类问题、聚类问题可以说是机器学习的三大基础问题。我在开设机器学习专栏机器学习_墨@#≯的博客-CSDN博客之前,就已经对回归和聚类有过一些介绍和实践,读者可以从博文[1] 关于最小二乘拟合与正则化的探讨 -CSDN博客、[2] (毫米波雷达数据处理中的)聚类算法(1) --- 概述-CSDN博客中获得更多的了解。 当时研究这些问题,是因为在毫米波雷达的数据处理中也会涉及到,但当时其实并没有意识到回归和聚类与机器学习的密切关系(后续我会将这几篇相关的文章录入机器学习专栏里)。

    回归问题是机器学习的基础,在众多的机器学习课程视频中,二维平面内的线性回归问题一般都是作为机器学习入门的例子来介绍的,比如经典的吴恩达的机器学习视频课[3]。

    在之前的博文[1]中,我探讨过一元多项式模型下的最小二乘拟合问题,并且对有关过拟合问题处理的正则化方法有一些基础介绍。不过这篇博文对一些概念并没有从更高的角度(比如从机器学习的角度)进行解释,也没有涉及多元(多特征)问题。本博文算是对博文[1]的补充,本文将从机器学习的角度,引入更广泛使用的梯度下降法对回归问题进行处理,并重点关注多特征回归问题。

Blog

2024.10.18 博文第一次写作

目录

说明

目录

一、回归问题概述

1.1 回归问题是什么

1.2 解决回归问题的基础和流程

二、回归问题的典型求解方法

2.1 梯度下降法

2.2 正规方程法

2.3 本章小结&两种方法对比

三、回归问题实践1 --- 样本特征数为1的情况

3.1 数据简介

3.2 基于正规方程法的求解

3.3 基于梯度下降法的求解

3.3.1 一元线性模型

3.3.2 多元线性模型

四、回归问题实践2 --- 基于数据集的实践(多特征)

4.1 数据简介

4.2 基于正规方程法的求解

4.3 基于梯度下降法的求解

五、总结

六、参考资料

七、数据和代码


一、回归问题概述

1.1 回归问题是什么

    回归和预测是分不开的,或者说回归就是为了预测。回归是指基于给定的数据样本(训练集),给出一个输出和输入之间关系的函数,随后,我们可以利用该函数,在给定输入时(从测试集中),给出对输出的预测值。如下图所示:

图1.1 回归问题处理流程架构

    用数学语言来表示,假设训练集中有m(m≥1)个样本,其可表示为:

                                         (1-1)

   yi为样本值,xi为样本特征,样本可以有多个特征(假定有n个,n≥1):

                                                       (1-2)

    比如我们要预测房子的价值(这也是第四章中将要实践的问题),那么特征x可以是:交易时间,房屋年龄,离最近交通枢纽的距离,周边的商场数,位置等所构成的向量,而样本值y则是房屋的价格。  在博文[1]以及本文后续第三章的实践中,我们的目标是拟合二维平面中y和x值之间的关系,此时特征就是横坐标值x,样本值y就是纵坐标的值。

    有了训练集后,此时我们需要想办法构造一个函数f,使其可以完成从输入到输出的映射:

                                                          (1-3)

1.2 解决回归问题的基础和流程

    搞清楚了问题是什么后,接下来就是如何解决该问题。有关机器学习的基础概念和典型的处理流程我在本专栏的第一篇文章[4]中有过介绍,机器学习问题的解决主要是围绕:模型、学习准则(代价函数)、优化算法这三要素展开的回归问题中,模型是解决我们要用什么类型的函数来进行拟合;学习准则解决我们进行拟合的目标是什么?;优化算法则是解决如何快速地达到我们的目标。

    关于模型:在博文[1]中使用的模型是一元多项式模型:

                          (1-4)

    一元多项式模型只能解决只有一个特征的情况(拟合平面内的曲线时,就只有横坐标值x这一个特征),而且需要预先设定多项式的阶数k,如果阶数设置得不合理,要么欠拟合,要么过拟合(博文[1]中讨论的正则化正是为解决多项式阶数设置得不合理而引入的)。  

    为解决多元回归问题,常用的是机器学习中最经典的线性模型

                       (1-5)

    式中,m为样本特征数。θ0也被称为偏置,其它θ值被称为权值。本文后续内容的实践部分就使用了该模型。

    当然,有一元多项式模型,也就有多元多项式模型

                (1-6)

    所谓的多元多项式模型,可以简单理解成就是各个特征的一元多项式模型的相加。表示第i个特征的j次方; 表示第j个特征的第i次幂的系数。(更深入的理解读者可以自行搜索别的资料)。

    此外还有其它的如非线性模型(我在博文[4]中有过一点介绍),不过本文不做讨论。

    关于学习准则(代价函数)所谓的学习准则,在回归问题中,从某种程度上我们可以将之理解成评价拟合效果好坏的标准(也是我们的目标)。博文[1]中用的准则是所拟合的曲线与全部训练样本值误差的平方和最小(均方误差最小):

                                         (1-7)

    式中m为训练集中的样本数,(博文[1]中没有除以2*m,一般来说要除以2*m,除以m是变成平均误差,除以2是方便后续的计算。   事实上,可以采用的基准还有很多,比如你可以使得拟合得到的曲线到各样本点的距离之和最小,或者使各观测点到拟合曲线的最大距离取最小值等等,甚至你自己可以涉及一些特殊的拟合的基准。不过, 使得各观测点到拟合曲线的偏差的平方和最小这个基准被证明是误差符合高斯分布时的最佳线性无偏估计,该方法下得到的估测误差也是呈正态分布的。

    回到式(1-7),有了该学习准则(又称代价函数或者损失函数)。我们要做的就是想办法得到某组θ值:

                             (1-8)

    使得最小。 这就需要用到优化算法。

    关于优化算法优化算法就是在给定了模型和优化准则后,设计算法对训练集的样本数据进行处理以得到符合优化准则的模型的参数值。 这是第二章将要论述的话题。

二、回归问题的典型求解方法

    优化算法有很多,宽泛点来说,针对前述学习准则,甚至可以使用我在之前的博文[5][6]中探讨过的粒子群算法和遗传算法来做迭代优化(不过这两种算法在拟合问题中的收敛效率极低,额,这里主要是想打个广告强行引用一下)。

    回归问题(乃至机器学习各类问题中)中最经典也最基础的优化算法是梯度下降法。本章主要围绕梯度下降法展开。

2.1 梯度下降法

    梯度下降法是一种通过迭代的方式,不断调整参数值,以使得目标函数的值逐渐减小,直至达到一个局部最小值或者全局最小值(如果目标函数是凸函数)。其理解起来很简单,网上也有很多的资料,吴恩达的机器学习课[3]前面几节主要就是在讲梯度下降法,很详尽和直观,读者可以移步观看。当然,我这里也简单做点说明,并给出结论公式。

    以最简单的二维平面中截距为0的直线拟合为例:

图2.1  直线拟合

    训练样本中只有一个特征x,此时我们用前述线性模型可以将模型建为:

                                                      (2-1)

    为进一步简化描述,这里默认截距θ0=0那么不同θ1下的拟合结果如图2.1的右图所示。基于均方误差的优化准则,我们可以得到损失函数为:

                                        (2-2)

    式中,m为训练样本数。不难发现,这其实是一个以θ为自变量的一元二次函数,此时,我们的目标是找到某个θ值,使该一元二次函数的值最小!(实际上这变成了初高中的数学问题了)。所谓的梯度下降法如下图所示:

图2.2  梯度下降法示意图

    假设我们取的初始θ值为a,梯度下降法就是让θ值一直减去损失函数对其的偏导数(一般我们还会乘以一个系数α,α>0,该系数又被称为学习率,学习率的存在可以让我们控制每次步进值的大小,以达到更好的收敛效果。  这里的学习率在机器学习中也被称为超参数,前面的权值和偏置是需要迭代求解的,是普通的参数。),直到其偏导数为0(此时取得极小值b,在绝大多数情况下,该损失函数为凸函数,此时的极小值也就是全局最小值)。  比如,从上图来看,当θ取在b的右边时,导数值大于0,此时θ值必然是减小的;当θ取在b的左边时,导数值小于0,θ会变大。

    前述分析中,为了简化问题,我们忽略了截距θ0从而使得损失函数是一条曲线(只有一个变量),如果考虑截距,前述曲线就变成了空间中的一个二维曲面,此时我们需要同时优化两个参数,原理是一样的。 进一步地(或者说更一般地),将前述方法拓展至多元便得到了梯度下降法的通用表达式

                                                     (2-3)

    将L(θ)的表达式(1-7)代入,得到:

                                  (2-4)    

    式中,θj为第j个特征的系数(权值);m为训练集中的样本数;α为学习率(大于0);则是上一次迭代下所得模型在第i个样本的特征输入下得到的模型输出值;yi是第i个样本的样本值;是第i个样本的第j个特征。

    在训练(学习)过程中,不断循环迭代各个θ值,直到满足迭代终止条件。迭代终止条件可以是某个设定的迭代次数、某个dθ阈值或者是某个损失值的变化值。于是我们可以归纳得到基于梯度下降法的回归问题处理流程图如下:

图2.3  梯度下降法典型的处理流程示意图

   

    此外,有个小的技巧点是:从式(2-4)来看,每次迭代时,我们对参数的更新是遍历了全部的样本点,这种遍历全部样本点的梯度下降法又被称为批量梯度下降法(这种方法的计算量大,不过收敛稳定)。此外,还有其它两个变体:随机梯度下降法小批量梯度下降法。所谓的随机梯度下降法是指:每次迭代只使用一个训练样本来计算梯度。这种方法计算量小,但收敛可能不稳定,容易陷入局部最小值。而小批量梯度下降法是指:每次迭代使用一部分训练样本来计算梯度。这种方法是批量梯度下降法和随机梯度下降法的折中,既保证了收敛的稳定性,又减少了计算量。

    本文的目的不在于尝试各类技巧,所以后续的实践中我使用的是批量梯度下降法。后两种方法可以在本文所提供代码的基础上很简单地进行修改。

2.2 正规方程法

    除前述迭代下的梯度下降法外,还有一种直接的正规方程法。其实从2.1的分析来看,梯度下降法是有解析解的:那就是代价函数对全部的参数(权值以及偏置)求偏导并使得全部的偏导等于0。

    如果我们对样本进行向量化:其样本值可以用Y来表示,Y是由训练集中m个样本的样本值构成的向量:

                                                           (2-5)

   给偏置θ0也加一个x0 = 1,训练集全部样本的特征可以表示为:

                                                   (2-6)

   由参数构成的向量为:

                                                            (2-7)

    此时,前式(2-2)的代价函数可以写成:

                                                      (2-8)

    我们的优化目标是使上式最小化。总之,经过一系列的推导(我在博文[1]中有过一些说明,或者读者可以查找其它资料),最终我们可以得到θ的表达式为:

                                                                (2-9)

    这便是所谓的正规方程,通过该式,我们只需要基于训练集的样本构建起矩阵并直接通过矩阵运算就能直接得到各个参数值。【我在博文[1]中实践过该方法,在一元问题中,预设了阶数后,如果阶数大于1,前述X矩阵中“后续的特征”,可以用x^2、x^3 …来代替。 实际上这从某种程度上来说是一种人为的特征转换?:基于已有特征x,构造了新的特征x^2、x^3,…

    此外需要留意的一个点是:式(2-9)能求解的一个必要条件是矩阵是可逆的。也就是说:所使用的样本特征中,不存在冗余特征(任意两个特征之间不能相互线性表示),此外,如果特征过多而样本过少,也可能会导致该矩阵不可逆。在实践中,前述两种情况需要注意。    不过即便不可逆,我们还是可以求伪逆(pinv)来得到。一般来说,矩阵不可逆的情况极少出现。

2.3 本章小结&两种方法对比

    本章以梯度下降法和正规方程法为例,论述了机器学习(本文针对回归问题)中的优化算法。

    这里对这两种方法做一个简单的对比,列表如下:

表3.1  两种优化算法的优缺点列表

算法

优点

缺点

梯度下降法

1.计算复杂度低,当特征数比较大时,对计算资源的需求小(会更快)。

2.梯度下降法在机器学习各类任务中都有广泛应用。

1.需要设置学习率(而学习率的选取对迭代收敛的影响有时候比较大,所以需要进行试验优选)

2.需要很多次迭代

3.当特征的数值太大时,需要做特征转换。

正规方程法

1.不需要设置学习率;

2.不需要迭代。

3.不要做特征转换。

1.需要计算矩阵相乘以及矩阵的逆,当特征数量很大时,计算速率急剧下降。

2.正规方程法只适用于回归问题。

    一般给的建议是:如果样本特征数超过1000,不建议使用正规方程法。在后文的实践中,我会使用这两种方法分别求解。

三、回归问题实践1 --- 样本特征数为1的情况

    本章探讨最基本的(也是可以可视化的)二维平面内的曲线拟合问题,样本只有一个特征:横坐标值x。

3.1 数据简介

    在博文[1]中我仿的是一个一元三次函数,这里以一元四次函数为拟合对象吧。处理的基本思路是:

图3.1  样本特征数为1的情形下的求解流程

本章的仿真中,对数据集的参数设计和设计结果如下:

表3.1  数据集参数设计列表

参数

X值(样本特征)

linspace(-2,2,400)

Y值(原始)

X^4 + x^3 + 3^2 + x + 1

Y值(样本值)

在原始值的基础上加SNR=10dB的高斯噪声。

训练集

将前述x和y的值顺序随机化后,取前2/3

测试集

将前述x和y的值顺序随机化后,取后1/3

图3.1  原始数据集

图3.2 训练集与测试集

    (注:因为对训练集和测试集是每次对生成的样本随机排序后再取得的,所以图3.2的结果可能和后面实践中对训练集和测试集的选取不一致)

    读者可以在我提供的代码的基础上很方便地调整参数,生成其它类型曲线对应的数据集。

3.2 基于正规方程法的求解

    在2.2节的理论指导下,我这里构建了一个一元四次多项式模型。再其基础上构造对应的矩阵并求解,部分代码如下:

3.3  正规方程解法部分代码示意

    最终得到的拟合结果如下:

图3.4  拟合结果(与训练集对比)

图3.5  拟合结果(与测试集对比)

    效果直观感觉还不错。当然也可以用得到的模型对测试集进行预测,并与测试集的样本值进行比较,并进而求得均方误差来获得更客观的评价:

图3.6 误差分布图

    有点像正态分布?(我这里设置的样本数量比较少,如果更多的话,应该会极限逼近正态分布,读者可以在后文提供的代码上进行尝试)。

图3.7 拟合得到的系数值、以及对测试集预测的均方误差值

    另:我这里直接使用的四阶多项式模型,读者可以尝试更低或者更高阶的模型看看效果,(会有欠拟合以及过拟合),更细节的说明我在博文[1]中已经有过探讨,本文不再展开。

3.3 基于梯度下降法的求解

    在2.1节的指导下,针对本章的数据集我设计了两种解法。

3.3.1 一元线性模型

    本章的数据只有一个特征。把线性模型应用到该特征上,对应的就是一个简单的直线模型:

                                                      (3-1)

    (我们已经知道数据集是一元四次多项式得到的,所以这里的直线模型很明显是不合适的,但是我这里还是按照直线模型来求解,在下一节再做其它讨论)。

    预设:学习率、θ值都是在(0,1)区间内随机产生,设置迭代次数为100次,基于式(2-4)在每次迭代下更新θ值。迭代完成后,得到的结果如下:

图3.8  损失值(均方误差)随迭代次数的变化曲线

    可以看到,在第五次迭代时,差不多就已经达到了最优解。画出拟合的曲线与训练集、测试集数据的对比:

图3.9  拟合效果图(与训练集对比)

图3.10  拟合效果图(与测试集对比)

    进一步地,使用学习得到的模型对测试集的数据进行计算并与测试集的样本值进行对比:

图3.11 预测误差分布

    模型的系数值以及预测的均方误差值为:

图3.12 模型系数值&预测均方误差值

    从图3.9-图3.12的结果来看,很明显是欠拟合的!其效果远差于3.2节中的求解结果。 欠拟合的原因也很简单:模型阶数太低。

3.3.2 “多元线性模型”

    如果将原有特征数增加呢? 其实从某种角度上来说3.2节中使用的一元四次多项式模型就是在x的基础上构造了: x^2、x^3、x^4这几个特征。同样地,本节我们也构造这几个特征,并创建一个四元线性模型:【因为是用现有特征的平方构造了新的特征,其实这已经是非线性模型了?不过可以用线性模型来理解】

                            (3-1)

    其中:x1为原数据样本的x值,x2为x^2,x3为x^3,x4为x^4。同样地,预设学习率、各θ值都是在(0,1)区间内随机产生。设置迭代次数为500次,基于式(2-4)在每次迭代下更新θ值。

    【补充:特征缩放因为梯度下降法其实对样本特征的大小很敏感,本节的特征相较于上一节,有x^4 这样比较大的值(x的取值最大为2,x^4已经到16了,一般认为绝对值超过3就应该做特征缩放)。为获得更好的收敛效果,与上一节不同,本节在进行模型训练之前,先对特征进行归一化处理。关于特征缩放,有几点需要明确:

1.只针对特征,不针对样本值;

2.测试集特征的缩放比例要和训练集一致;

3.特征缩放的方法有很多种。本节以及后文的4.3节都选用最简单的:各特征值除以全部测试样本下对应特征的最大值。

    迭代完成后,得到的结果如下:

图3.13  损失值(均方误差)随迭代次数的变化曲线

    可以看到,在约20次迭代后,差不多就已经很接近最优解。画出拟合的曲线与训练集、测试集数据的对比:

图3.14  拟合效果图(与训练集对比)

图3.15  拟合效果图(与测试集对比)

    进一步地,使用学习得到的模型对测试集的数据进行计算并与测试集的样本值进行对比:

图3.16 预测误差分布

    模型的系数值以及预测的均方误差值为:

图3.17 模型系数值&预测均方误差值

    从图3.13-图3.17的结果来看,效果还不错! 与3.2节得到的结果很接近!需要注意的是:用该模拟去做预测时,应该要对特征做缩放处理。或者把前述得到的系数值对应地进行之前对训练集每个特征的缩放(此时做预测时就不需要对测试集的样本特征进行缩放了):

图3.18 更新后的系数值

    这个就很接近所预设数据集的真实模型了。

四、回归问题实践2 --- 基于数据集的实践(多特征)

4.1 数据简介

    UCI[7]的数据我在之前有关聚类[8]以及分类[9]的博文中多次使用过,本章也从该数据库里面选取了一个可用于回归的数据集[10]。(该数据读者可以自行下载,我也将之和代码一并打包在了后文的数据和代码链接中)。

    这是一份有关房屋价值的数据集。其包含六个特征以及一个样本值:

    特征包括:交易日期、房屋年龄、离最近交通枢纽的距离、周边商场的数量、房屋的地理维度、地理经度。其样本值为房屋价格。该数据集一共有414个样本,样本已经被随机打乱。

    比较难可视化,我画了散点图,可以有个简单的了解:

图4.1 样本特征分布情况

图4.2  房屋价格分布情况

    类似上一章,我选取该数据前2/3作为训练集,后1/3作为测试集。在本章的实践中,只使用线性模型。

4.2 基于正规方程法的求解

    求解的流程和方法与3.2类似,这里似乎还简单些(不用构造新的特征)。得到的结果如下:

图4.3  模型对训练集样本价格的拟合结果

(价格分布图,左右两图的样本ID一一对应)

图4.4  模型对测试集样本价格的预测结果

(价格分布图,左右两图的样本ID一一对应)

    进一步地,可以得到预测的误差值以及均方误差值:

图4.5  误差分布图

    从上图的结果来看,似乎效果还行…  得到的参数值以及均方误差值为:

图4.6  系数值&均方误差值

4.3 基于梯度下降法的求解

    类似3.3.2节的处理,这里不需要构建特征,直接设计一个6元线性模型。预设学习率在(0,0.3)区间、各θ值在(0,1)区间内随机产生,迭代500次,同样,本节的处理也需要对特征进行缩放。

    迭代完成后,得到的结果如下:

图4.7  损失值(均方误差)随迭代次数的变化曲线

    可以看到,在约100次迭代后,差不多就已经很接近最优解。画出拟合的曲线与训练集、测试集数据的对比:

图4.8  拟合效果图(与训练集对比)

图4.9  拟合效果图(与测试集对比)

    进一步地,使用学习得到的模型对测试集的数据进行计算并与测试集的样本值进行对比:

图4.10 预测误差分布

    模型的系数值以及预测的均方误差值为:

图4.11 模型系数值&预测均方误差值

    从图4.7-图4.10的结果来看,效果还不错! 与4.2节得到的结果很接近!

五、总结

    本文对机器学习的基本问题之一:回归问题,做了比较系统、详尽的理论论述和实践在理论论述部分:在梳理回归问题有关概念时,着重论述了机器学习三要素:模型、学习准则(代价函数)、优化算法在回归问题中各自所扮演的角色,并进一步地给出了处理回归问题的典型流程。 在实践部分:分别构建了多项式模型和线性模型,并分别使用正规方程法和(批量)梯度下降法,对样本特征数为1和样本特征数为6的两份数据集进行了回归实践,回归的效果符合预期,验证了理论以及所编代码的正确性。 本文的工作为后续非传统机器学习(深度学习等)打下了基础。

    此外,这里对实践部分还存在的可供深入探讨的点做一些说明。

    1、其它的优化算法:本文只是实践了正规方程法和批量梯度下降法。批量梯度下降法的优点在于收敛稳定,但是因为每次迭代要遍历全部的样本,所以对计算资源的要求高(于是有了随机梯度下降、小批量梯度下降等)。此外,还有其它的优化算法,如:Adam(Adaptive Moment Estimation)、Adagrad(Adaptive Gradient Algorithm)等等。

    2、学习率的设置,我在本文的实践中,是随机地在(0,1)区间中选取,在实际应用时,我们需要确定地选取一个收敛效果最好(能快速收敛,但是也不会引起迭代到一定数量时突然发散)的学习率。  这个需要进行多次尝试。

    3、其它的特征缩放方法,本文只是使用了最简单的除以最大值的方法来进行特征缩放,还有其它性能更优的方法:如线性归一化、标准差归一化等等,在实际应用时,需要基于数据样本的具体特征,选用合适的缩放方法以达到更优解。

    4、本文也没有涉及欠拟合和过拟合的探讨(虽然我在博文[1]中有过一些讨论)。这两问题也可以做更深入的研究。

    5、从第四章的实践结果来看,虽然最后是收敛的,但其实我们拟合的效果并不是很好(均方误差值比较大,或者说是欠拟合的..)。如何进一步优化?类似第三章的处理,可能的方法是构造新的模型(增加阶数)。这是可以进一步研究的点。

    6、....

六、参考资料

[1] 关于最小二乘拟合与正则化的探讨 -CSDN博客

[2] (毫米波雷达数据处理中的)聚类算法(1) --- 概述-CSDN博客

[3] [中英字幕]吴恩达机器学习系列课程_哔哩哔哩_bilibili

[4] 机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理-CSDN博客

[5] 粒子群算法及基于该算法的典型问题求解实践-CSDN博客

[6] 遗传算法及基于该算法的典型问题的求解实践-CSDN博客

[7] Home - UCI Machine Learning Repository

[8] (毫米波雷达数据处理中的)聚类算法(2) – DBSCAN算法及其实践-CSDN博客

[9] SVM及其实践2 --- 对典型数据集的多分类实践-CSDN博客

[10] Real Estate Valuation - UCI Machine Learning Repository

七、数据和代码

本文涉及的数据和代码我已上传至如下链接:

回归问题探讨与实践博文对应的数据和代码资源-CSDN文库

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐