欠拟合与过拟合
本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 32 课,共 58 课。
你已经遇到了机器学习中最大的陷阱:k = 1,深树也记住了数据。本章会为这个陷阱命名,并以这样的图表收尾:
陷阱:15 株罗勒植株采用不同的浇水方式,并用三条曲线拟合它们的收成:
1 次是太简单了:欠拟合。12 次曲线穿过每个训练点,在它们之间来回摆动:过拟合,只是在记忆,而不是学习。
np.polyval(coefs, x) 可以得到曲线的高度。训练集和测试集的 RMSE,单位为克:
for degree in [1, 3, 12]:
coefs = np.polyfit(water_train, grams_train, degree)
train_err = np.sqrt(mean_squared_error(grams_train, np.polyval(coefs, water_train)))
test_err = np.sqrt(mean_squared_error(grams_test, np.polyval(coefs, water_test)))
print(degree, round(train_err), round(test_err))它会打印:
1 156 138
3 15 19
12 9 173过拟合的表现:训练误差小,测试误差大。
挑战
中等风电场根据风速对一台风机的功率进行建模。起始代码会拆分 24 条读数,并读取 max_degree。
- 对于从 1 到
max_degree的每个阶数,使用训练数据拟合曲线;以整数 kW 为单位打印训练和测试 RMSE。 - 打印测试误差超过训练误差两倍的第一个阶数;如果没有,则打印
No overfitting up to degree和max_degree。
对于另一台风机,当 7 时:
Degree 1: train 117 kW, test 172 kW
Degree 2: train 115 kW, test 182 kW
Degree 3: train 64 kW, test 85 kW
Degree 4: train 63 kW, test 79 kW
Degree 5: train 47 kW, test 67 kW
Degree 6: train 47 kW, test 65 kW
Degree 7: train 23 kW, test 85 kW
Overfitting starts at degree 7亲手试试
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
max_degree = int(input())
# 不要修改下面的代码:它们表示一台风力发电机的风速(m/s)和功率(kW)。
speed = np.array([3.8, 4.3, 5.1, 5.6, 5.6, 6.7, 6.8, 7.2, 7.8, 8.5, 8.9, 9.1,
10.2, 10.9, 11.4, 11.9, 12.2, 12.4, 12.6, 13.2, 13.9, 14.4, 15.5, 16.5])
power = np.array([0, 85, 179, 22, 17, 126, 255, 273, 419, 545, 612, 665,
913, 1120, 1114, 1227, 1299, 1400, 1293, 1329, 1396, 1493, 1461, 1552])
speed_train, speed_test, power_train, power_test = train_test_split(
speed, power, test_size=0.25, random_state=0)
# 在下面编写你的代码。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
监督学习中的所有课
自己练习: Python 在线编译器