
第 18 章 用线性回归预测数值文章目录第 18 章 用线性回归预测数值 关于《AI 零基础 36 讲》1. 先把历史价格数据读对2. 建一个很简单的基线3. 单特征回归就是拟合一条直线4. 多特征模型把几项输入放进同一个式子5. 用误差回答模型错了多少6. 平均误差之外还要看具体错在哪7. 两种常见运行问题回到字段与数据范围检查上一章输入四个花卉测量值输出一个类别。现在换一个任务给出汽车的几个规格预测价格。输出从类别变成连续数值需要用数值误差来评估也需要弄清模型系数怎样参与计算。本章使用 UCI 的 Automobile 公开小数据集资料来自 1985 年的汽车规格等历史来源共 205 条记录。目标是学习回归流程。它没有当前市场数据也不能拿来估算今天的购车价格。UCI 数据页与本章的数据说明记录了来源、许可和下载日期。请先完成第 17 章的训练测试划分并熟悉第 14 章的缺失值处理。读完本章你会得到三个模型的同条件比较、一份逐条预测表、三张图和一个可以逐格运行的 Notebook。 关于《AI 零基础 36 讲》零基础也能开始学 AI《AI 零基础 36 讲》是一套面向初学者的 AI 入门教程。课程从认识和使用 AI 开始逐步学习Python、数据处理、机器学习与深度学习再进入大模型应用开发最后完成个人知识库助手的综合实践。本篇是正式讲解文章通过具体例子、原创图示和操作结果讲清概念。涉及编程的章节提供可运行代码方便你边读边试。读完以后动手检验建议按专栏顺序学习并完成对应的课后训练检查自己能否独立运用本章知识。博客专栏《AI 零基础 36 讲》1. 先把历史价格数据读对原始文件没有列标题每行有 26 个字段缺失值用问号表示。程序按原始说明为字段命名将问号读取为缺失值再选出本章使用的三项特征与价格。字段本章含义用途engine_size发动机尺寸或排量字段单特征及多特征输入curb_weight整备重量字段多特征输入horsepower马力字段多特征输入price原始价格字段预测目标 ymake品牌查阅错误记录本章不作特征sample_id教学编号追踪原始行本章不作特征获取到的数据页和原始字段说明没有明确列出这些量的物理单位或价格币种。本章因此保留原表量纲图和指标都写明“原表价格数值”没有擅自改成人民币、万元或升。现实应用需要先补齐单位信息才能接入外部测量数据。价格缺少四条马力缺少两条发动机尺寸与整备重量没有缺失。这六条分别进入拒绝表保留编号和缺失字段。最终留下 199 条三种模型都使用同一批完整记录。fromexamples.regression_coreimportprepare_data clean,rejected,summaryprepare_data()print(原始 保留 拒绝,summary[raw_rows],len(clean),len(rejected))print(rejected[[sample_id,missing_fields]].to_string(indexFalse))输出行数为205 199 6。拒绝表中auto-009、auto-044、auto-045、auto-129缺少价格auto-130、auto-131缺少马力。拒绝记录可以与原始文件逐行对照。这里没有用均价填补缺失价格。价格是要学习的答案填上自己猜出的数值会把猜测当成真实标签。单特征模型本来只需要发动机尺寸但为了公平对照本章也限制在这 199 条共同记录上避免模型间的样本和划分不同。2. 建一个很简单的基线先划分数据再建立基线。固定种子 42保留 20% 做测试199 条最终分为 159 条训练、40 条测试。标签与特征整行划分编号没有交集。最简单的预测可以忽略所有规格始终返回训练集的平均价格。本次训练平均价格约为 12386.31因此基线对每辆测试汽车都给出这个数。fromexamples.regression_coreimportrun_experiment models,train,test,summaryrun_experiment()print(训练/测试,len(train),len(test))print(f训练平均价格{train.price.mean():.2f})print(前三条基线预测,[round(v,2)forvintest.baseline_prediction.head(3)])实际输出为159 40训练均价为 12386.31前三条基线预测都是 12386.31。这里从训练数据计算均价测试数据只用于最后核对。基线提供一条起点复杂模型至少应在合适的指标上解释自己带来了什么改善。均值基线与平均绝对误差最优的常数预测也要分清。本章按最小平方误差的思路选择训练均值若目标只关注绝对误差训练中位数是另一种值得比较的常数基线。先明确指标才能知道自己在优化什么。3. 单特征回归就是拟合一条直线只使用发动机尺寸时预测规则可以写成一个系数乘输入再加上截距。本次训练得到b≈-6149.36w≈150.55。如果输入 x130使用完整精度系数得到预测约为 13422.17。帽子表示预测数值y 本身则表示真实价格。importpandasaspdfromexamples.regression_coreimportrun_experiment models,_,_,summaryrun_experiment()modelmodels[single]valuemodel.predict(pd.DataFrame({engine_size:[130]}))[0]print(f截距{model.intercept_:.2f}系数{model.coef_[0]:.2f}预测{value:.2f})输出为截距 -6149.36 系数 150.55 预测 13422.17。截距是在 x0 时这条直线的输出。本章训练数据的发动机尺寸从 61 到 326零并不在观察范围内因此负截距不表示存在一辆负价格汽车。直线经过点群中间不会穿过每一个点。训练目标是让整体平方误差尽量小某些点在直线上方另一些在下方。第 16 章手动做了梯度下降本章的库函数默认使用数值线性代数方法求最小二乘解。两者都可以用于寻找更小的误差不能把调用fit的所有模型都解释成“执行了前一章那段梯度下降循环”。算法组件可以换训练数据的用途不变。4. 多特征模型把几项输入放进同一个式子现在加入整备重量与马力。三项输入分别乘自己的系数再加截距。本次得到的系数按发动机尺寸、整备重量、马力顺序分别约为 78.78、4.16、39.16截距约为 -11685.47。测试记录auto-016的输入是 209、3380、182使用完整精度系数计算后预测约为 25975.35。fromexamples.regression_coreimportrun_experiment,FEATURES models,_,test,_run_experiment()rowtest.loc[test.sample_idauto-016,FEATURES]manualmodels[multi].intercept_row.to_numpy()[0] models[multi].coef_print(f手算式预测{manual:.2f})print(f模型接口预测{models[multi].predict(row)[0]:.2f})两种计算都得到 25975.35。是第 13 章见过的向量乘积这里把每个输入与对应系数相乘后相加。正文中的系数只显示两位小数手动使用这些舍入值会与模型输出略有差异核对时使用程序保存的完整数值。多特征系数表达的是其他输入保持相同条件下的线性预测关系。发动机尺寸和马力往往相关加一个字段后原来的系数会变化。因此不能看到 78.78 小于单特征的 150.55就断定发动机的实际作用变小了也不能把系数解释成改装一项规格的因果收益。不同字段的量纲和数值范围也不同不能按系数绝对值直接排列重要性。整备重量系数较小每条记录的输入数值却在数千范围最终贡献要看系数与输入一起计算。5. 用误差回答模型错了多少分类可以数答对多少类价格预测通常不会与真实值完全一样。我们先计算每条记录的残差本章约定为真实值减预测值。正残差表示低估负残差表示高估。用两条虚构价格举例真实值为 10000、20000预测为 12000、17000残差为 -2000、3000。直接平均残差只有 500两个方向部分抵消了无法表达典型误差有多大。MAE 是平均绝对误差先把每条误差取绝对值再平均。两条虚构记录得到(20003000)/22500单位与价格相同。RMSE 是均方根误差先平方误差并平均再开平方。同一例子得到约 2549.51。平方会让大误差产生更大影响开平方后单位又回到目标价格的量纲。真实运行的三模型结果如下MAE 与 RMSE 都保留原表价格量纲。模型训练 MAE测试 MAE训练 RMSE测试 RMSE均值基线5023.328316.006868.4911456.26单特征回归2532.004107.633432.305515.42三特征回归2111.843615.903053.214999.51本次固定比较中三特征模型的测试误差比前两个模型小。MAE 3615.90 是 40 条测试误差绝对值的平均不保证每条都只错这么多也不能说“价格准确率是某个百分比”。结果表还保留 R²。它将模型的平方误差与总是预测当前评估集均值的参考误差比较。在这份非恒定的测试标签上三特征模型为 0.7789单特征为 0.7309均值基线为 -0.1608。参考均值是评估集均值实际可用的基线用的却是训练集均值两者不同因此基线的测试 R² 可能为负。R² 没有价格单位不能读成 77.89% 的价格预测完全正确。前面两条虚构记录也能手算 R²。真实价格的均值为 15000围绕均值的平方差之和为 50000000预测平方误差之和为 13000000代入得到1-13000000/500000000.74。这表示相对这个均值参考平方误差减少了相应比例两条预测仍然都存在误差。6. 平均误差之外还要看具体错在哪图中横轴是真实值纵轴是预测值。点落在虚线上表示预测恰好正确虚线下面表示低估上面表示高估。均值基线始终输出同一个数所以形成一列水平排列的点。三特征模型的高价测试记录有明显低估残差图把这种问题显示得更直接。测试编号品牌真实价格三特征预测残差auto-016bmw4131525975.3515339.65auto-127porsche3402823175.0910852.91auto-017bmw3688026495.6810384.32这三条是本次绝对误差最大的记录。只看整体 MAE 会漏掉高价汽车上的大误差。本章模型没有使用品牌、车身形式等类别信息三个规格也不足以完整表达价格差异这些是值得继续检查的可能原因。没有补充实验前不能断言加上某一字段就一定修好。最大误差也不能全部归因于输入超范围。auto-016的发动机尺寸 209、重量 3380、马力 182都位于训练表对应字段的最小值和最大值之间模型仍然低估了约 15339.65。每列都在已见范围内只能排除一种明显的输入问题不能保证这三个值的组合被充分学习过更不能保证遗漏的信息不影响价格。还有一个能直接核对的现象。auto-126与auto-127的三项输入相同真实价格分别为 32528 与 34028。模型只能给出相同预测约 23175.09。相同输入对应不同目标时无论怎么算这三个输入都无法准确区分这两条记录需要其他信息。数据量很小同品牌或相似配置可能同时出现在训练与测试中。随机划分适合本章演示但若目标是预测从未见过的品牌或未来市场需要另设计划分和数据来源。本章没有反复按测试成绩换特征三种方案预先确定比较结果也不作为真实市场模型选择结论。7. 两种常见运行问题回到字段与数据范围检查把三个特征交给只用一个特征训练的模型会出现字段不匹配错误。错误示例实际失败修复版按照训练字段取列后成功输出 40 条预测。不要通过随便删列消除报错要核对模型到底用哪几列、顺序是什么。另一个问题是向模型传入远离训练范围的数。直线可以无限延伸输入极小的发动机尺寸时甚至可能给出负价格。它并不知道真实汽车价格必须为正。外部使用前应检查单位、字段范围和样本是否属于同类数据本次测试的三特征预测没有负值仍然不能保证任意输入都合理。进入本章项目运行相关程序再打开 Notebook。逐条预测、六行指标比较和完整系数都已写入results你可以修改显示精度但不要只保留舍入后的数值继续算误差。最后独立做一个核对。找到auto-085它的真实价格为 6989三特征预测约为 11215.88。计算残差约 -4226.88并说明这是高估还是低估。再从【零基础学AI】第 18 章课后练习与答案中挑一个指标题先手算再用程序确认。下一章回到分类问题观察类别概率与容易分错的样本。