学习曲线
本课属于 Coddy Machine Learning 学习旅程的“监督学习”单元。第 33 课,共 58 课。
更多数据会让你的模型变得更好吗?学习曲线可以说明这一点:随着训练集增大,测试准确率会如何变化。这里展示的是在双月牙数据上使用深层决策树的结果:
这棵树记住了每个训练集,但每增加一行数据,它都能学到一些真实内容。灵活的模型从数据中获益最多。
使用前 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")还在右侧边缘向上攀升吗?更多数据会有帮助。
挑战
中等增加录音数量能帮助区分两种猫头鹰吗?起始代码将 600 次鸣叫分开,并准备好两个模型和图表。
- 对
sizes中的每个n,用前n行训练数据拟合两个模型,并记录它们在测试集上的准确率。 - 打印每个模型的增幅,即最后一个分数减去第一个分数,保留 3 位小数。
- 以
sizes为横轴绘制两条曲线,使用marker="o",标签分别为logistic和tree,并添加图例。
来自另一片林地的猫头鹰会打印:
Logistic gains 0.053 from more data
Tree gains 0.160 from more data并绘制这张图表。然后 Coddy 会描述你的图表。
亲手试试
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")
# 在下面编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
监督学习中的所有课
自己练习: Python 在线编译器