Menu
CoddyTech

残差图

本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 14 课,共 58 课。

高分可能掩盖了错误的形状。这条直线在不断上涨的面团数据上取得了 0.82 的 R 平方值,但误差呈拱形:

左图:面团高度随时间变化,先快速上升,然后逐渐放缓,并用一条拟合直线表示,R 平方值为 0.82。右图:残差随预测值从 -1.3 上升到 +0.7,然后回落到 -0.7,围绕虚线零线呈拱形

右边的图是残差图:将每个残差(实际值减去预测值)与其预测值进行对照,并画出一条位于 0 的直线:

residuals = y_test - pred
fig, ax = plt.subplots()
ax.scatter(pred, residuals)
ax.axhline(0, color="gray", linestyle="--")
plt.show()

健康的残差会像噪声一样散布在 0 周围。出现规律说明模型遗漏了某些因素:这里是上升速度变慢了。

对于多个特征,也要分别绘制残差与每个特征的关系图:呈弧形的那个特征会掩盖曲线。

challenge icon

挑战

中等

一所驾校为 80 次制动测试拟合了一条直线,使用的数据是:speed_kmh 和 braking_m。起始代码将测试预测值保存在 pred 中,并为图表添加了标签。

  1. 计算残差。
  2. 将残差与预测值绘制成散点图,在图中添加一条位于 0 处的灰色虚线,然后显示图表。

这条直线是否没有捕捉到曲线趋势?在左侧,它甚至预测了负的制动距离。

使用其他数据时,表现良好的直线的图表如下所示:

标题为“表现良好的直线”的残差图:20 个点无规律地分布在 0 处的虚线上下

Coddy 会描述你的图表。

亲手试试

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

brakes = pd.read_csv("braking.csv")
X_train, X_test, y_train, y_test = train_test_split(brakes[["speed_kmh"]], brakes["braking_m"], test_size=0.25, random_state=0)
model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)

fig, ax = plt.subplots()
ax.set_title("Braking Line Check")
ax.set_xlabel("Predicted braking distance (m)")
ax.set_ylabel("Residual (m)")

# 在下面编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

监督学习中的所有课

自己练习: Python 在线编译器