Menu
CoddyTech

欠拟合与过拟合

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

你已经遇到了机器学习中最大的陷阱:k = 1,深树也记住了数据。本章会为这个陷阱命名,并以这样的图表收尾:

不同深度下决策树的训练准确率和验证准确率:训练准确率不断上升,趋近于 1.0;验证准确率在深度为 3 时达到峰值,随后下降。虚线标出选定的深度,红色星号标出唯一一次测试的得分:0.82

陷阱:15 株罗勒植株采用不同的浇水方式,并用三条曲线拟合它们的收成:

15 株训练植株的叶片收成以灰色圆点表示,5 株测试植株以黑色方块表示,横轴为每日浇水量。蓝色直线没有拟合出隆起部分,绿色 3 次曲线贴合了隆起部分,红色 12 次曲线在各个点之间剧烈波动

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

过拟合的表现:训练误差小,测试误差大。

challenge icon

挑战

中等

风电场根据风速对一台风机的功率进行建模。起始代码会拆分 24 条读数,并读取 max_degree。

  1. 对于从 1 到 max_degree 的每个阶数,使用训练数据拟合曲线;以整数 kW 为单位打印训练和测试 RMSE。
  2. 打印测试误差超过训练误差两倍的第一个阶数;如果没有,则打印 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)

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

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

监督学习中的所有课

自己练习: Python 在线编译器