1 线性模型解决什么问题
假设你要在月初识别未来 30 天可能离网的用户。可以使用预测时已经知道的月费、入网时长、历史投诉次数和合同类型,不能使用未来才填写的销户原因。模型接收这些信息,输出流失风险,供后续安排有限的服务资源。类似任务还包括根据房屋面积预测成交价、根据灰度像素识别数字、根据词语出现情况判断短文本类别。它们的共同结构是:把对象表示成特征,再根据历史样本学习特征与目标之间的关系。
线性模型先给每个特征分配系数,把“特征值×系数”相加,再加上截距。若用 x 表示特征、w 表示系数、b 表示截距,线性分数就是 z=b+w1x1+w2x2+…。“线性”指这个加权组合的结构,不表示现实必然沿直线变化。线性回归直接用这个数预测连续目标;逻辑回归再把分数转换成类别概率。它们共享易计算、便于建立基线的特点,但回答的问题不同。

可以用公开数据搭建练习:California Housing 的目标是区域房价中位数,适合回归;公开 Telco Customer Churn 表格包含合同、服务和流失标签,适合分类;MNIST 可把 28×28 的灰度图展平成 784 个特征;短文本可把词语转换成计数或 TF-IDF 特征。公开表格不一定包含可信的历史快照,因此表格练习成绩不能直接证明真实月初预测有效。使用前仍要查看字段定义、标签含义、缺失情况与采集范围。
先设简单参照才知道模型有没有价值。回归可用训练集目标均值作为恒定预测;分类可记录总是预测多数类的结果。流失率若为 10%,全部预测不流失也有 90% 准确率,却找不到任何流失用户。对分类,应同时观察 precision、recall、F1 和 AUC,并说明正类是谁。对回归,应观察 MAE、RMSE 及误差分布。线性模型的首要价值,是让任务、数据与评价形成可检查的起点。
2 线性回归与最小二乘直觉
用房屋面积预测价格时,最简单的形式是“预测价格=截距+面积系数×面积”。面积每增加 1 个单位,预测值增加相应的系数值。加入房龄、房间数等特征后,每个系数描述其他已纳入特征保持不变时的预测变化。这是模型内的条件关系,不能直接当作改造房屋后必然发生的因果效果。截距表示全部输入为 0 时的输出;如果这个输入组合不在实际范围内,截距主要承担调整预测位置的作用。
训练需要比较预测与真实标签。假设 3 个样本的真实值为 10、14、18,模型预测为 11、12、18,预测减真实的残差便是 1、-2、0。直接相加会让正负误差抵消,平方后得到 1、4、0,总和为 5。最小二乘选择能够让训练样本残差平方和尽量小的系数。除以样本数就是均方误差 MSE;对它开平方得到 RMSE,单位与目标相同。这里不必先掌握矩阵求解,也能理解模型在努力减少什么。
平方会放大较大的残差,因此少量异常值可能明显改变拟合结果。若房价单位录错,产生远高于正常范围的标签,模型可能为了照顾这个样本而偏离多数样本。MAE 是绝对误差的平均值,对大误差的强调较弱,但也不能替代数据检查。实际报告可同时列出 MAE、RMSE,并查看高价区、低价区和不同地理区域的误差。整体平均表现良好,不代表每类对象都能获得同等质量的预测。

对于近似独立的表格样本,可以固定随机种子,按 60% 训练、20% 验证、20% 测试划分。训练集学习系数与预处理统计量,验证集选择特征处理和超参数,测试集留到方案冻结后评价。若任务预测未来,应优先按时间划分;若同个客户有多行记录,应防止客户跨集合造成信息重叠。划分比例只是起点,划分逻辑必须对应将来的使用方式。
还要检查残差是否保留规律。若面积较小与较大时都被低估,中间区间被高估,直线可能遗漏了弯曲关系;若某地区持续偏高,可能缺少地区信息。最小二乘只保证朝训练目标优化,不保证假设合理、样本代表未来或模型足够公平。先用残差定位模型没有解释的结构,再决定补充特征还是尝试其他模型,比单纯继续训练更有依据。
3 逻辑回归与分类边界
流失标签只有 0 和 1,直接用线性回归可能得到 -0.2 或 1.3,难以解释成概率。逻辑回归先计算线性分数 z,再通过 Sigmoid 函数 p=1/(1+exp(-z)) 将它映射到 0 与 1 之间。z=0 时 p=0.5,较大的正分数对应较高的正类概率。它虽然叫“回归”,常用于分类。训练使用适合概率预测的损失,鼓励真实正类获得较高概率、真实负类获得较低概率;本课不展开求导与优化算法。
例如,标准化后的月费为 1,入网时长为 -1,截距为 -1,系数分别为 0.8 和 -0.6,则 z=-1+0.8×1+(-0.6)×(-1)=0.4,概率约为 0.599。月费贡献把分数推高,较短时长也把分数推高。这里的系数、数值和概率都是教学构造;真正的方向与大小必须由特定数据、编码和拟合过程决定。特别要注意,系数增加 0.8 不表示概率增加 0.8,概率变化还取决于原来的分数位置。
分类还需要阈值。p≥0.5 时预测流失只是常见默认规则;若服务团队只能跟进少量用户,可以在验证集上比较较高阈值对应的覆盖量与命中情况。阈值变化会移动线性分数对应的分类边界,但不会改变已训练模型给出的排序。对仅有 2 个数值特征的模型,边界可以画成直线;更多特征时是更高维的平面。对原始特征做过变换后,原空间中的形状还会受到变换影响。

