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、基线与外推。
继续阅读: