学習曲線
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 33/58。
データを増やすと、モデルの性能は向上するでしょうか?学習曲線を見るとわかります。これは、訓練セットが大きくなるにつれてテスト精度がどう変化するかを示します。ここでは、two-moonsデータに対する深い決定木を示します。
この木はすべての訓練セットを記憶しますが、行が増えるたびに実際に役立つことを学習します。柔軟なモデルほど、データから得るものが大きくなります。
最初の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")右端でもまだ上昇していますか?データを増やすと役立ちます。
チャレンジ
中級録音を増やせば、2種類のフクロウを見分けやすくなるでしょうか?スターターコードでは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オンラインコンパイラ