Pythonの機械学習ライブラリ、Scikit-learn。その中でもDecisionTreeClassifierは、非常に有名で強力なアルゴリズムの一つです。
「決定木(Decision Tree)の仕組みはなんとなくわかるけど、どう実装すればいいの?」 「パラメータがたくさんあって、どれを調整すれば精度が上がるのか分からない…」 「学習させたモデルが、何を根拠に予測しているのか中身を見てみたい!」
この記事は、そんなあなたのための徹底解説ガイドです。
DecisionTreeClassifierの基本的な使い方から、精度を向上させるためのパラメータ調整、そしてモデルの判断根拠を明らかにする可視化の方法まで、具体的なコードを交えてステップバイステップで解説します。
この記事を読み終える頃には、DecisionTreeClassifierを自信を持って使いこなし、分類問題に取り組むための実践的なスキルが身についているはずです。
はじめに:DecisionTreeClassifierとは?
DecisionTreeClassifierは、決定木(Decision Tree) と呼ばれるアルゴリズムを用いて分類を行うためのScikit-learnのクラスです。その最大の特徴は、モデルの予測プロセスが人間にとって非常に理解しやすい点にあります。
決定木アルゴリズムの直感的な理解
決定木は、まるでフローチャートのように、データに関する質問を繰り返していくことで、最終的な答えを導き出します。
例えば、ある果物が「りんご」か「みかん」かを見分けるモデルを考えると、以下のような質問の連鎖で分類していきます。
- 質問1: 「色は赤いか?」
- YES → りんご の可能性が高い
- NO → 質問2: 「大きさは手のひらサイズか?」
- YES → みかん の可能性が高い
- NO → …
このように、シンプルなルールを木のように枝分かれさせながら組み合わせることで、データを分類していきます。このシンプルさと分かりやすさが、決定木の最大の魅力です。
Scikit-learnで手軽に実装
この強力な決定木アルゴリズムを、Scikit-learnは非常に使いやすい形で提供してくれています。複雑な数式を意識することなく、わずか数行のコードでモデルを構築できるため、多くのデータサイエンティストやエンジニアに利用されています。
DecisionTreeClassifierの基本的な使い方(実装4ステップ)
理論はさておき、早速コードを動かしてみましょう。ここでは、機械学習の入門で頻繁に使われる「アヤメ(Iris)の花」のデータセットを分類する流れを追っていきます。
ステップ1:ライブラリとデータの準備
最初に、必要なライブラリをインポートし、Scikit-learnに内蔵されているIrisデータセットを読み込みます。そして、データをモデルの学習用と性能評価用のテスト用に分割します。
# 必要なライブラリをインポート
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# Irisデータセットをロード
iris = load_iris()
X = iris.data # 特徴量データ
y = iris.target # 正解ラベル
# データを学習用(70%)とテスト用(30%)に分割
# random_stateを指定すると、毎回同じように分割されるため結果を再現できる
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
print(f"学習データの特徴量の形状: {X_train.shape}")
print(f"テストデータの特徴量の形状: {X_test.shape}")ステップ2:モデルのインスタンス化と学習
次に、DecisionTreeClassifierをインスタンス化(オブジェクトを作成)し、fit()メソッドで学習用データを渡してモデルを学習させます。
# DecisionTreeClassifierのインスタンスを作成
# random_stateは、モデルの内部的なランダム性を固定するために設定
clf = DecisionTreeClassifier(random_state=42)
# 学習用データを使ってモデルを学習させる
clf.fit(X_train, y_train)
print("モデルの学習が完了しました。")たったこれだけで、モデルの学習は完了です。
ステップ3:学習済みモデルで予測
学習させたモデルが未知のデータ(テストデータ)を正しく分類できるか試してみましょう。predict()メソッドにテストデータX_testを渡すことで、予測結果を得ることができます。
# テストデータを使って予測を実行
y_pred = clf.predict(X_test)
# 予測結果の先頭10件と、実際の正解ラベルを比較
print(f"予測結果: {y_pred[:10]}")
print(f"正解ラベル: {y_test[:10]}")ステップ4:モデルの精度評価
最後に、予測結果がどのくらい正しかったのかを「正解率(Accuracy)」という指標で評価します。accuracy_score()関数に、正解ラベルと予測結果を渡すだけで簡単に計算できます。
# 正解率を計算
accuracy = accuracy_score(y_test, y_pred)
print(f"モデルの正解率: {accuracy:.4f}")
# 出力例: モデルの正解率: 0.9778約97.8%の精度で分類できていることが確認できました。これがDecisionTreeClassifierを使った分類の基本的な流れです。
主要なパラメータを理解して精度を上げよう
DecisionTreeClassifierの真価は、パラメータを調整することで発揮されます。ここでは、モデルの性能に大きく影響する主要なパラメータを解説します。
criterion:分割品質の測定方法(ジニ不純度 or エントロピー)
criterionは、各ノードでデータを分割する際の「分割の良さ」を測る指標です。
'gini'(デフォルト): ジニ不純度。クラスの混じり具合が少ないほど値が小さくなります。計算が高速な傾向があります。'entropy': エントロピー。こちらもクラスの混じり具合を表す指標で、情報理論に基づいています。
どちらを使っても性能が劇的に変わることは稀ですが、データセットによっては差が出ることもあるため、試してみる価値はあります。
max_depth:木の深さを制限して過学習を防ぐ
max_depthは、決定木の最大の深さを整数で指定します。これは**過学習(オーバーフィッティング)**を防ぐために非常に重要なパラメータです。
木が深くなりすぎると、学習データに存在するノイズまで学習してしまい、未知のデータに対する予測精度が逆に低下してしまいます。max_depth=3やmax_depth=5のように制限をかけることで、より汎用的なモデルを作ることができます。
# 木の深さを最大3に制限してモデルを学習
clf_tuned = DecisionTreeClassifier(max_depth=3, random_state=42)
clf_tuned.fit(X_train, y_train)min_samples_split:ノード分割の最小サンプル数
min_samples_splitは、ノードをさらに分割するために必要な最小のサンプル数を指定します。デフォルトは2です。
例えばmin_samples_split=10と設定すると、あるノードに集まったサンプル数が10未満の場合、それ以上は分割されなくなります。これも木の成長を抑制し、過学習を防ぐ効果があります。
学習した決定木を可視化する方法
DecisionTreeClassifierの最大の利点は、その判断ロジックを可視化できることです。sklearn.treeモジュールのplot_tree関数を使えば、学習したモデルがどのようなルールでデータを分類しているのかを一目で確認できます。
plot_treeを使った簡単な可視化
matplotlibと組み合わせて、先ほどmax_depth=3で学習させたモデルを可視化してみましょう。
# 可視化のためのライブラリをインポート
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# 描画領域のサイズを指定
plt.figure(figsize=(20, 10))
# plot_tree関数で決定木を描画
plot_tree(clf_tuned, # 可視化するモデル
feature_names=iris.feature_names, # 特徴量の名前
class_names=iris.target_names, # 分類クラスの名前
filled=True, # ノードに色を付ける
rounded=True, # ノードの角を丸くする
fontsize=12) # 文字サイズ
plt.show()可視化結果からわかること
この図を見ることで、モデルが最初に「petal width (cm) <= 0.8」(花びらの幅が0.8cm以下か)という条件でデータを分割し、YESなら「setosa」に分類している、といった具体的な判断プロセスが明確にわかります。このようにモデルの内部を解釈できる能力は、ビジネス上の意思決定などで非常に重要になります。
DecisionTreeClassifierのメリットとデメリット
最後に、このアルゴリズムの強みと弱みをまとめておきます。
メリット:解釈しやすさが最大の強み
- ホワイトボックスモデル: なぜその予測結果になったのか、理由を可視化して説明できる。
- 実装が容易: Scikit-learnで簡単に実装、評価ができる。
- 前処理が比較的少ない: 特徴量のスケーリング(標準化など)が不要。
デメリット:過学習(オーバーフィッティング)に注意が必要
- 過学習しやすい: データを完璧に分類しようとして木が複雑になりすぎる傾向がある。パラメータ調整による「剪定」が不可欠。
- 不安定さ: 学習データが少し変わるだけで、木の構造が大きく変わってしまう可能性がある。
まとめ
本記事では、Scikit-learnのDecisionTreeClassifierについて、基本的な使い方からパラメータ調整、そして可視化までを徹底的に解説しました。
- 決定木は、シンプルな質問を繰り返してデータを分類する、解釈しやすいモデル。
fit()で学習、predict()で予測という簡単な流れで実装できる。max_depthやmin_samples_splitなどのパラメータ調整で、過学習を防ぎ精度を向上させることが重要。plot_treeを使えば、モデルの判断ルールを可視化し、ブラックボックス化を防げる。
DecisionTreeClassifierは、単体で使うだけでなく、ランダムフォレストや勾配ブースティングといった、より高度なアルゴリズの基礎にもなっています。ぜひこの機会にマスターして、あなたのデータ分析・機械学習スキルを一段階レベルアップさせてください。


コメント