☰
机器学习回归算法全解析:从线性回归到树模型与神经网络
2026/9/26 1:37:59 网站建设 项目流程

1. 回归到底在解决什么问题

1.1 从“预测一个数”说起

回归这个词听起来很学术,但说白了就一件事:给定一些输入,预测一个连续的数值输出。比如你知道一套房子的面积、地段、楼层、房龄,想预测它的成交价;你知道明天温度、湿度、风速,想预测当天的用电量;你知道一辆车的品牌、排量、车龄,想预测它的二手残值。这些场景的共同点是——你要预测的不是“是或否”“猫或狗”这种离散类别,而是一个可以取任意实数的数值。

这就是回归和分类最本质的区别。分类的输出是有限的几个标签,回归的输出是一条连续的数值轴上的任意点。很多人刚入门机器学习的时候会把两者搞混,觉得“预测房价”和“预测房子会不会卖出去”差不多,其实前者是回归,后者是分类,模型选型、损失函数、评估指标完全不一样。

我在实际项目里见过不少新手拿着逻辑回归去做房价预测,结果输出永远在0到1之间,怎么调都不对。问题就出在没搞清楚任务类型。逻辑回归虽然名字里有“回归”,但它本质上是分类算法,输出的是概率,不是连续值。这个坑后面我会详细讲。

1.2 回归在机器学习里的位置

机器学习处理的任务大致可以分成几大类:分类、回归、聚类、降维、强化学习等。回归是其中最基础、应用最广泛的一类。你去看任何一本机器学习教材,回归几乎都是第一个讲的算法,原因很简单——它的数学形式直观,评估方式清晰,而且很多复杂模型的思想都能从回归里找到影子。

从技术演进的角度看,回归模型大致经历了这么几个阶段:最开始的线性回归,用一条直线去拟合数据;后来发现直线不够用,就有了多项式回归、岭回归、Lasso回归这些变体;再后来树模型崛起,回归树、随机森林回归、XGBoost回归、LightGBM回归在工业界大杀四方;最近几年高斯过程回归在小样本场景下表现亮眼,神经网络回归在数据量大的时候也能打。

你不需要一上来就学最复杂的。我的建议是先把线性回归吃透,理解清楚损失函数、梯度下降、正则化这些核心概念,后面再学树模型和神经网络回归会轻松很多。因为那些复杂模型说到底还是在解决同样的问题——怎么让预测值更接近真实值,怎么防止过拟合,怎么在新数据上表现稳定。

1.3 谁适合看这篇内容

这篇内容面向的是想系统搞懂回归的机器学习入门者和有一定基础但想查漏补缺的从业者。如果你正在准备期末考试、面试,或者手头有一个回归项目不知道从哪下手,这篇内容应该能帮到你。

我会从最基础的线性回归讲起,一路讲到树模型回归和神经网络回归,中间穿插大量实操细节、参数解释和踩坑经验。代码以Python为主,因为Python生态里的scikit-learn、XGBoost、LightGBM这些库实在太方便了,几行代码就能跑起来。但我也见过很多用MATLAB做回归的项目,比如RVM多输出回归模型,所以关键步骤我会尽量讲清楚原理,方便你用任何工具复现。

2. 线性回归:回归分析的起点

2.1 一元线性回归的数学直觉

一元线性回归就是用一个自变量x去预测因变量y,形式是y = wx + b。w是斜率,b是截距。你有一堆数据点,想找一条直线,让所有点到这条直线的距离之和最小。这个“距离”通常用残差平方和来衡量,也就是每个点的真实值减去预测值,平方后加起来。

为什么用平方而不是绝对值?因为平方函数处处可导,求最小值的时候方便用微积分。绝对值在零点不可导,处理起来麻烦。而且平方会放大较大误差的影响,让模型更关注那些偏离很远的点。当然这也带来一个问题——如果数据里有极端异常值,平方会让它影响特别大,这时候可能要考虑用Huber损失或者直接剔除异常值。

