Menu
CoddyTech

衡量误差

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

模型的误差有多大,以美元计是多少?下面是一个房价模型在它从未见过的 5 栋测试房屋上的表现:

5 根柱子,每根对应一栋测试房屋,表示房价模型的误差大小:20、40、10、90 和 30 千美元。虚线标出 MAE,为 38;点线标出 RMSE,为 47.1,数值更高,这是因为有一次较大的 90 千美元误差

sklearn.metrics 会帮你衡量预测误差:

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

y_test = np.array([290, 410, 235, 520, 330])  # 千美元
pred = np.array([270, 450, 245, 430, 360])
print(mean_absolute_error(y_test, pred))
print(np.round(np.sqrt(mean_squared_error(y_test, pred)), 1))
print(np.round(r2_score(y_test, pred), 3))

这会输出:

38.0
47.1
0.776

MAE,即平均绝对误差,表示典型的预测偏差:38 千。RMSE 会先将偏差平方并求平均,再开平方:一次较大的偏差会使它升到 47。

这两者的单位都与目标值相同。r2_score 是你的 R²:它解释了价格波动的 78%。

challenge icon

挑战

中等

一家商店用模型为二手相机定价。加入第二个特征有帮助吗?程序读取 shutter_k(拍摄照片数,以千张计)或 megapixels。起始代码训练两个模型,一个只使用 age_years,另一个还使用额外特征,并将它们对测试数据的预测保存在 preds 中。

  1. 对每个模型,打印 MAE、RMSE(保留 1 位小数)和 R 平方(保留 3 位小数)。
  2. 打印 MAE 较小的模型。

对于另一家商店和 shutter_k:

age_years: MAE 212.4, RMSE 268.1, R squared 0.853
age_years + shutter_k: MAE 98.7, RMSE 121.0, R squared 0.97
Better: age_years + shutter_k, off by 98.7 dollars on a typical camera

亲手试试

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 每台售出的相机占一行:使用年限、以千次为单位的快门次数、像素数(百万像素)、价格(美元)
cameras = pd.read_csv("cameras.csv")
extra = input()
names = ["age_years", "age_years + " + extra]
columns = [["age_years"], ["age_years", extra]]
# 按整行拆分数据;下面的每个模型各自选择所需的列
X_train, X_test, y_train, y_test = train_test_split(cameras, cameras["price"], test_size=0.25, random_state=0)
# 每个列列表对应一个模型,以及该模型对测试集相机的预测结果
preds = []
for cols in columns:
    model = LinearRegression()
    model.fit(X_train[cols], y_train)
    preds.append(model.predict(X_test[cols]))

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

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

监督学习中的所有课

自己练习: Python 在线编译器