专项练习 · 10 分钟阅读

Python 线性回归练习:拟合、预测与评估

这些练习把线性回归缩小到可以手工检查的程度。你会拟合直线、用基线比较误差,并判断一个预测是否超出了证据范围。

练习:把直线变成预测

先写出预测规则。斜率控制输入每增加一个单位时预测值的变化,截距决定起点高度。拟合之前先测试一个输入。

def predict(x, slope, intercept):
    return slope * x + intercept

print(predict(4, 1.5, 2.0))

先写出可测试的规则

练习:用中心化求和拟合

分别把 x 和 y 减去均值,成对相乘偏差,再除以 x 的平方偏差和。这就是单输入的最小二乘斜率。

xs = [1, 2, 3]
ys = [3, 5, 7]
mean_x = sum(xs) / len(xs)
mean_y = sum(ys) / len(ys)
slope = sum((x - mean_x) * (y - mean_y) for x, y in zip(xs, ys)) / sum((x - mean_x) ** 2 for x in xs)
intercept = mean_y - slope * mean_x
print(slope, intercept)

手工完成拟合

练习:与基线比较误差

模型至少要胜过简单基线。对每个输入都预测训练均值,计算它的 MSE,再与拟合直线的 MSE 比较。如果直线没有更好,额外复杂度就没有带来价值。

xs = [1, 2, 3]
ys = [2, 4, 5]
mean_y = sum(ys) / len(ys)
baseline_mse = sum((y - mean_y) ** 2 for y in ys) / len(ys)
slope = 1.5
intercept = 2 / 3
model_mse = sum((y - (slope * x + intercept)) ** 2 for x, y in zip(xs, ys)) / len(xs)
print(round(baseline_mse, 2), round(model_mse, 2))

先胜过均值基线

练习:让预测留在证据范围内

范围保护是模型接口的一部分。输入超出训练范围时返回明确结果,而不是悄悄外推。

def safe_predict(x, xs, slope, intercept):
    if not min(xs) <= x <= max(xs):
        return None
    return slope * x + intercept

print(safe_predict(3, [1, 2, 3], 2.0, 0.0))
print(safe_predict(4, [1, 2, 3], 2.0, 0.0))

超出范围就明确返回空值

练习:报告正确的单位

MSE 的单位是输出单位的平方。均方根误差回到原始单位,更容易解释。把两者都算一次,关系就清楚了。

import math

mse = 4.0
print(math.sqrt(mse))

回到原始单位

你的练习清单

常见问题

线性回归总是一条直线吗?

单输入的简单线性回归是一条直线。多输入回归拟合平面或超平面,但最小二乘思想相同。

为什么斜率会是负数?

拟合出的关系可以为负:x 增大时预测 y 减小。符号是结果的一部分,不是错误。

可以跨数据集比较 MSE 吗?

只有在输出单位相同、评估数据可比时才可以。否则应比较 RMSE 或相对指标。

练习拟合一条直线

12 道题,覆盖斜率、截距、预测、MSE、基线与外推。

打开练习

继续阅读: