Menu
CoddyTech

木の深さ

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 29/58。

木は、すべての訓練データ行にそれぞれ答えが見つかるまで質問を続けることができます。その場合、学習したのではなく、暗記したことになります。

ノイズを含む半月形データにおける、深さ1から12までの木の訓練精度とテスト精度。訓練精度は深さ8までに1.0に達し、「暗記」と表示されている。テスト精度は深さ6で0.907に達し、破線で示された後、約0.87まで低下する

深い木は自身の訓練データのノイズまで学習するため、テスト精度はピークに達した後、低下します。いくつかの深さを試してみましょう。

train = []
test = []
for d in range(1, 13):
    tree = DecisionTreeClassifier(max_depth=d, random_state=0)
    tree.fit(X_train, y_train)
    train.append(tree.score(X_train, y_train))
    test.append(tree.score(X_test, y_test))

これらの月では、深さ6が新しい行に対して最も良い結果を出します。今のところはそのままにしておきましょう。深さ8では、木は記憶した行に対しては完璧ですが、それ以外の行では性能が低下します。

challenge icon

チャレンジ

中級

望遠鏡による調査では、天体を恒星と銀河に分類します。スターターコードでは、データを分割し、グラフを設定します。

  1. depthsの各深さについて、決定木を学習させ(random_state=0)、訓練精度とテスト精度の両方を記録します。
  2. 以下のように、テスト精度が最も高い深さを出力します。
  3. 2本の線をプロットし、trainとtestというラベルを付け、破線のax.axvlineで最適な深さを示し、凡例を追加して表示します。

マンゴーの分類器の場合:

Best depth: 5, test accuracy 0.867

その後、Coddyがグラフについて説明します。次のようなグラフです:

A chart titled Ripe or Not? with tree depth 1 to 10 across: a blue train line climbing to about 0.98, an orange test line peaking near 0.87 at depth 5 and a dashed vertical line there, with a legend

自分で試してみよう

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# 望遠鏡による観測データでは、天体ごとに1行:galaxy の値が 1 なら銀河、0 なら恒星
sky = pd.read_csv("sky.csv")
features = ["brightness_mag", "size_arcsec", "roundness", "color_index"]
X_train, X_test, y_train, y_test = train_test_split(sky[features], sky["galaxy"], test_size=0.25, random_state=0)
depths = range(1, 11)

fig, ax = plt.subplots()
ax.set_title("Star or Galaxy?")
ax.set_xlabel("Tree depth")
ax.set_ylabel("Accuracy")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