求解w和b有解析解,直接套公式就行。但实际项目中我们很少手算,都是用库。不过理解解析解的推导过程对后面理解梯度下降很有帮助。简单说就是对损失函数分别求w和b的偏导,令偏导为零,解方程组。这个过程在吴恩达的机器学习课程里讲得很清楚,建议手推一遍。

2.2 多元线性回归与特征工程

现实中的回归问题几乎都是多因素的。预测房价不可能只看面积,还要看地段、楼层、朝向、房龄、周边配套等等。多元线性回归的形式是y = w1x1 + w2x2 + ... + wnxn + b,写成矩阵形式就是y = Xw + b。

这里有个关键点:特征的质量比模型的选择更重要。我做过一个二手房价格预测的项目,一开始只用了面积、房龄、楼层这几个原始特征,R²只有0.6左右。后来加了“到最近地铁站的距离”“周边三公里内学校数量”“小区容积率”这些衍生特征,R²直接跳到0.85。模型没换,还是线性回归,效果提升主要来自特征工程。

特征工程包括几个方面:缺失值处理、异常值处理、特征缩放、特征编码、特征交叉。缺失值可以用均值、中位数、众数填充,也可以用模型预测填充。异常值可以用箱线图、Z-score、IQR来识别。特征缩放对线性回归不是必须的,但对梯度下降收敛速度影响很大,标准化之后通常收敛更快。类别特征要做独热编码或者标签编码,具体用哪种取决于类别是否有序。

2.3 损失函数与梯度下降

线性回归的损失函数是均方误差(MSE):MSE = (1/n) * Σ(yi - ŷi)²。训练的目标就是找到一组参数w和b,让MSE最小。

当特征维度不高的时候,可以直接用正规方程求解:w = (XᵀX)⁻¹Xᵀy。这个公式一步到位,不需要迭代。但它有两个问题:一是矩阵求逆的计算复杂度是O(n³),特征多了会很慢;二是如果XᵀX不可逆(比如特征之间有完全共线性),就没法直接求。所以实际中更常用梯度下降。

梯度下降的思路是:先随机初始化参数,然后计算损失函数对每个参数的梯度,沿着梯度的反方向更新参数,一步步逼近最小值。学习率控制每一步走多大。学习率太小收敛慢,太大可能震荡甚至发散。我一般会先试0.01、0.001、0.0001这几个值,看损失曲线的下降情况来调整。

批量梯度下降每次用全部数据算梯度,稳定但慢。随机梯度下降每次用一个样本,快但震荡大。小批量梯度下降折中,每次用一小批数据,是实际中最常用的。scikit-learn的SGDRegressor就是小批量梯度下降的实现。

2.4 正则化:岭回归与Lasso回归

线性回归有个致命问题:当特征很多或者特征之间高度相关时,模型容易过拟合。正则化就是用来解决这个问题的。它的思路是在损失函数里加一个惩罚项,限制参数的大小。

岭回归(Ridge)加的是L2惩罚项:Loss = MSE + α * Σwi²。L2惩罚会让参数整体变小,但不会变成零。Lasso回归加的是L1惩罚项:Loss = MSE + α * Σ|wi|。L1惩罚有个特性——它会把一些不重要的特征系数直接压到零,相当于自动做了特征选择。

α是正则化强度,越大惩罚越重。α太大模型会欠拟合,太小又起不到正则化效果。通常用交叉验证来选α。我一般会试[0.001, 0.01, 0.1, 1, 10]这几个值,看验证集上的表现。

ElasticNet是岭回归和Lasso的结合,同时加L1和L2惩罚。当特征之间有相关性的时候,ElasticNet的表现通常比纯Lasso好,因为Lasso在相关特征中只会随机保留一个,而ElasticNet会保留一组。

注意:做正则化之前一定要对特征做标准化,否则惩罚项对量纲敏感,大数值特征会被过度惩罚。

3. 树模型回归:工业界的主力

3.1 回归树的基本原理

