Menu
CoddyTech

学习曲线

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

更多数据会让你的模型变得更好吗?学习曲线可以说明这一点:随着训练集增大,测试准确率会如何变化。这里展示的是在双月牙数据上使用深层决策树的结果:

准确率与训练数据行数的关系,行数从 25 到 800。训练曲线始终保持在 1.0;测试曲线从 0.80 上升到 0.94

这棵树记住了每个训练集,但每增加一行数据,它都能学到一些真实内容。灵活的模型从数据中获益最多。

使用前 n 行训练数据进行拟合,然后每次都在相同的测试行上评分:

sizes = [25, 50, 100, 200, 400, 800]
test_scores = []
for n in sizes:
    tree = DecisionTreeClassifier(random_state=0)
    tree.fit(X_train[:n], y_train[:n])
    test_scores.append(tree.score(X_test, y_test))
ax.plot(sizes, test_scores, marker="o")

还在右侧边缘向上攀升吗?更多数据会有帮助。

challenge icon

挑战

中等

增加录音数量能帮助区分两种猫头鹰吗?起始代码将 600 次鸣叫分开,并准备好两个模型和图表。

  1. 对 sizes 中的每个 n,用前 n 行训练数据拟合两个模型,并记录它们在测试集上的准确率。
  2. 打印每个模型的增幅,即最后一个分数减去第一个分数,保留 3 位小数。
  3. 以 sizes 为横轴绘制两条曲线,使用 marker="o",标签分别为 logistic 和 tree,并添加图例。

来自另一片林地的猫头鹰会打印:

Logistic gains 0.053 from more data
Tree gains 0.160 from more data

并绘制这张图表。然后 Coddy 会描述你的图表。

猫头鹰鸣叫:学习曲线。logistic 曲线从 0.64 上升到约 0.69 后保持平稳;tree 曲线从 0.67 稳步上升到 0.83

亲手试试

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

# 不要修改下面的代码行:600 次猫头鹰叫声,包含音高(Hz)和时长(s)
rng = np.random.default_rng(23)
pitch = np.round(rng.uniform(300, 900, 600))
length = np.round(rng.uniform(0.2, 2.0, 600), 2)
# 物种 1 是灰林鸮,相对于它的音高,叫声持续时间更长;少数野外记录有误
longer = length > 0.5 + 6.4 * ((pitch - 600) / 600) ** 2
wrong_note = rng.random(600) < 0.05
species = np.where(longer != wrong_note, 1, 0)
X = np.column_stack([pitch, length])
X_train, X_test, y_train, y_test = train_test_split(X, species, test_size=0.25, random_state=0)

sizes = [25, 50, 100, 200, 400]
logistic = LogisticRegression(max_iter=1000)
tree = DecisionTreeClassifier(random_state=0)

fig, ax = plt.subplots()
ax.set_title("Owl Calls: Learning Curves")
ax.set_xlabel("Training rows")
ax.set_ylabel("Test accuracy")

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

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

监督学习中的所有课

自己练习: Python 在线编译器