衡量误差
本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 13 课,共 58 课。
模型的误差有多大,以美元计是多少?下面是一个房价模型在它从未见过的 5 栋测试房屋上的表现:
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.776MAE,即平均绝对误差,表示典型的预测偏差:38 千。RMSE 会先将偏差平方并求平均,再开平方:一次较大的偏差会使它升到 47。
这两者的单位都与目标值相同。r2_score 是你的 R²:它解释了价格波动的 78%。
挑战
中等一家商店用模型为二手相机定价。加入第二个特征有帮助吗?程序读取 shutter_k(拍摄照片数,以千张计)或 megapixels。起始代码训练两个模型,一个只使用 age_years,另一个还使用额外特征,并将它们对测试数据的预测保存在 preds 中。
- 对每个模型,打印 MAE、RMSE(保留 1 位小数)和 R 平方(保留 3 位小数)。
- 打印 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]))
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
监督学习中的所有课
自己练习: Python 在线编译器