回归树是把特征空间划分成若干个区域,每个区域用一个常数(通常是该区域所有样本的均值)来预测。划分的过程是递归的:每次选一个特征和一个切分点,把数据分成两份,让两份的MSE之和最小。

这个过程和分类树很像,区别在于分类树用基尼系数或信息增益来选切分点,回归树用MSE。回归树的叶子节点输出的是均值,不是类别。

回归树的优点很明显:不需要特征缩放,能自动处理非线性关系,对异常值相对鲁棒,解释性也不错。缺点是单棵树容易过拟合,而且对训练数据的变化很敏感——数据稍微变一点,树的结构可能完全不一样。

我刚开始用回归树的时候,发现训练集R²能到0.99,测试集只有0.5,典型的过拟合。后来加了剪枝和限制树深,情况好很多。控制树复杂度的方法包括:限制最大深度、限制叶子节点最小样本数、限制分裂所需最小样本数、后剪枝等。

3.2 随机森林回归

随机森林是用bagging思想把多棵回归树组合起来。每棵树用有放回抽样得到的子集训练,分裂时只考虑随机选取的一部分特征,最后把所有树的预测值平均。

这样做的好处是降低了方差。单棵树可能对某些样本过拟合,但多棵树平均之后,过拟合的部分互相抵消,整体泛化能力更强。随机森林几乎不需要调参就能得到不错的效果,是我做回归任务时的首选baseline。

关键参数有几个:n_estimators(树的数量)、max_depth(最大深度)、min_samples_split(分裂所需最小样本数)、min_samples_leaf(叶子节点最小样本数)、max_features(每次分裂考虑的特征数)。n_estimators通常越大越好,但计算成本也越高,一般设100到500之间。max_features对回归任务通常设特征总数的1/3。

随机森林还能输出特征重要性,这对理解哪些特征对预测贡献大很有帮助。不过要注意,特征重要性是基于训练集算的,如果特征之间有相关性,重要性会被分散,解释的时候要小心。

3.3 XGBoost与LightGBM回归

XGBoost和LightGBM是梯度提升树(GBDT)的代表实现。和随机森林的bagging不同,GBDT是boosting——每棵树都在拟合前面所有树的残差,一步步把预测值逼近真实值。

XGBoost在GBDT基础上做了很多优化:二阶泰勒展开、正则化项、列采样、并行计算等。LightGBM则进一步优化了分裂点的寻找方式,用直方图算法代替预排序,速度更快,内存占用更小。在大数据场景下,LightGBM通常比XGBoost快好几倍。

这两个模型在工业界的回归任务里几乎是标配。我做过一个销量预测的项目,用线性回归R²只有0.7,换成LightGBM之后R²到了0.92。当然这也和特征工程有关,但树模型捕捉非线性关系的能力确实强很多。

调参方面,XGBoost和LightGBM的参数很多,但核心的就那么几个:learning_rate(学习率)、n_estimators(树的数量)、max_depth(最大深度)、subsample(样本采样比例)、colsample_bytree(特征采样比例)、reg_alpha和reg_lambda(正则化)。我一般先用默认参数跑一遍,然后根据验证集表现逐步调整。学习率和树的数量要一起调,学习率小的时候树要多一些。

实操心得:LightGBM的num_leaves参数比max_depth更重要,因为它用的是leaf-wise生长策略。num_leaves太大容易过拟合,一般控制在2的max_depth次方以内。

3.4 树模型回归的实操流程

用树模型做回归,我通常按这个流程走:

  1. 数据清洗:处理缺失值、异常值,把类别特征编码成数值。
  2. 特征工程:构造衍生特征,做特征选择。
  3. 划分数据集:训练集、验证集、测试集,比例大概6:2:2。
  4. 基线模型:先用随机森林跑一个baseline,看大概能到什么水平。
  5. 模型调参:用网格搜索或贝叶斯优化调XGBoost或LightGBM的参数。
  6. 交叉验证:用K折交叉验证评估模型稳定性。
  7. 特征重要性分析:看哪些特征贡献大,反过来指导特征工程。
  8. 模型融合:如果单个模型不够,可以试试多个模型的加权平均。

