第1篇:线性回归 — 机器学习的"Hello World"

目标读者:有编程/数据基础,机器学习零基础
阅读时间:约 15 分钟
前置知识:无


1. 机器学习到底在干什么?

用一句话说:机器学习就是让计算机从数据中自动找出规律,然后用这个规律做预测。

举个例子:你是券商的数据工程师,老板说"能不能根据用户的账户余额、交易频率、持仓品种,预测这个用户下个月会续费多少钱?"

这就是一个典型的预测问题。而线性回归,就是解决这类预测问题最简单、最经典的模型。

数据 → 找规律 → 预测

你的数据:
  用户A:余额10万 + 月交易20次 + 持仓3只股票 → 月续费 500 元
  用户B:余额50万 + 月交易50次 + 持仓8只股票 → 月续费 2000 元
  用户C:余额5万  + 月交易5次  + 持仓1只股票 → 月续费 200 元

规律(肉眼可见):余额越高、交易越频繁、持仓越多 → 续费越高

机器学习的任务就是把这种规律量化出来,变成一个公式。

2. 模型长什么样?

线性回归的模型非常简单,就一个公式:

ŷ = w₁·x₁ + w₂·x₂ + w₃·x₃ + b

这是什么东西?我们一个一个来看。

2.1 特征 x:模型的"输入"

x 就是你的数据。在上面的券商例子中:

  • x₁ = 账户余额(10万、50万、5万…)
  • x₂ = 月交易次数(20次、50次、5次…)
  • x₃ = 持仓数量(3只、8只、1只…)

特征,本质上就是数据仓库里的字段。你从 Hive 表里 SELECT 出来的每一列,都可能成为模型的一个特征。

2.2 权重 W:每个特征的"重要性"

权重 W 回答的问题是:这个特征对预测结果影响有多大?

如果 w₁ = 0.01:
  余额每多1万元,续费多 0.01 × 10000 = 100 元

如果 w₂ = 5:
  每月多交易1次,续费多 5 元

W 是模型自己学出来的,不需要你手工设置——这正是机器学习的核心。

数仓工程师视角: W 就像你做归因分析时,算出"营销渠道贡献 60%,产品品类贡献 30%,地区贡献 10%",只不过机器学习是自动算的。

2.3 偏差 b:模型的"保底输出"

b 的意思是:当所有特征都为零时,模型的基础输出是多少。

如果 b = 100:
  一个新用户,余额 0,交易 0,持仓 0
  模型也会预测他续费 100 元(基础保底)

b 的作用是给模型一个"起点",不让模型被特征完全绑架。

2.4 ŷ:模型的"预测值"

ŷ 读作 “y-hat”,就是模型的输出——它预测的结果。在我们的例子中就是预测的月续费金额。


3. 怎么判断模型好不好? — 损失函数

模型一开始的 W 和 b 是随机的,预测肯定不准。我们需要一个标准来衡量"有多不准"。这个标准就是损失函数(Loss Function)

最常用的两种损失函数是 MSE(均方误差)MAE(平均绝对误差),它们看似差不多,但侧重点完全不同。

3.1 MSE(均方误差)— 严惩大错误

MSE = 所有样本的(预测值 - 真实值)² 的平均值

MSE 的核心特点:对大误差给予"平方级"的惩罚。

券商案例:
  预测用户持仓 100万,实际 80万 → 误差 20万 → 平方 = 400
  预测用户持仓  50万,实际 48万 → 误差  2万 → 平方 =   4
  
  误差只差 10 倍,但惩罚差了 100 倍!
  MSE 会逼着模型优先解决那些"错得离谱"的样本

MSE 的侧重点:

  • 整体数据的离散度更低,所有预测都尽量靠近真实值
  • 对离群点(异常值)非常敏感——因为平方放大了它们的影响
  • 结果:模型会努力让所有样本都"差不多准",但可能被少数离群点带偏

3.2 MAE(平均绝对误差)— 一视同仁

MAE = 所有样本的 |预测值 - 真实值| 的平均值

MAE 的核心特点:每个误差一视同仁,不管大误差还是小误差,惩罚都是线性的。

同样的券商案例:
  预测用户持仓 100万,实际 80万 → 误差 20万 → 绝对值 = 20
  预测用户持仓  50万,实际 48万 → 误差  2万 → 绝对值 =  2
  
  误差差 10 倍,惩罚也只差 10 倍——公平对待

MAE 的侧重点:

  • 允许模型离离群点远一点,但让大多数普通样本预测得更准
  • 对离群点不敏感——不会被少数异常值绑架
  • 结果:模型可能对少数离群点预测较差,但对大多数样本表现更好

3.3 一张图看懂区别

假设有 5 个样本,真实值都是 100:

样本1: 预测 98   → 误差 2
样本2: 预测 99   → 误差 1
样本3: 预测 101  → 误差 1
样本4: 预测 102  → 误差 2
样本5: 预测 150  → 误差 50(离群点)

MSE = (4 + 1 + 1 + 4 + 2500) / 5 = 502
MAE = (2 + 1 + 1 + 2 + 50) / 5 = 11.2

现在把离群点从 150 改成 120(误差从 50 降到 20):

MSE = (4 + 1 + 1 + 4 + 400) / 5 = 82   ← 下降了 84%!
MAE = (2 + 1 + 1 + 2 + 20) / 5 = 5.2   ← 只下降了 54%

结论:MSE 对离群点的变化反应剧烈,MAE 反应温和

3.4 什么时候用哪个?

场景 推荐用 原因
数据干净,离群点很少 MSE 让所有样本都尽量准,数学性质好(可导)
数据有噪音/离群点 MAE 不被少数异常值绑架,关注大多数样本
需要梯度下降优化 MSE MSE 处处可导,MAE 在零点不可导
模型评估报告 两个都看 MSE 看整体离散度,MAE 看典型误差
券商实战建议:

预测用户续费金额:
  - 如果数据经过清洗,离群点已剔除 → 用 MSE
  - 如果数据还有异常大额交易没处理 → 用 MAE 或先做异常值检测

预测用户持仓(可能有大户):
  - 大户的误差本身就大,用 MSE 会逼模型过度关注大户
  - 用 MAE 更公平,让模型对普通用户也负责

3.5 为什么线性回归默认用 MSE?

两个原因:

  1. 数学性质好:MSE 处处可导,梯度下降可以顺畅计算;MAE 在误差为零的点不可导,优化起来麻烦。
  2. 统计意义清晰:最小化 MSE 等价于让预测值逼近真实值的"期望",有明确的概率解释。

4. 怎么让模型变好? — 梯度下降

现在我们知道了模型有多差(MSE),下一步就是让模型变好。方法就是梯度下降法(Gradient Descent)

4.1 直觉理解

想象你蒙着眼睛站在一座山上,目标是走到山谷最低点。你只能感受脚下的坡度:

  • 脚感往下斜 → 往那个方向走一步
  • 脚感往上斜 → 反方向走一步
  • 每走一步重新感受坡度
  • 反复走,直到感觉不到坡度(到了最低点)

这就是梯度下降的全部逻辑。

4.2 四步循环

第1步:用当前的 W、b 算出所有预测值 ŷ
第2步:用 ŷ 和真实值 y,算出 MSE(损失)
第3步:求 MSE 对 W 的斜率(梯度)—— 告诉你哪个方向让损失变大
第4步:往斜率的反方向走一小步,更新 W 和 b
       w_new = w_old - 学习率 × 斜率

这个四步循环重复 N 次,直到损失降到满意为止——这就是"训练"。

4.3 学习率:步子迈多大?

学习率(Learning Rate,记作 α)决定了每次更新的步长。

学习率太大 学习率太小
步长太大,可能直接跨过最低点 步长太小,收敛太慢
损失曲线剧烈震荡,甚至发散 需要更多轮次才能到达最低点
类比:
就像你用 Hive 调参数,
mapreduce.map.memory.mb 设太大浪费资源,设太小跑不动。
学习率就是模型训练中的"资源配置参数"。

4.4 更新公式的含义

新参数 = 旧参数 - 学习率 × 梯度

拆解每个部分:
┌──────────┬────────────────────────────────┐
│ 旧参数   │ 你当前站在哪里                   │
│ 学习率   │ 这步走多远                       │
│ 梯度     │ 脚下坡度(正 = 上坡,负 = 下坡)   │
└──────────┴────────────────────────────────┘

斜率为正 → 当前参数偏大 → 减去一点 → 往左走
斜率为负 → 当前参数偏小 → 加上一点 → 往右走

5. 训练的"调参" — 超参数

训练前你需要设置几个关键参数,这些叫超参数(Hyperparameters)

超参数 是什么 调大效果 调小效果
学习率 每步的步长 收敛快但可能震荡 收敛慢但更稳定
批次大小 每批用多少样本算梯度 算得快但梯度不准 梯度准但算得慢
周期数 完整遍历数据多少遍 可能过拟合(死记硬背) 可能欠拟合(没学够)

大数据工程师视角: 批次大小很像 Spark 的 partition 数量。批次越大,一次处理的数据越多(像大 partition),但梯度估计可能不够精细。mini-batch 梯度下降本质上就是分布式计算中的分批处理思想。


6. 噪音 — 学不会的那部分

就算你把模型训练到极致,损失也不会降到零。为什么?

因为数据中有噪音(Noise)——真实标签中天然存在的、无法用特征解释的随机波动。

券商例子:
  用户A 和 用户B 的特征几乎一样(余额、交易量、持仓都差不多),
  但 A 突然因为个人原因(买房急需用钱)大额赎回,
  这个行为跟你的特征(余额、交易量、持仓)没有任何关系。
  
  这就是噪音——模型无法从特征中学会的随机性。

数据治理视角: 你从 ODS 层拿到的原始数据天然有噪音。数据治理中的异常值检测,本质上就是识别和降低噪音。噪音越低,模型能学到的信号就越多。


7. 小结

本篇你学到了:
┌─────────────────────────────────────┐
│                                     │
│  线性回归模型:ŷ = W·X + b           │
│                                     │
│  W = 特征的重要性(模型自己学)       │
│  b = 基础输出水平(模型自己学)       │
│                                     │
│  训练过程:                           │
│    ① 用当前参数算出预测值              │
│    ② 用 MSE 衡量预测有多差            │
│    ③ 用梯度下降更新参数               │
│    ④ 重复直到满意                     │
│                                     │
│  关键概念:                           │
│    损失函数 = 衡量"有多差"             │
│    梯度下降 = 让模型"变好"的方法        │
│    学习率   = 每次"进步多少"           │
│    噪音     = 永远学不会的部分          │
│                                     │
└─────────────────────────────────────┘

一个让大数据工程师会心一笑的类比

机器学习概念 你熟悉的大数据概念
特征 X 数据仓库的字段/列
权重 W 归因分析中的贡献系数
预测 ŷ SQL 聚合函数算出的指标
损失 MSE 数据一致性校验的偏差
梯度下降 Spark MLlib 迭代计算
批次处理 微批处理 / partition 分批
噪音 数据质量中的噪声数据

下一篇预告: 线性回归预测的是连续数值(比如续费金额)。但如果你的任务是「判断用户会不会流失」——输出是「会」或「不会」,那该怎么办?这就需要逻辑回归登场了。


上一篇:无(这是第1篇)
下一篇:第2篇:逻辑回归 — 从数值预测到概率判断

更多推荐