假设测试集有 100 个真实流失用户,模型标记 80 人,其中 60 人确实流失。则 precision=60/80=0.75,recall=60/100=0.60,F1 是这 2 个指标的调和平均,约为 0.667。precision 回答被标记的人有多少是真的,recall 回答真实流失的人找回了多少。降低阈值通常能找到更多正类,但也可能带来更多误报;必须在同个数据集上实际计算,不能只凭预期填写指标。
ROC AUC 衡量跨阈值的排序能力,可直观理解为随机抽取 1 个正类和 1 个负类时,正类获得更高分数的能力。AUC 高不代表选定阈值的 precision 高,也不代表概率已经校准。类别很不平衡时,还应看 PR 曲线或 PR AUC,并报告正类比例。若输出 0.7 被用于成本估算,应进一步检查这类概率区间的实际正类频率;概率数值漂亮和概率可信是不同的验收问题。
4 动手:标准化前后的系数对照
本节用 scikit-learn 的 California Housing 数据做回归对照。可选择 MedInc、HouseAge、AveRooms、AveOccup 作为输入,并记录数据版本、字段解释与目标单位。先固定 60%/20%/20% 划分及随机种子,再训练含截距的普通最小二乘模型。对照目标是弄清“改变输入单位会发生什么”,不是竞赛排名;此处的随机划分用于演示,空间相邻区域的泛化还需另设地理留出评估。
标准化把每列变为 x'=(x-μ)/s,其中 μ 与 s 分别是训练集的均值和标准差。验证、测试和将来的输入都必须复用这组统计量。若某列标准差为 0,它在训练集没有变化,应按工具约定处理或移除。类别特征不能因为被编码为数字就随意套用连续数值解释;合同类型通常适合独热编码,并预先约定未知类别的处理方式。
下面的代码展示关键边界,可在准备好数据与依赖的本地环境执行。它是实验步骤,不包含预先宣称的测量结果。
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
data = fetch_california_housing(as_frame=True)
columns = ["MedInc", "HouseAge", "AveRooms", "AveOccup"]
X, y = data.data[columns], data.target
X_train, X_hold, y_train, y_hold = train_test_split(
X, y, test_size=0.4, random_state=42
)
X_val, X_test, y_val, y_test = train_test_split(
X_hold, y_hold, test_size=0.5, random_state=42
)
raw = LinearRegression().fit(X_train, y_train)
scaled = make_pipeline(StandardScaler(), LinearRegression())
scaled.fit(X_train, y_train)
print(raw.coef_)
print(scaled.named_steps["linearregression"].coef_)
print(mean_absolute_error(y_val, raw.predict(X_val)))
print(mean_absolute_error(y_val, scaled.predict(X_val)))
# 测试集保留到预处理和模型配置冻结之后使用。