这个流程不是死的,实际项目中经常要来回迭代。比如特征重要性分析发现某个特征特别重要,但它的构造方式可能还有优化空间,那就回去改特征,重新跑一遍。

4. 神经网络回归与高斯过程回归

4.1 神经网络做回归的要点

神经网络做回归,输出层通常是一个线性神经元,不加激活函数。损失函数用MSE或MAE。隐藏层的激活函数用ReLU或Tanh,输出层不用激活函数,因为回归的输出范围是负无穷到正无穷。

和分类任务相比,回归任务用神经网络有几个需要注意的地方。第一,输出层不能加Sigmoid或Softmax,否则输出会被限制在0到1之间。第二,损失函数的选择要考虑异常值的影响,MSE对异常值敏感,MAE更鲁棒但梯度不稳定,Huber损失是折中。第三,神经网络的参数量大,需要足够的数据才能训好,小样本场景下容易过拟合。

Transformer做回归是最近比较火的方向。传统Transformer主要用于序列任务,但把输出层改成回归头之后,也能做回归预测。比如在视觉跟踪领域,有研究用概率回归的方法让Transformer输出目标位置的概率分布。在语言模型预训练中,也有把数据混合比例作为回归任务来优化的思路。这些应用说明回归的思想可以嵌入到各种复杂模型里。

用TensorFlow或PyTorch写一个回归网络其实很简单。以PyTorch为例,定义一个几层的全连接网络,最后一层输出维度设为1,损失函数用MSELoss,优化器用Adam,就能跑起来。关键是要做好数据标准化,因为神经网络对输入尺度很敏感。

4.2 高斯过程回归:小样本场景的利器

高斯过程回归(GPR)是一种贝叶斯方法,它假设数据点之间的联合分布服从高斯分布,用核函数来刻画点与点之间的相关性。GPR的优点是在小样本场景下表现很好,而且能给出预测的不确定性——不仅告诉你预测值是多少,还告诉你这个预测有多可信。

我做过一个仿真数据预测的项目,样本量只有几百条,试了线性回归、随机森林、XGBoost,效果都一般。换成高斯过程回归之后,预测精度明显提升,而且预测区间很有参考价值。GPR的缺点是计算复杂度是O(n³),样本量大了跑不动,通常适用于几千条以内的数据。

核函数的选择对GPR影响很大。常用的有RBF核、Matern核、周期核等。RBF核适合平滑函数,Matern核适合有一定粗糙度的函数。核函数的参数通过最大化边际似然来优化。scikit-learn的GaussianProcessRegressor用起来很方便,但要注意先对数据做标准化。

4.3 多输出回归与RVM

多输出回归是指同时预测多个相关的连续目标。比如预测一个地区的温度、湿度、风速,这三个目标之间可能有关联,单独建模会忽略这种关联。多输出回归可以共享特征表示,提升整体预测精度。

RVM(相关向量机)是一种稀疏贝叶斯模型,和SVM类似但输出的是概率。MATLAB里有RVM的工具箱,可以实现多输出回归。RVM的优点是不需要像SVM那样调C和gamma参数,而且能给出预测方差。不过RVM的训练速度比SVM慢,样本量大的时候不太实用。

多输出回归的实现方式有几种:一种是每个目标单独训一个模型,简单但忽略目标间关联;另一种是共享底层特征,每个目标一个输出头;还有一种是多任务学习,把多个目标放在一个模型里联合优化。具体用哪种取决于目标之间的相关性,如果目标高度相关,共享表示的方式通常更好。

5. 回归项目的完整实操流程

5.1 数据准备与探索性分析

拿到数据之后,第一件事不是急着建模,而是先做探索性数据分析(EDA)。看看数据有多少行多少列,每个特征的类型是什么,缺失值比例多少,分布是什么样的,和目标变量的相关性如何。

我一般会用pandas的describe()看数值特征的统计量,用info()看数据类型和缺失情况,用corr()看特征之间的相关性。然后画几个图:目标变量的直方图看分布,特征和目标变量的散点图看关系,特征之间的热力图看共线性。

