3.2 回归任务 本节摘要:回归任务要预测的是一个连续数值,而不是离散类别——房价、销量、温度、用户停留时长都是它的目标。本节先跑一段线性回归的最小例子,再讲清楚线性模型、树模型和正则化各自的适用场景,最后落到怎么读 MSE、MAE、R 平方这几个指标,以及为什么"误差越小越好"这句话在回归里比在分类里更难一概而论——误差必须回落到目标量纲上才有意义。 本节目标 阅读完本节,你应当能够: 写一段完整的回归流程,并用测试集评估 解释线性回归、岭回归、Lasso 三者的关系,以及 L1、L2 正则化的区别 知道什么时候该上树模型、什么时候用多项式特征 区分 MSE、RMSE、MAE、R 平方各自强调什么 说出回归评估里"误差大不大"要结合目标量纲来判断 一、先跑起来:线性回归的最小例子
本节摘要:回归任务要预测的是一个连续数值,而不是离散类别——房价、销量、温度、用户停留时长都是它的目标。本节先跑一段线性回归的最小例子,再讲清楚线性模型、树模型和正则化各自的适用场景,最后落到怎么读 MSE、MAE、R 平方这几个指标,以及为什么"误差越小越好"这句话在回归里比在分类里更难一概而论——误差必须回落到目标量纲上才有意义。
阅读完本节,你应当能够:
回归的直觉比分类更贴近生活:看到一套房子,你脑子里会估个价,这个"估价"过程就是回归。下面用糖尿病数据集跑一遍,它有 442 个样本、10 个特征,目标是一个连续的健康指标。
from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score X, y = load_diabetes(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) model = LinearRegression() model.fit(X_train, y_train) pred = model.predict(X_test) print(mean_squared_error(y_test, pred)) print(mean_absolute_error(y_test, pred)) print(r2_score(y_test, pred))
流程和分类几乎一样,唯一的差别在最后:评估函数换成了误差类指标。mean_squared_error 算均方误差,mean_absolute_error 算平均绝对误差,r2_score 算 R 平方。三个数字各有侧重,第四节细说。
线性回归假设目标值是特征的加权和,再加一个截距。模型学出来的系数就是每个特征的"单价",可解释性极强——哪个特征每涨一单位、目标跟着变多少,一眼看穿。但它怕两样东西:异常值和多重共线性。特征之间高度相关时,系数会变得极不稳定,换一批数据可能正负号都翻过来。
正则化是给模型"上规矩"。岭回归在损失里加系数的平方和,把系数整体往小里压,防止某个系数被异常值放大。Lasso 加的是系数的绝对值之和,能把不重要的系数直接压成零,顺带做了特征选择。一句话记住:L2 是收缩,L1 是收缩并剔除。
from sklearn.linear_model import Ridge, Lasso ridge = Ridge(alpha=1.0) lasso = Lasso(alpha=0.1)
alpha 控制惩罚强度,越大系数被压得越狠。选多少合适,靠交叉验证去试,别拍脑袋。
现实里很多关系不是直线。决策树回归把特征空间切成一块块,每块给一个常数预测值。它能捕捉非线性,但容易过拟合——尤其不限制深度时,会把训练集切得稀碎,连噪声都记住。随机森林回归用多棵树取平均,把方差降下来,通常是最稳的默认选择之一。
多项式特征是另一条路:把原始特征升维,比如 x 变成 x、x 的平方、x 的立方,再交给线性回归。它让线性模型也能拟合曲线,代价是特征数暴涨,必须配合正则化,否则过拟合。
| 算法 | 特点 | 适合场景 |
|---|---|---|
| 线性回归 | 简单、可解释、需线性 | 基线、特征与目标线性 |
| 岭回归 | L2 正则,防过拟合 | 特征多、存在共线性 |
| Lasso | L1 正则,做特征选择 | 想剔除无用特征 |
| 决策树回归 | 非线性,易过拟合 | 需要规则、非线性 |
| 随机森林回归 | 集成、抗噪、稳 | 默认强基线 |
选型上有个朴素的经验:先上随机森林拿一个不错的基线,再回头试线性模型和正则化,看简单模型能不能追平——能追平就优先用简单的,因为可解释性和推理速度都是白赚的。
分类有准确率这个"一眼懂"的分数,回归没有。回归的四个常用指标,强调的东西各不相同。
MSE 是误差平方的平均,对大误差特别敏感,因为它把误差平方放大。RMSE 是 MSE 开根号,量纲和原目标一致,好解释。MAE 是绝对误差的平均,对异常值没那么敏感。R 平方衡量模型解释了目标多少比例的方差,越接近 1 越好,但它有个毛病:加特征只会让它不变或上升,所以不能光靠它判断特征有没有用。
| 指标 | 对异常值敏感度 | 量纲 | 含义 |
|---|---|---|---|
| MSE | 高(平方放大) | 目标的平方 | 平均平方误差 |
| RMSE | 高 | 与目标一致 | 开根号后的误差 |
| MAE | 低 | 与目标一致 | 平均绝对误差 |
| R 平方 | 中 | 无量纲 | 解释方差的比例 |
一个容易被忽略的点:误差数字必须回落到目标量纲上读。房价预测误差 5 万,对一套几百万的房子是小误差;同样 5 万,对单价 30 块的日用品就是灾难。脱离量纲谈误差,等于没说。
⚠️ 常见坑:拿 MSE 一个数判断模型好坏,不看目标量纲。房价预测的 MSE 是几十万还是几万,得结合房价本身的量级来读,换成 MAE 或 RMSE 更直观。
⚠️ 常见坑:把 R 平方当成唯一优化目标,疯狂堆特征。特征越多 R 平方只升不降,但模型可能已经过拟合,得用交叉验证来把关。
💡 关键直觉:回归没有准确率这种现成的分母,所有误差都要回落到"目标值大概多大"这个背景上去理解。先看目标的均值、范围,再谈误差算不算小。
💡 关键直觉:随机森林回归是很好的默认起点。它不用做特征缩放,对非线性和异常值都比较抗造,先拿它出一个基线分数,再回头试简单模型。
下面把本节没讲透的地方补上,从损失函数讲到特征工程,最后是几个高频问题。
线性回归怎么找到那条线?用的是最小二乘:在所有候选直线里,挑一条让每个点到直线的竖直距离平方和最小的。这个"平方"就是 MSE 的来源——回归的损失函数和评估指标在这里是同源的。
决策树回归怎么切?它在每个节点挑一个特征和切点,把数据分成左右两块,目标是让切完后两块的预测误差之和最小。叶子节点的预测值,就是落到这个叶子里的所有样本目标值的平均。所以它输出的是阶梯状的常数,天然不光滑。随机森林在此基础上做两件事:每棵树用有放回抽样的不同子集训练,分裂时只随机看一部分特征,最后把几百棵树的预测取平均。两个随机性叠加,把单棵树的过拟合抵消掉大半。
回归做得好不好,一半在算法,一半在特征。三个常见的特征动作:标准化,把每个特征拉到均值零、方差一,对正则化线性模型必要;处理异常值,一个极端离群的样本能把线性回归系数带偏,画箱线图或看分位数删掉明显错误值;特征交互,房价里"面积乘地段"可能是比单独两个特征更强的信号,多项式特征本质就是在造这种交互项。
from sklearn.preprocessing import PolynomialFeatures, StandardScaler from sklearn.linear_model import Ridge from sklearn.pipeline import make_pipeline make_pipeline( PolynomialFeatures(degree=2), StandardScaler(), Ridge(alpha=1.0), )
make_pipeline 把几步串成一条流水线,训练和预测时自动按顺序执行,避免手工漏步。还有两点提醒:一是时间序列数据别随机切分,会把未来信息漏进训练集;二是网格搜索调优时,评估指标用负的 MSE 或负的 RMSE,因为网格搜索默认追求分数最大化,而误差越小越好,加负号正好对齐。
多项式回归便宜、可解释,但特征数随次数暴涨,二次还好,三次以上要小心,必须配正则化。树回归能自动发现非线性,不用手工造特征,但容易过拟合、不光滑。先试树,再回头用低阶多项式加岭回归,看哪个简单又好。
房价、收入这类目标经常右偏,长尾很长,直接建模会让大值主导误差。常用做法是给目标取对数,训练完再取指数还原。对数变换往往能让线性模型的表现明显变好。
说明模型比"直接用均值预测"还差。R 平方等于一减去残差平方和与总平方和之比,如果残差比数据本身的波动还大,这个比值就超过一,R 平方掉到负值。看到负数,先查数据切分和特征是不是有问题。
线性回归和岭回归训练后,系数和特征一一对应。系数为正,特征越大目标越大;为负则相反。系数大小只有在特征标准化之后才可比——没标准化时,量纲大的特征天然系数小,不代表它不重要。
训练误差很小、验证误差很大,就是过拟合的典型信号。树模型最容易中招,随机森林和正则化能缓解。用交叉验证看验证集误差,比看训练集误差可靠得多。
没有绝对答案。随机森林更省心,对超参数不敏感、不易过拟合;梯度提升通常精度更高,但对学习率、树的数量敏感,调起来费劲。数据量大、追求精度选梯度提升,图省事选随机森林。
普通线性回归不敏感,系数会自动补偿;但岭回归、Lasso 这些带正则化的,以及用了梯度下降求解的模型,都敏感。拿不准就统一标准化,几乎不会有坏处。
报给业务看,用 MAE 或 RMSE,量纲和原目标一致,好懂;调参和对比模型,用 MSE 或负的 RMSE,配合交叉验证。R 平方用来做粗判断,别当唯一标准。
能,多项式特征就是干这个的。你还可以手工造特征,比如面积的对数、年龄的分箱,再交给线性回归。线性模型本身是线性的,但特征可以是非线性的变换。
回归还有一个分类没有的隐患:外推。模型只在见过的特征范围内靠谱,把特征推到训练集范围之外去预测,结果可能非常离谱。部署时如果输入出现训练集里没有的极端值,要格外小心。
下一节换个赛道——没有标签的数据怎么找结构,这就是聚类任务要解决的问题。