对于含截距、没有正则化且数值求解稳定的最小二乘,单纯换成标准化坐标通常不会改变预测,误差应在数值容差内接近。但系数会改变:原单位系数 w 对应的标准化系数为 w×s,截距也随中心化调整。原系数回答特征增加 1 个原始单位的变化,标准化系数回答增加 1 个训练集标准差的变化。不要因为某列从 0.02 变成 0.8,就声称它的实际作用增强了。
整理结果时,每行放特征名、原始单位、训练均值、训练标准差、原系数与标准化系数,并另列验证 MAE、RMSE。标准化后更适合在统一尺度上观察系数,但仍不能简单把绝对值排名当作重要性结论:特征相关、测量噪声和缺失处理都能影响系数。加入正则化后,缩放还会改变惩罚的实际效果,这正是下节需要先统一尺度的原因。
5 正则化线性模型:Ridge / Lasso 取舍
当特征较多、样本较少或特征彼此相关时,训练误差很低的系数可能在换批数据后明显波动。正则化在拟合误差之外加入对系数大小的约束,允许训练拟合稍差,换取更稳定的预测。它无法修复泄漏,也不能凭空补足缺失信息。比较正则化之前,先锁定数据划分和预处理,避免把不同实验条件造成的差异误认为方法的胜负。
Ridge 使用系数平方和作为惩罚,也称 L2 惩罚。它通常让多个系数共同收缩,相关特征往往仍然保留。Lasso 使用系数绝对值之和,也称 L1 惩罚,在合适强度下可以使部分系数精确为 0,从而得到较稀疏的表示。稀疏便于减少输入与阅读系数表,但被留下的特征不因此成为“真实原因”;对高度相关的特征,Lasso 可能换批数据就改选另个代表。
把惩罚强度记为 λ,较大的 λ 表示更强约束。在本课的直觉表达中,目标是“训练误差+λ×惩罚项”,截距通常不参与惩罚。不同实现对误差的求和、平均和参数名称有不同约定;某些逻辑回归接口使用 C,C 越大通常表示正则化越弱。不能将不同工具中的同名数值直接横向比较,应记录模型类型、库版本和参数语义。
滑块固定数据划分,只改变 Ridge 强度。小强度可能保留较大且相互抵消的系数;中间强度可能降低验证误差;过强时模型接近恒定预测,训练和验证误差都上升。这是教学预置曲线,并非所有数据都呈相同形状。选择应依据验证集,不能通过测试集挑出最好看的 λ。若样本较少,可在训练部分采用交叉验证,并确保标准化在每个训练折内部拟合。
实际取舍可以从目的出发:如果相关特征都容易获取,优先比较 Ridge 的稳定性;若输入采集成本高、确实需要更少特征,可以评估 Lasso 的稀疏程度、预测损失和选中特征的稳定性。对短文本的高维稀疏输入,正则化尤其重要;预处理还要避免把稀疏矩阵直接中心化导致内存膨胀,可使用支持稀疏输入的方案。这里先理解原则,不展开求解器内部实现。
6 常见坑:共线、泄漏特征、未标准化比系数
共线意味着部分特征携带相近的信息。例如总消费与月均消费乘使用月数高度相关,或者同份文本同时出现词计数与近似重复的词特征。模型可能让 1 个系数很正、另个很负,组合起来预测还不错,单独解释却非常不稳定。检查相关性、跨划分的系数变化与预测变化,可以判断是不是多个特征在替代彼此。仅凭某次拟合的符号就删除业务上合理的字段,可能只是把问题藏起来。
泄漏更隐蔽,也更危险。最终销户原因、退款完成状态、标签确认之后累计的投诉次数,都可能透露未来。随机划分无法阻止这种字段泄漏。同个用户的记录分到训练和测试,也可能让模型利用个体特征;把全量数据先标准化、先选词或先筛选最相关字段,则把留出数据的信息带入了训练。每项特征都应回答:在真正发出预测的那个时刻,系统能否按同样规则取得这个值?
未标准化时比较系数绝对值,是把不同单位混在同张尺上。月费按元或按分记录,系数会相差 100 倍,预测却可保持相同。即使标准化后,独热类别的参照组、数值列的分布以及特征之间的依赖仍影响解释。若合同编码为 0、1、2,模型还会默认相邻类别具有等距变化;除非任务确有这种顺序含义,否则应改用合适编码。