这一步很关键,因为很多问题在EDA阶段就能发现。比如目标变量严重偏态,可能需要做对数变换;某个特征缺失率超过80%,可能直接删掉;两个特征相关系数超过0.95,可能只需要保留一个。

5.2 特征工程的核心步骤

特征工程是回归项目里最耗时间但也最出效果的部分。我通常从这几个方向入手:

  • 缺失值处理:数值特征用中位数填充,类别特征用众数填充,或者用模型预测填充。
  • 异常值处理:用IQR或Z-score识别,根据业务逻辑决定是剔除还是截断。
  • 特征缩放:标准化或归一化,线性回归和神经网络必须做,树模型不需要。
  • 类别编码:独热编码适合低基数类别,标签编码适合有序类别,目标编码适合高基数类别。
  • 特征交叉:把两个特征组合成新特征,比如面积乘以单价得到总价。
  • 时间特征:如果数据有时间维度,可以提取年、月、日、星期、是否节假日等。
  • 聚合特征:按某个维度分组后计算统计量,比如每个用户的平均消费金额。

特征工程没有固定套路,更多是靠对业务的理解和反复试验。我一般会先构造一批候选特征,然后用特征重要性或递归特征消除来筛选。

5.3 模型训练与超参数调优

模型训练不是把数据丢进去跑一遍就完事。我通常会把数据分成训练集、验证集、测试集。训练集用来训模型,验证集用来调参和选模型,测试集只在最后评估一次,避免数据泄露。

超参数调优的方法有网格搜索、随机搜索、贝叶斯优化。网格搜索适合参数少的情况,随机搜索适合参数多的情况,贝叶斯优化在参数空间大的时候效率最高。我一般先用随机搜索粗调,再用网格搜索在最优区域细调。

交叉验证是评估模型稳定性的重要手段。K折交叉验证把数据分成K份,每次用K-1份训练,1份验证,重复K次取平均。K通常取5或10。如果数据有时间顺序,要用时间序列交叉验证,不能随机打乱。

5.4 模型评估与结果解读

回归模型的评估指标主要有几个:

指标含义特点
MSE均方误差对异常值敏感,量纲是目标变量的平方
RMSE均方根误差量纲和目标变量一致,最常用
MAE平均绝对误差对异常值鲁棒,解释直观
R²决定系数表示模型解释了多少方差,越接近1越好
MAPE平均绝对百分比误差适合比较不同量纲的目标

R²有个坑:如果模型预测所有样本都输出均值,R²是0;如果模型比均值还差,R²会是负数。所以看到负的R²不要惊讶,说明模型还不如直接猜均值。

评估的时候不能只看一个指标,要结合业务场景。比如预测房价,RMSE是10万,如果房价均值是500万,那这个误差可以接受;如果房价均值是50万,那误差就太大了。MAPE能帮你判断相对误差的大小。

残差分析也很重要。把预测值和残差画散点图,如果残差随机分布,说明模型没有系统性偏差;如果残差有规律,说明模型漏掉了某些非线性关系或交互项。

6. 常见问题与排查技巧

6.1 过拟合与欠拟合的判断和处理

过拟合的表现是训练集表现很好,验证集表现差很多。处理方法包括:增加数据量、减少特征数量、加正则化、降低模型复杂度、用集成方法。欠拟合的表现是训练集和验证集表现都不好。处理方法包括:增加特征、提高模型复杂度、减少正则化强度。

判断过拟合还是欠拟合,最直接的方法就是看训练集和验证集的学习曲线。如果两条曲线随着数据量增加逐渐靠拢,说明过拟合不严重;如果两条曲线都很低且平行,说明欠拟合。

我一般会先跑一个简单模型看baseline,如果baseline就过拟合,说明特征太多或者数据太少;如果baseline欠拟合,说明特征不够或者模型太简单。

6.2 数据泄露的识别与避免

