ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

回归实战进阶:从数据预处理到模型诊断的完整指南

回归实战进阶:从数据预处理到模型诊断的完整指南 上周我把第三章“回归实战”的基础版本讲完了核心就是把线性回归模型在数据集上跑通把损失函数和梯度下降的关系解释清楚。没想到评论区和私信里问得最多的不是“怎么调参”而是同一个问题跑完之后呢为什么我的模型在训练集上表现还行放到验证集上就差很多为什么业务方问我每个特征到底影响多少我说不出来这些问题恰恰是“回归实战”真正值钱的地方。所以这篇续章我把视角从“能跑通”拉到“能落地”重点补四块数据预处理与特征工程的细节、模型选型与调优的决策逻辑、评估指标的选用与模型诊断以及一个完整案例的实战拆解。适合已经会用 sklearn 跑基础回归、但想把模型做得更稳更可信的读者。这里提前说一句本文不是单纯堆代码。我会尽量把每个操作背后的“为什么”一起讲掉因为回归模型的坑大多不是代码问题而是对数据和业务的理解问题。1. 回归实战的核心思路与建模流程1.1 回归和分类的边界为什么很多分类技巧不能照搬很多从分类任务转过来的同学初期会非常不习惯回归的“脾气”。分类的标签是离散的准确率、F1 这些指标都是围绕“预测对错”展开回归的标签是连续的评估的核心是“预测值和真实值差了多少”。这个差别看起来只是任务定义不同实战中却会导致一系列连锁反应。举个例子分类里经常做类别平衡正样本少了就过采样。在回归里你没法简单地对一个连续数值做“平衡”但你可以通过看目标变量的分布发现它是否严重偏斜、是否被截断、是否存在极端值。如果这些没处理模型就会被少数极端样本牵着走。比如房价预测里目标变量往往右偏少数豪宅的成交价会把损失函数放大导致模型学出来的回归线在普通住宅区域误差偏小、在高端住宅区域却始终低估。这种问题在分类任务中很少见回归实战却必须面对。另一个容易踩的坑是把分类里的分层采样习惯照搬过来。sklearn 的 train_test_split 中 stratify 参数只能用于分类标签回归的目标是连续值不能直接分层。但如果我们直接随机切分目标变量里的极端值有可能全部落到测试集或者全部落到训练集造成评估结果严重失真。正确做法是先把连续目标分成若干个分位箱用分箱后的整数 ID 作为层标签再切分。这个技巧后面案例部分会专门演示。所以回归实战的第一步不是急着写建模代码而是先确定三件事目标变量的分布长什么样、业务上“误差”的口径是什么、训练集和测试集如何划分才能保证分布相似。这三件事想清楚了后续所有细节都只是执行。1.2 一条能落地的回归建模流程这些年我复盘过不少回归项目发现失败的项目有一个共同规律从一开始就直奔模型把大量时间花在“对比模型精度”上而对数据质量、业务口径和上线后的监控缺乏规划。后来我给自己总结了一套七环节流程每次都按这个顺序走基本不会出大偏差。第一步是业务理解与指标定义。这一环节不是走形式而是要直接决定你训练时最优化什么指标。业务方如果只丢给你一句“预测准一点”你必须追问是希望平均误差小还是希望偶尔出现大偏差时不要太过分前者对应 MAE后者对应 RMSE。指标口径不定后面做的所有模型验证都是空中楼阁。第二步是数据收集与清洗。这里不光是处理缺失值和异常值还包括确认每个特征的真实含义、取值单位、覆盖范围。我遇到过某个字段名字叫“面积”但实际上是“总面积”还是“套内面积”直到项目快结束才发现导致前面所有模型都是瞎忙。第三步是探索性分析。画目标变量分布图、看特征与目标之间的散点趋势、找特征之间的相关性。这个环节能帮你在建模前就发现非线性关系、共线性、离群点。第四步是特征工程。包括构造新列、处理缺失值、编码类别特征、做必要的标准化。这部分后面单独展开。第五步是模型选择与训练。我会从最简单的线性回归开始作为基线再根据基线表现决定是否引入正则化或树模型。这样做的好处是每一步都能量化“增加复杂度到底值不值”。第六步是评估与诊断。模型不是训练完看个 R² 就结束的。要仔细做残差分析、检查多重共线性、对比不同指标的表现。第七步是发布与监控。回归模型上线后最大的风险是数据漂移。我会要求工程侧记录每一条预测的真实值定时算当前残差均值。如果残差均值持续偏离 0说明模型背后的数据分布已经发生变化需要重新训练。这七个环节不是严格的瀑布中间可以反复循环但整体顺序不能乱。尤其是第一步的“指标定义”和后面的“模型训练”如果指标变了整个调优方向都要变返工成本极高。2. 数据预处理与特征工程回归模型的地基2.1 缺失值与异常值回归对极端值尤其敏感数据预处理在回归实战里的地位比很多人想象的更重。因为线性回归、Ridge、Lasso 这些常用模型本质上都在拟合条件均值 E[y|x]。一旦数据里有缺失值、异常值这些模型会老老实实地把“噪声”也学进去。先聊缺失值。处理缺失值没有万能公式我的习惯是先看缺失比例再看缺失机制。如果某个特征缺失比例超过 40%而且它和目标变量的相关性本来就不高我倾向直接删掉这一列如果缺失比例低但缺失本身有业务含义比如“价格”字段缺失可能说明记录不完整又比如“产权年限”缺失可能是因为该房源类型特殊那么正确的做法不是盲目用均值填充而是创建一个“该字段是否缺失”的 0/1 新特征同时把缺失值用中位数填充。这样模型有机会捕捉到“缺失”本身的信息。再说异常值。回归损失函数大多是平方损失一个极端样本的误差会被平方放大。例如一个目标值是 1000常规值是 200那这一个样本产生的损失是常规样本的好几十倍。模型为了让总损失最小只能往这个极端样本方向倾斜把整条回归线都拉歪。识别异常值不能只靠“超过 3 倍标准差”这种机械规则要结合业务判断。库存预测里某个商品单日暴增到正常值 20 倍可能是大促活动也可能是数据上报错误。如果业务上确认是真实大单我们应该单独建模或者保留如果是录入错误才应该剔除。我通常先用业务规则过滤掉“物理上不可能”的数据比如面积小于 10 平米、单价为负等再用残差图和 Cook 距离识别高杠杆点这样能把删除决策建立在证据上。另外回归里对目标变量做 log 变换也属于一种“软处理异常值”的手段。变换之后极端值之间的差距被压缩模型更容易学到整体趋势。但要注意做完预测要记得反变换回原量纲并且如果目标变量里有 0 或负值log 不能直接用可以考虑 clip 或使用 log1p。2.2 特征缩放、编码与组合实战中最常被忽略的三件事特征缩放是回归实战里最容易出问题、也最容易犯错的一环。线性回归和正则化模型必须做特征缩放因为 L1/L2 惩罚项会把量纲大的特征惩罚得更厉害导致系数大小不能真正反映特征对目标的影响力。比如一个特征单位是“万元”另一个是“元”两者数值范围差一万倍不做标准化的情况下Lasso 可能直接把“万元”特征系数压成 0这是完全错误的。缩放器必须先在训练集上 fit再 transform 测试集这是很多初学者容易忽略的细节。如果你把整个数据集放在一起先做标准化再切分训练测试测试集的信息已经混进了训练过程这在机器学习里叫数据泄漏。虽然在线性回归里它可能只在评估指标上造成微小的乐观偏差但在稍微复杂一点的模型里这种泄漏会让模型上线后表现远低于你的预期。类别特征处理同样有讲究。最常用的是 One-Hot 编码但回归里要小心类别数过高的变量。比如“省份”这种 34 个类别的字段One-Hot 后会生成 34 列而且这 34 列存在和截距项的完全多重共线性会让线性回归的系数估计不稳定。更稳的方案有两种一是目标编码用每个类别对应的历史平均目标值替代类别本身能保留类别间的差异但需要交叉验证避免过拟合二是频率编码用类别出现的次数或占比替代类别适合类别分布特别不均衡的情况。这两种方法都能压缩维度同时保留有效信息。特征组合是进阶选手该关注的点。回归模型默认假设每个特征独立地影响目标变量但真实世界往往不是这样。比如房价预测中“面积”和“房间数”单独看都有影响但“人均面积”或“房间密度”可能更有解释力。这种由业务启发构造的交互特征往往比让模型自动学非线性更稳定。构造完新特征之后我一般会做一次相关性筛选去掉明显重复的新旧特征避免给后面的模型诊断添乱。记住一个原则特征数量的增长应该慢于样本数量的增长否则模型过度自由很容易把噪声也拟合出来。3. 模型选型与参数调优从线性到正则化3.1 三种回归模型的适用边界很多入门教材会把线性回归、Ridge、Lasso 一字排开然后给一堆公式。实战中真正需要记住的是它们各自的“性格”线性回归干净利落但脆弱Ridge 稳定但不会帮你做特征选择Lasso 会做特征选择但在特征高度相关时选择结果不稳定。线性回归最适合的场景是特征数量远小于样本数量、特征与目标的关系近似线性、特征之间没有严重的多重共线性。它的优势是系数可以直接解释为“在控制其他变量不变时该特征每变化一个单位目标变量平均变化多少”。一旦你的数据里特征很多、相关性很强线性回归的系数会产生所谓的“符号翻转”——比如某个特征从业务常识看应该正向影响房价模型却给了它负系数。这不是业务逻辑错了而是特征之间的共线性导致系数估计不稳定。Ridge 通过 L2 惩罚把系数压缩到接近 0 但不等于 0适合特征之间有多重共线性、但你又不想丢掉任何特征的情况。它的 alpha 控制惩罚强度alpha 越大系数越接近 0。实际调参时我通常在一个对数尺度的网格上搜索 alpha效果比线性网格好得多。Lasso 的 L1 惩罚会把不重要的系数直接压成 0天然具备特征选择功能。如果特征数量很多且只关心预测精度而不关心“保留哪几个特征”的稳定性Lasso 是一个快速有效的选择。但要注意当两个特征高度相关时Lasso 可能随机保留其中一个导致解释性变差。这时更推荐 ElasticNet它能同时使用 L1 和 L2 惩罚兼顾两者的优点。除了这三种线性模型回归实战里也经常用到随机森林或梯度提升树。树模型能捕捉非线性关系和复杂的特征交互不需要对特征做标准化拿到手就能训练。但它的缺点是系数解释性差模型体积大且更容易在小样本上过拟合。我的策略是先用线性回归跑基线如果 R² 太低或残差图明显呈现非线性再上树模型。这样每次模型复杂度上升都能清楚地看到它到底带来了多少收益而不是一上来就调一个黑盒。3.2 交叉验证与网格搜索避免调参调出幻觉交叉验证的作用是估计模型在未见数据上的表现但回归里如果直接使用默认的 KFold可能会踩一个隐蔽的坑。当目标变量分布偏斜时随机划分出的每一折可能包含不同比例的高值样本造成不同折的验证误差忽高忽低最终调参结果也跟着不稳定。解决办法是使用基于目标变量分箱的分层交叉验证先按分位数把目标切成 10 组左右再用 StratifiedKFold 对分箱后的组标签做划分。这种做法虽然多写几行代码但能显著提升调参的稳定性。网格搜索是调参的标准工具但不代表参数越多越好。GridSearchCV 的参数组合数是各参数候选数的乘积如果同时搜索 5 个参数、每个参数给 10 个候选就是 10 万次训练对稍微大一点的数据集根本不现实。我的经验是先做“粗搜索”确定最佳量级再做“细搜索”精修。以 Ridge 的 alpha 为例我先在 [1e-4, 1e-2, 1, 1e2, 1e4] 这个 log 空间网格里搜索确定哪个量级最优再在最优量级附近生成 [0.1, 0.3, 0.5, 0.7, 1.0] 这样的小步长网格。这样既不会漏掉好区间又能控制总计算量。另一个容易被忽略的参数是 GridSearchCV 的 scoring。默认评分是 R²但 R² 并不总是业务最关心的指标。如果你的业务口径是“平均绝对误差最小”就应该指定 scoringneg_mean_absolute_error如果是“大误差不能太大”就用 scoringneg_root_mean_squared_error。搜索出来的模型会因为这个评分指标的不同而不同不要等调完参才发现方向不对。4. 回归评估与模型诊断精度之外更关键的事4.1 MAE、RMSE、R²怎么选指标背后是业务口径如果你只记得一个回归指标那大概率是 R²。但实战里 R² 只是一个“入门指标”它告诉你模型比“用均值预测”强多少却不告诉你误差的绝对值有多大。比如一个房价模型的 R² 是 0.93这听起来不错但它的 MAE 可能是 30 万对业务来说完全不可接受。所以我在汇报模型效果时从来不只报 R²一定会搭配 MAE 或 RMSE让对方感受到误差的真实量级。MAE 是平均绝对误差单位与目标变量一致直观好懂而且对异常值不敏感。如果业务只关心“平均来看差了多少钱”MAE 就是最合适的指标。但它有个缺点对每个样本的误差一视同仁哪怕个别样本误差极大只要量大一点点对 MAE 的影响就被摊薄了。RMSE 是均方根误差对大误差非常敏感。因为平方操作让大误差的权重指数级上升。如果业务上偶尔出现一个巨大误差会造成严重损失比如库存预测里大促日备货准备不足那就应该选择 RMSE 作为主要优化目标。不过也正因为这个特性RMSE 容易被极少数异常值主导给人一种“模型很差”的错觉。建议两个指标都算出来如果 RMSE 比 MAE 大很多就意味着你的测试集里有若干个误差非常大的样本先不要急着改模型去查这批样本是不是数据异常。还有一类业务常用的指标是 MAPE平均绝对百分比误差因为它直接告诉业务方“平均误差是百分之几”非常好沟通。但 MAPE 有个致命弱点当真实值接近 0 时百分比误差会趋向无穷导致整个指标被少数低值样本拉爆。如果业务坚持要看 MAPE我会先对真实值做一次过滤把极低值样本单独分析或者改用对称版本的 SMAPE。总之指标选择和业务口径强绑定没有“最好的指标”只有“更适合当前业务的指标”。4.2 残差分析与多重共线性让模型“可信”的必要检查训练完回归模型之后最不该跳过的一步就是画残差图。残差是预测值减真实值理想的残差应该像一片云均匀分布在 0 的上下没有明显趋势也没有随预测值放大或收窄的规律。如果残差图里出现明显的“喇叭形”说明预测值越大误差越大这是异方差性的典型特征意味着模型对高值样本的预测置信度不如低值样本稳定。这种情况下对目标变量做 log 变换通常是第一招。如果残差图呈现明显的曲线比如先上升后下降说明模型漏掉了一个关键的非线性项。我在一个销售预测项目里就遇到过这种情况模型残差对“促销强度”呈明显倒 U 形后来加入促销强度的平方项后残差图才变得正常。这种诊断本身就在指导特征工程所以残差分析不应该只放在模型的最后而应该穿插在建模循环中。多重共线性则是一个更隐蔽的问题。它不直接影响预测精度但会摧毁你对模型的解释能力。当两个特征高度相关时线性回归会把贡献在它们之间来回分配导致系数极其不稳定甚至出现正负号与业务常识相反。一个轻微的数据扰动就可能让系数从 3 变成 -1这样的模型没法跟业务方交代。最常用的诊断指标是 VIF方差膨胀因子一般经验阈值是 VIF 10 就需要处理。处理方式有三条路删掉其中一个特征、改用 Ridge/Lasso 正则化、对高度相关特征做 PCA 取主成分。我通常先用业务逻辑判断两个相关特征哪个更可靠、更可解释然后直接删另一个只有在彻底拿不准的时候才用正则化自动收缩。5. 真实案例房价预测的完整实战5.1 先看数据EDA阶段要回答的四个问题下面用 sklearn 内置的加州房价数据做一个完整演示。这个数据集有 20640 个样本8 个特征目标变量是房屋中位价单位是千美元。数据不需要下载直接一行代码就能加载很适合用来讲回归实战的流程。第一步先加载数据并做探索性分析。我会回答四个问题目标变量分布是否健康每个特征和目标的趋势是线性还是非线性特征之间是否存在强相关有没有缺失或明显异常的数据from sklearn.datasets import fetch_california_housing import pandas as pd import numpy as np housing fetch_california_housing() X pd.DataFrame(housing.data, columnshousing.feature_names) y pd.Series(housing.target, nameMedHouseVal) print(X.info()) print(y.describe())运行之后能看到目标变量 MedHouseVal 的均值和中位数以及最大最小值。继续画直方图通常会发现目标变量有右偏而且在 5 附近有一个尖峰。这说明很多房屋的中位价恰好被限制在 5即 5000 美元的单位数据存在截断现象。遇到这种数据我不会直接对原始目标建模而会考虑先对目标做 log 变换或者至少在后续残差分析里留意截断点附近的表现。接下来做特征相关性分析。我习惯用 corr() 先看大表重点看与目标变量相关性最高的特征以及特征之间相关性超过 0.8 的“高危组”。比如 MedInc收入中位数通常与房价相关度最高而 AveRooms 和 AveBedrooms 之间往往高度相关。如果发现这类高相关特征对后续建模就要么删除一个要么换用正则化模型。做完这些我还会检查缺失值和异常值。这个内置数据集比较干净但真实数据里这一步不能省。我的习惯是先做业务规则过滤画出特征箱线图观察有没有超出合理范围的点再决定是否剔除。5.2 建模与调优从基线到正则化的完整过程EDA 做完后进入建模环节。首先要把数据按目标变量分箱分层切分避免随机划分造成的分布不一致。代码如下from sklearn.model_selection import train_test_split # 目标变量分位数分箱用于分层采样 y_bin pd.qcut(y, q10, labelsFalse, duplicatesdrop) X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy_bin )这样切出来的训练集和测试集在不同房价段上的样本比例基本一致后续调参结果会更稳定。下一步我会先建立一个“标准缩放 线性回归”的基线管道用交叉验证看平均误差。from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.model_selection import StratifiedKFold, GridSearchCV # 在训练集上重新分层便于自定义交叉验证 y_bin_train pd.qcut(y_train, q10, labelsFalse, duplicatesdrop) cv StratifiedKFold(n_splits5, shuffleTrue, random_state42) base_pipe Pipeline([ (scaler, StandardScaler()), (model, LinearRegression()) ]) from sklearn.model_selection import cross_val_score scores cross_val_score(base_pipe, X_train, y_train, cvcv, scoringneg_root_mean_squared_error) print(Linear Regression CV RMSE: , -scores.mean())这里注意cross_val_score 的 cv 参数直接传入 StratifiedKFold 对象但内部会自动基于 y_train 来确定分组。对于连续 y_trainStratifiedKFold 会报错所以这里其实更稳妥的方式是传入一个自定义迭代器cv_splits list(cv.split(X_train, y_bin_train))在实际代码里我会这样写cvcv.split(X_train, y_bin_train)让模型基于分箱 ID 做分层。上面代码因为用了负 RMSE所以打印时取了负号。基线模型跑完如果 RMSE 在几个千美元级别说明还有提升空间。接着用 Ridge 或 Lasso 做调优。以 Ridge 为例我在 log 空间搜索 alphapipe Pipeline([ (scaler, StandardScaler()), (model, Ridge()) ]) param_grid {model__alpha: [0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50, 100]} grid GridSearchCV(pipe, param_grid, cvlist(cv.split(X_train, y_bin_train)), scoringneg_root_mean_squared_error) grid.fit(X_train, y_train) print(best alpha:, grid.best_params_[model__alpha]) print(CV RMSE:, -grid.best_score_)这里用cvlist(cv.split(...))是因为 GridSearchCV 接受交叉验证迭代器如果直接传入一个生成器会在多次调用时耗尽。调完 Ridge 还可以对 Lasso 做同样的搜索对比两者的 CV RMSE。在加州房价数据集上Ridge 和 Lasso 的效果通常比较接近都不会比基线线性回归差太多。如果发现线性模型效果有限可以尝试随机森林回归from sklearn.ensemble import RandomForestRegressor rf_pipe Pipeline([ (model, RandomForestRegressor(n_estimators300, random_state42, n_jobs-1)) ]) rf_scores cross_val_score(rf_pipe, X_train, y_train, cvlist(cv.split(X_train, y_bin_train)), scoringneg_root_mean_squared_error) print(RF CV RMSE:, -rf_scores.mean())但要注意随机森林的预测结果可能没有线性模型那么稳定而且无法直接给出系数解释。这一步骤的目的是让你清楚地看到“换成非线性模型到底带来了多大赔付”。5.3 模型解读与落地预测之外还有业务解释调参结束我们把最优 Ridge 模型在测试集上做一次完整评估同时输出评估指标和残差信息。scores_test_rmse np.sqrt(mean_squared_error(y_test, grid.predict(X_test))) scores_test_mae mean_absolute_error(y_test, grid.predict(X_test)) scores_test_r2 r2_score(y_test, grid.predict(X_test))有了这三个指标汇报时就更有底气。比如 R²0.8RMSE0.7单位千美元MAE0.5业务方马上能理解“中位价均值约 2 万平均误差约 5000还有优化空间”。如果想要解释模型Ridge 模型的系数是很有价值的。因为管道里做了标准化系数的绝对值大小可以直接反映该特征对目标影响力的相对大小。比如 MedInc 的系数通常是最大的正值说明收入对房价预测贡献最大。但这里要特别注意不能简单地说“收入每增加一个单位房价增加 XX 千美元”因为系数是在标准化尺度上算的要还原回原始单位还需要除以特征标准差。更严谨的做法是用排名的形式向业务方传达“相对重要性”而不是一个绝对的边际效应。最后一定要画测试集残差图。如果残差点大致均匀分布在 0 参考线附近而且没有明显趋势就可以认为模型没有明显的系统性偏差。如果发现残差在房价接近 5 的位置有一排密集的负残差那说明模型对限价房系统性低估这种问题可能不是模型能解决的它与数据本身的截断机制有关需要单独跟业务方解释。6. 实战中那些坑常见问题与排查清单6.1 预测值整体偏移、评估指标突然恶化怎么查回归实战中遇到问题我一般会按照“数据口、业务口、模型口”三个方向排查。第一个典型问题是预测值整体偏高或偏低。先检查目标变量是否做了 log 变换、预测后是否反变换。很多人把 log1p 用在训练目标上测试时却忘了 np.expm1导致预测结果整体差出几个数量级。其次检查训练样本和测试样本是否来自同一时间段、同一区域。如果测试集是新上线的门店数据目标分布跟训练集柜台阶段完全不一样模型偏移几乎是必然的。第二个典型问题是训练集误差很小、测试集误差很大。这基本就是过拟合。先用交叉验证的折间误差观察稳定性如果发现某几折误差特别大说明训练测试划分不够分层目标分布在不同折间不一致。如果折间误差稳定但测试集误差依然大可能是你的特征或模型已经“记住”了训练集噪声此时可以考虑换更强正则化或减少特征。第三个典型问题是 RMSE 比 MAE 大很多。RMSE 对大误差敏感所以两个指标的差距几乎可以当作“是否存在极端误差样本”的探测器。我会先把测试集里预测误差最大的 30 个样本打印出来看它们是不是目标值极高的房源、是不是数据本身有误。如果确实存在几个异常样本再决定是剔除、单独处理还是换用对异常值不敏感的指标。第四个典型问题是 R² 为负。这说明你的模型比“直接用均值预测”还差。常见原因是特征和目标之间根本没有线性关系或者你忘了把特征缩放放进管道导致梯度无法正常收敛。还有一种可能数据泄漏导致训练时看起来不错但测试时因为数据分布不一致模型直接崩掉。遇到负 R²不要闷头调参先重新检查数据切分和特征处理流程。6.2 回归实战避坑清单来自真实项目的经验最后整理一份我每次做回归项目都会对照的避坑清单这些都是真金白银换来的经验。不要在数据划分前做标准化。必须先切分训练集和测试集再在训练集上 fit 缩放器然后用同一个缩放器 transform 测试集。任何在划分前做的事只要用到了测试样本信息都属于数据泄漏。不要对 0 值目标直接计算 MAPE。如果业务坚持要看百分比误差先把真实值低于阈值的样本过滤掉或者使用 SMAPE否则一个真实值为 0.1 的样本会贡献天文数字般的误差。不要忽略多重共线性。即使预测精度看起来很高共线性也会让系数解释成为笑话。做线性回归必须查 VIF 或至少看特征相关矩阵。不要只看 R²。R² 高不代表误差小尤其在目标变量方差大的场景里R² 很容易虚高。汇报模型效果时一定要带上 MAE 或 RMSE。不要一条道走到黑。从线性回归开始是好的但残差图如果已经明确告诉你模型漏掉了非线性关系就不要再死磕多项式或正则化参数了换个树模型试一下往往立刻能看到显著提升。不要一次性制造几百个特征。特征数量多并不代表模型更好反而会让调参和解释陷入泥潭。先做基于业务逻辑的小幅尝试再在特征重要性确认后扩展。不要忽略目标变量的分布。右偏目标不处理极端值会主导损失函数。log 变换、Box-Cox 变换都是便宜又好用的小工具值得常备。最后补充一点个人体会我每次做回归实战都要先问自己三个问题——业务上最关心的误差是多大口径、数据里最可能让结果崩溃的坑在哪里、模型上线后靠什么信号判断它开始失效。把这三件事想透后面所有技术动作都会变得有方向。回归模型不容易做得惊艳但完全可以通过扎实的流程做得可信。希望这篇第三章续篇能帮你在“跑通模型”之后再往前走一步。
返回列表