1. 決定木とは?
決定木(Decision Tree)は、機械学習の中でも特に理解しやすい教師あり学習のアルゴリズムの一つです。名前の通り、木のような構造(ツリー構造)を使って、データを分類したり、数値を予測(回帰)したりします。
イメージとしては、連続する「もし〜なら、こうする」というルール(条件分岐)の集まりです。データの特徴に基づいて質問を繰り返し、最終的な答え(分類結果や予測値)にたどり着きます。例えば、「天気は晴れか?」「気温は25度以上か?」といった質問を経て、「アイスクリームを買うか買わないか」を予測するようなモデルです。
決定木は、その分かりやすさから、ビジネスの意思決定プロセスを説明する際などにも活用されます。
2. 決定木の構造
決定木は、いくつかの要素で構成されています。
- ノード (Node): 木の分岐点や終点を表します。
- 根ノード (Root Node): 木の一番上にある最初のノード。ここからデータの分割が始まります。データセット全体を表します。
- 内部ノード (Internal Node): データをさらに分割するための中間的なノード。各内部ノードは、特定の特徴量に対する分割ルール(条件)を持ちます。
- 葉ノード (Leaf Node / Terminal Node): 木の末端にあるノード。これ以上分割されず、最終的な予測結果(クラスラベルや予測値)を表します。
- エッジ (Edge / Branch): ノードとノードをつなぐ線のこと。内部ノードの分割ルール(条件)に基づいて、データがどの次のノードに進むかを示します。
決定木は、根ノードから始まり、各内部ノードで設定された条件に基づいてデータを振り分け、最終的にいずれかの葉ノードに到達することで予測を行います。
3. 情報利得 (Information Gain) とは? 🤔
決定木を作る上で重要なのは、「どの特徴量で、どのようにデータを分割すれば、最も効率よく分類できるか?」を決めることです。その指標となるのが情報利得 (Information Gain) です。
情報利得を理解するには、まずエントロピー (Entropy) という概念を知る必要があります。
3.1. エントロピー (Entropy)
エントロピーは、元々情報理論の概念で、データの「不純度」や「乱雑さ」を表す指標です。エントロピーが高いほど、データが様々なクラス(種類)で混ざり合っている状態(不純な状態)を示します。逆に、エントロピーが低い(ゼロに近づく)ほど、データが特定のクラスに偏っている状態(純粋な状態)を示します。
例えば、赤玉と青玉が入った箱を考えます。
- 箱の中身が全て赤玉の場合:エントロピーは最小(0)。中身が完全に予測可能です。
- 箱の中に赤玉と青玉が半々で入っている場合:エントロピーは最大(1)。中身が最も予測しにくい状態です。
決定木では、各ノードでデータを分割する際に、分割後の子ノードのエントロピーができるだけ低くなる(=より純粋なグループになる)ような分割を目指します。
3.2. 情報利得の計算
情報利得は、「分割前のノードのエントロピー」から「分割後の子ノードのエントロピーの加重平均」を引いた値で計算されます。
情報利得 = (親ノードのエントロピー) – Σ [(各子ノードのデータ数 / 親ノードのデータ数) × (各子ノードのエントロピー)]
情報利得が大きいほど、その分割によってエントロピーが大きく減少した(=より純粋なグループに分けられた、データの情報が増えた)ことを意味します。決定木アルゴリズム(ID3やC4.5など)は、情報利得が最大になるような特徴量と分割ルールを選択して木を成長させていきます。
4. ジニ不純度 (Gini Impurity)
情報利得(エントロピー)と並んでよく使われる不純度の指標にジニ不純度 (Gini Impurity) があります。CART (Classification and Regression Trees) アルゴリズムなどで利用されます。
ジニ不純度は、「あるノードからランダムに選んだデータが、誤って分類されてしまう確率」を表します。値は0から0.5(2クラス分類の場合)または1(多クラス分類の場合)の範囲を取り、0に近いほど純粋な状態を示します。
計算式は以下のようになります(`p(i)` はクラス `i` に属するデータの割合)。
ジニ不純度 = 1 – Σ [p(i)^2]
ジニ不純度もエントロピーと同様に、値が小さいほど純粋であることを意味します。決定木では、分割によってジニ不純度が最も減少する(=分割後のジニ不純度の加重平均が最も小さくなる)ような分割を選びます。
エントロピーと比較して、ジニ不純度は対数計算を含まないため、計算負荷が若干軽いという特徴があります。どちらを使うかはアルゴリズムやライブラリによりますが、多くの場合、結果に大きな差は出にくいとされています。
5. 決定木のメリット・デメリット 💪😥
決定木には以下のようなメリットとデメリットがあります。
メリット | デメリット |
---|---|
解釈しやすい: 木構造が視覚的に分かりやすく、ルールを人間が理解しやすい。 | 過学習しやすい: データに合わせすぎて複雑な木になりやすく、未知のデータに対する精度が低下することがある(対策として「枝刈り(Pruning)」などがある)。 |
前処理が少ない: 特徴量の正規化や標準化が基本的に不要。カテゴリ変数も扱いやすい。 | 不安定: データの小さな変動で木の構造が大きく変わることがある。 |
非線形な関係も捉えられる: データの複雑なパターンを捉えることができる。 | 最適な木を見つけるのが困難: 全ての可能な木構造から最適なものを見つけるのは計算量的に難しい(ヒューリスティックなアルゴリズムが使われる)。 |
特徴量の重要度がわかる: どの特徴量が分類や予測に重要かを判断しやすい。 |
特に過学習しやすいというデメリットを克服するために、複数の決定木を組み合わせるアンサンブル学習(ランダムフォレストや勾配ブースティングなど)がよく用いられます。
6. Python (scikit-learn) での実装例 🐍
Python の機械学習ライブラリ scikit-learn
を使うと、簡単に決定木モデルを構築できます。ここでは分類問題を例に、基本的な使い方を紹介します。
# 必要なライブラリのインポート
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
# データセットのロード (アヤメのデータセットを使用)
iris = load_iris()
X = iris.data
y = iris.target
# 学習データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 決定木モデルのインスタンスを作成
# criterion='gini' (デフォルト) または criterion='entropy' を指定可能
# max_depth で木の深さを制限し、過学習を防ぐことができる
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)
# モデルの学習
clf.fit(X_train, y_train)
# テストデータで予測
y_pred = clf.predict(X_test)
# モデルの評価 (正解率)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
# (任意) 木構造の可視化 (別途 graphviz 等が必要な場合あり)
# from sklearn.tree import plot_tree
# import matplotlib.pyplot as plt
# plt.figure(figsize=(12, 8))
# plot_tree(clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
# plt.show()
DecisionTreeClassifier
の criterion
パラメータで、分割基準としてジニ不純度 ('gini'
) か情報利得(エントロピー) ('entropy'
) を選択できます。また、max_depth
などのハイパーパラメータを調整することで、モデルの複雑さをコントロールし、過学習を抑制することが重要です。
まとめ
今回は、決定木の基本的な構造と、木を成長させるための重要な指標である情報利得(およびジニ不純度)について解説しました。
- 決定木は、木構造でデータを分類・回帰する解釈しやすいモデル。
- 根ノード、内部ノード、葉ノードで構成される。
- 情報利得やジニ不純度といった指標を用いて、最適な分割ルールを見つける。
- 情報利得は、エントロピー(不純度)の減少度合いを表す。
- ジニ不純度は、誤分類の確率を表す。
- 解釈しやすい反面、過学習しやすいデメリットもある。
決定木は単体で使われるだけでなく、ランダムフォレストなどのより強力なアンサンブル学習の基礎となる重要なアルゴリズムです。ぜひ理解を深めていきましょう!🚀