数据泄露是回归项目里最隐蔽也最致命的错误。它指的是训练时用到了预测时拿不到的信息,导致验证集表现虚高,上线后效果暴跌。

常见的数据泄露场景包括:在划分数据集之前做了标准化或填充缺失值,导致验证集的信息泄露到训练集;用未来数据预测过去;目标编码时用了全量数据的统计量。避免的方法是:所有预处理步骤都在训练集上fit,然后transform验证集和测试集;时间序列数据要按时间划分;目标编码要用交叉验证的方式计算。

6.3 多重共线性的影响与解决

多重共线性是指特征之间高度相关,导致线性回归的系数估计不稳定。表现是系数符号和业务直觉相反,或者稍微换一批数据系数就大变。检测方法是看方差膨胀因子(VIF),VIF大于10通常认为有严重共线性。

解决方法有:删除相关性高的特征之一、用PCA降维、用岭回归或Lasso回归。树模型对多重共线性不敏感,所以如果用了XGBoost或LightGBM,这个问题基本不用太担心。

6.4 常见问题速查表

问题可能原因排查方向解决方法
训练集R²高,测试集R²低过拟合看学习曲线加正则化、减特征、增数据
训练集和测试集R²都低欠拟合看特征重要性加特征、换复杂模型
系数符号与业务直觉相反多重共线性算VIF删特征、用岭回归
预测值范围异常数据泄露或尺度问题检查预处理流程重新划分数据、标准化
损失函数不下降学习率问题看损失曲线调学习率、换优化器
验证集表现波动大数据量不足或分布不均看交叉验证结果增数据、分层采样

避坑技巧:做回归项目一定要先跑一个最简单的baseline,比如用目标变量的均值作为预测值,看看R²是多少。如果复杂模型的R²还不如均值模型,说明哪里出问题了。

7. 回归在不同场景下的应用要点

7.1 金融风控中的回归应用

金融风控里回归常用于预测违约损失率、客户生命周期价值、信用评分等。这类场景的特点是数据维度高、样本不平衡、对可解释性要求高。线性回归和逻辑回归因为可解释性强,在监管严格的场景下仍然是首选。树模型虽然精度高,但解释起来麻烦,通常要用SHAP值来做事后解释。

7.2 工业预测性维护中的回归

工业设备预测性维护里,回归用来预测设备剩余寿命、故障时间、能耗等。这类场景的数据通常来自传感器,时间序列特征明显,噪声大。高斯过程回归和LSTM回归在这类场景下表现不错。特征工程的重点是提取时域和频域特征,比如均值、方差、峰值、频谱能量等。

7.3 互联网场景下的回归

互联网产品里回归无处不在:广告点击率预估(虽然叫预估,但输出是概率,本质是回归)、用户停留时长预测、GMV预测、推荐系统里的评分预测等。这类场景数据量大、特征稀疏、实时性要求高。LightGBM和深度学习模型是主流选择,特征工程侧重用户行为序列和交叉特征。

7.4 小样本仿真数据预测

仿真数据预测是工程领域常见的需求,比如用有限元仿真结果预测不同参数下的结构应力。这类场景样本量小、仿真成本高、对预测不确定性有要求。高斯过程回归是小样本场景的首选,因为它能给出预测方差,帮助判断哪些区域需要补充仿真。如果样本量稍大,也可以试试随机森林或XGBoost,但要注意控制模型复杂度。

我在实际项目里发现,小样本场景下特征选择比模型选择更重要。因为样本少,噪声特征很容易导致过拟合。用领域知识筛选出真正相关的特征,比换更复杂的模型效果更好。另外,数据增强在小样本回归里也有用,比如通过添加高斯噪声生成虚拟样本,或者用SMOTE的回归版本。

最后分享一个我常用的技巧:做回归项目时,先把目标变量做一下变换,看看能不能让分布更接近正态。对数变换、Box-Cox变换、Yeo-Johnson变换都值得试试。目标变量分布改善了,很多模型的表現都会提升。这个操作成本很低,但效果往往出乎意料。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询