本文へスキップ
BecomeCoder

Python AIコース · 第3章 分類 ― カテゴリを当てる · レッスン9

決定木で分類する

ブラウザで完結

導入

決定木(decision tree)は、「花びらの長さは2.5cm以上か?」といったYes/Noの質問を枝分かれでつないで分類する手法です。人間の判断に近く、仕組みが読み取りやすいのが魅力です。

説明

DecisionTreeClassifier で学習します。学習後、どの特徴量を重視したか(feature_importances_)も見られます。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

iris = load_iris()
X, y = iris.data, iris.target

model = DecisionTreeClassifier(max_depth=3, random_state=0)
model.fit(X, y)

print("予測:", model.predict([X[0], X[75], X[120]]))
print("正解:", [y[0], y[75], y[120]])

# どの特徴量が判断に効いたか
for name, imp in zip(iris.feature_names, model.feature_importances_):
    print(f"{name}: {imp.round(3)}")

決定木は「質問を重ねて答えにたどりつく」ので、なぜその予測になったのかを追いやすいモデルです。feature_importances_ を見ると、分類の決め手になった特徴量(多くの場合、花びらの寸法)が分かります。

max_depth=3 は木の深さ(質問の段数)の上限です。深くしすぎると次章で学ぶ「過学習」になりやすいので、ほどほどにします。

やってみよう

max_depth1 にすると予測がどう変わるか、10 にするとどうかを試しましょう。浅すぎると大ざっぱに、深すぎると訓練データに過剰に合わせにいきます。

演習

DecisionTreeClassifiermax_depth2 にしてモデルを学習し、X[120] の予測ラベルを表示してください。

ヒント1を見る

DecisionTreeClassifier(max_depth=2, random_state=0) で学習後、model.predict([X[120]])

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、scikit-learn で本物の機械学習モデルをその場で訓練できます。scikit-learn を使う回は初回の読み込みに時間がかかります(数十秒かかることがあります)。本文の例をそのまま試したり、数値を書き換えたりして、結果の変化を確かめましょう(グラフ内の文字は英字で書きます)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。