类别不平衡会让总体准确率掩盖失败。可以在训练阶段尝试类别权重,或者只对训练数据重采样;验证和测试应尽量保留部署时的自然比例。权重与重采样会改变学习目标,也可能影响概率解释,因此仍需重新检查阈值、precision、recall 与概率可靠性。不要先在全量数据上复制少数类样本再划分,否则近乎相同的样本可能同时进入训练与测试。
分布变化则意味着未来数据与训练时期不同,例如套餐结构调整、图像由扫描件变成手机拍摄、短文本出现新的缩写。字段结构一致并不能保证分布一致。应观察特征范围、缺失率、类别占比和预测分数分布;标签到齐后再核对真实指标。发现超出训练范围的输入时,线性外推可能产生不合理的回归值。正则化只能约束模型,无法保证这些新场景下仍然可靠。
7 案例:系数符号与业务直觉冲突
某团队在流失模型中看到:只有月费时,月费系数为正;加入合同类型、使用时长和服务数量后,月费系数变成负。业务人员认为“价格越高越容易流失”,于是怀疑训练程序出错。这里先不要改符号。前者混合了不同用户群体之间的差异,后者描述纳入其他特征后的条件关系;比较条件发生变化,符号就可能改变。下面的数字只用于说明诊断过程,不代表公开流失数据的实测结论。
例如,高月费用户中按月合同占比更高,而长期合同用户的流失率较低。在没有合同特征时,月费可能替合同差异承担解释;加入合同编码后,这部分关联被重新分配。反过来,使用时长与总消费接近共线,也可能令符号轻易翻转。还可能是数据仅保留仍在付费的用户、缺失值被错误填成 0,或费用字段在优惠前后使用了不同口径。符号冲突是检查入口,不能靠单个故事直接定案。
先固定标签含义,确认 1 确实表示流失,系数表的列名与训练列顺序一致。然后检查合同独热编码的参照组、月费单位与缺失填补规则,列出每列在预测时是否已知。再按合同类型和使用时长分组,观察人数、正类比例和月费范围。若某组只有很窄的月费区间,就不足以支持对价格变化做宽范围解释;若某组正类很少,系数与指标也更容易波动。
接着比较固定划分上的候选:只有月费、加入合同、加入使用时长、采用 Ridge。每次记录验证集 AUC、选定阈值下的 precision/recall、系数及其单位。使用训练内部的不同划分观察符号是否稳定,但不要不断查看测试集来决定保留哪个故事。若预测稳定而相关列系数反复变号,可把结论写成“该组特征共同提供预测信息,单列贡献不稳定”,并降低对单个系数的解释力度。
若检查后负号仍稳定,也只能说:在本数据覆盖范围、指定编码和其他特征保持不变的模型比较中,月费较高与较低预测风险相关。它不能推出提高价格会减少流失,因为调价还会改变用户行为和其他条件,且存在未观察因素。需要回答干预效果时,应另行设计因果研究或实验。上线决策仍以预先约定的预测指标、稳定性和使用范围为依据,不能把“符合直觉”作为唯一验收条件。
8 把线性模型假设写进验收
验收先定义预测对象与时点。例如“每月首日,为符合资格的在网用户预测未来 30 天是否流失”,比“建立流失 AI”更可执行。标签还要说明主动销户、欠费停机、短期暂停是否计入,以及需要等待多久才能确认。训练截止日期、验证区间和测试区间应写清,跨月重复用户的处理应与实际使用方式匹配。若上线就是为已有客户反复评分,也需确保任何历史记录都没有越过对应预测时点。
线性假设可以写成可检查的限制:当前使用的数值特征以加权和进入模型,未显式构造的交互关系不被单独表示;系数解释依赖编码、尺度及其他纳入特征;预测只在已评估的人群与范围内有效。对缺失值、未知类别、极端输入和字段延迟,要明确采用固定填补、拒绝预测还是转入人工处理。把这些处理纳入同个预处理与模型流水线,才能避免训练和上线各用各的规则。

分类验收应固定正类、阈值及指标计算口径。可以提出示例条件:在自然流失率接近目标场景的时间留出集上,recall≥0.60 且 precision≥0.40,同时报告 F1、ROC AUC、PR AUC 和混淆矩阵。这些数值只是写法示范,实际门槛需要根据漏报代价、误报成本与可处理人数确定。样本量和正类数量必须同时报告;只有 5 个正类时,找回 3 个虽也是 0.60,证据强度与找回 600 个中的 360 个不同。
回归验收则应说明目标单位,比较 MAE、RMSE 与恒定基线,并按关键区域或目标区间拆分误差。模型版本、数据快照、特征列表、训练统计量、正则化参数、阈值和随机种子都应能追溯。若对测试结果不满意又重新选方案,原测试集已经参与决策,最终评价应另有未使用的数据,不能继续称旧结果为独立验证。
上线后监控与离线验收相接:输入缺失率突然升高,先检查数据链路;分数分布变化,检查人群和业务规则;真实标签到齐后,检查 precision、recall 是否下降。预先约定何时复查、回退或暂停,比出问题后只讨论重新训练更明确。延迟标签尚未到齐时,输入分布指标只能提供预警,不能宣称真实效果已经保持达标。
9 从线性模型走向树模型(A12)
线性模型可作为很强的起点,但有些模式难以只靠原始特征的加权和表达。例如流失风险可能在合同即将到期时突增,月费影响还取决于合同类型;图像中邻近像素的组合也很重要。可以显式加入区间、交互项等特征,但需要验证收益,并控制解释与维护成本。不要因为模型名字简单就默认它无用,也不要因为换了模型就默认问题解决。
可以先做一个有针对性的交互项实验。令 x 为月费,m 为是否按月合同,按月取 1,长期取 0;把逻辑回归分数写成 z=b+w1x+w2m+w3xm。长期合同的分数随月费变化的斜率是 w1,按月合同则是 w1+w3,因此模型能够表达不同合同下月费关联不同。它仍对待学习的系数保持线性,新增的是输入表示。这里变化的是线性分数,概率还要经过 Sigmoid,不能把斜率直接解释成流失概率的增量。
交互项也会带来新的失败方式。若高月费的长期合同用户很少,模型可能在缺少样本支持的组合上给出极端分数。应在验证集分别检查合同组的样本量、月费覆盖范围和漏报情况,并与不含交互项的模型比较。只有训练误差下降而留出组表现变差,说明新增自由度没有带来可靠收益;此时可加强正则化或撤去该项,不能靠继续堆叠所有特征乘积解决。
树模型通过特征条件逐步划分样本,容易表达“使用时长较短且月费较高”这样的组合。本课先保留直觉,A12 再讨论划分、树深与过拟合。比较时应沿用同个预测时点、标签、训练/验证/测试边界与指标口径。不同模型允许有适合自身的预处理,但预处理都只能从训练部分学习;不能让候选模型使用额外的未来字段,却把分数优势归功于结构。

是否换模型应看误差证据。若线性模型在某些区间出现系统性残差,或某类特征组合持续漏报,可以将树模型作为候选,观察验证集上是否减少这些错误。若主要问题是标签错误、泄漏或上线缺列,换成树仍会受影响。对于 MNIST 和短文本,线性分类器还能帮助判断像素或词语表示是否已经携带可用信号,再决定是否需要更复杂的表示方法。
复杂候选也要承担额外成本:模型大小、预测耗时、结果稳定性与解释难度都可能变化。若新模型仅提高很小的整体 AUC,却让关键人群 recall 下降,不能只凭总体排名替换。保留线性基线、冻结候选配置、在最终留出数据上比较,再写明改进发生在哪些指标和人群。这样进入 A12 时,关注点会从“哪种模型更高级”转向“哪种假设更适合当前证据”。
放进方案里
在方案中将线性模型定位为可复现的预测基线。先写清对象、预测时点和标签窗口,例如月初利用此前可取得的信息预测未来 30 天流失,并列出标签确认规则。每列特征注明来源、单位、可用时间和缺失处理,明确排除销户结果等事后字段。公开数据练习还应说明缺少哪些时间信息,避免把离线成绩直接写成真实部署承诺。
数据部分记录快照版本及训练、验证、测试边界,说明时间与客户分组规则。填补、编码、标准化及特征筛选只在训练部分拟合,再复用于留出数据。候选包括普通线性模型及 Ridge 或 Lasso,验证集负责选择强度;分类阈值按跟进能力、误报和漏报成本确定。配置冻结后才进行最终测试,保留恒定预测或多数类预测作为参照。
结果部分同时列出整体和关键人群指标。分类报告正类比例、样本量、混淆矩阵、precision、recall、F1 与 AUC,回归报告带目标单位的 MAE、RMSE 及残差分组。系数表注明尺度、参照类别和稳定性,只解释模型内的条件关联。若相关特征反复变号,应记录解释限制,不把系数包装成调价或干预的因果依据。
交付物应包含预处理与模型流水线、数据及参数版本、阈值、适用范围和复现实验说明。验收门槛由实际成本确定,并约定字段延迟、未知类别、极端输入的处理。上线监控输入质量和分数分布,标签到齐后复核真实指标;当数据口径变化或关键指标持续低于门槛时触发复查、暂停或回退。树模型作为后续候选,沿用这些评价边界证明增益。
10 小结:下一步树模型(A12)
- 目标是连续数值还是类别概率?标签和预测时点是否明确?
- 所有输入在预测时都已可得吗?同个客户、未来字段或全量预处理是否造成泄漏?
- 标准化统计量是否只来自训练集?系数是否标明单位与类别参照?
- 是否区分线性分数、概率、阈值和最终分类?
- 是否报告正类比例及 precision、recall、F1、AUC,而非只看准确率?
- 正则化强度是否由验证集选择?共线特征的系数是否稳定?
- 是否检查关键人群、异常残差和分布变化?
- 测试集是否保持独立?上线范围、监控和回退条件是否写清?
自测:将月费从“元”改成“分”,为什么系数可以变化而预测不变?将分类阈值从 0.5 提高到 0.7,为什么 AUC 通常保持不变,而 precision 与 recall 需要重新计算?若加入“最终销户原因”后分数大幅提高,为什么应先审查字段时间,而不是宣布模型成功?