決定木とは?
決定木(けっていぎ)は、英語で「Decision Tree」とも呼ばれ、機械学習の分野で広く使われる代表的な分析手法の一つです。 その名の通り、データが持つ特徴をもとに「はい/いいえ」で答えられる質問を繰り返しながら、データを分類したり、数値を予測したりするモデルです。 その構造が木の枝分かれのように見えることから、この名前が付けられました。
例えば、「明日はゴルフに行くべきか?」を判断する場合、「天気は晴れか? → YES」「風は強いか? → NO」といったように、条件分岐を繰り返して最終的な結論(「ゴルフに行く」または「行かない」)を導き出します。この一連の判断プロセスを可視化したものが決定木です。
この手法の最大の特長は、分析結果に至るまでのプロセスが非常に分かりやすい点です。 なぜそのような結論になったのかという理由やルールが直感的に理解できるため、「ホワイトボックスモデル」とも呼ばれています。
決定木の仕組み
決定木は、いくつかの基本的な要素から成り立っています。
- ノード(Node / 節点): 木の分岐点にあたり、データを分けるための「質問」や「条件」を表します。一番上の最初のノードは「ルートノード」と呼ばれます。
- ブランチ(Branch / 枝): ノードからのびる線で、質問に対する「答え」(例:YES/NO)を表し、次のノードへと繋がります。
- リーフ(Leaf / 葉): 木の末端にある最終的な結論を表す部分です。これ以上分岐しないノードで、「分類結果」や「予測値」が格納されます。
学習の過程では、データを最も上手く分割できる質問(条件)を自動で見つけ出し、木を成長させていきます。この分割の基準としては、「ジニ不純度」や「情報利得(エントロピー)」といった指標が用いられます。
決定木の種類
決定木は、その目的によって大きく「分類木」と「回帰木」の2種類に分けられます。
種類 | 目的 | 出力結果の例 |
---|---|---|
分類木 (Classification Tree) | データをカテゴリ(クラス)に分けることを目的とします。 | 「メールがスパムか否か」「顧客が商品を買うか買わないか」 |
回帰木 (Regression Tree) | 連続的な数値を予測することを目的とします。 | 「住宅価格の予測」「来月の売上予測」 |
どちらの手法も、データを条件で分割していくという基本的な考え方は同じです。
メリットとデメリット
決定木は分かりやすく強力な手法ですが、メリットとデメリットの両方があります。
メリット | デメリット |
---|---|
|
|
特にデメリットである過学習を克服するため、決定木を複数組み合わせてより高い精度を出す「ランダムフォレスト」や「勾配ブースティング」といった発展的な手法(アンサンブル学習)も利用されています。
ビジネスでの活用事例
決定木はその分かりやすさから、様々なビジネスシーンで意思決定のサポートに活用されています。
- マーケティング: 顧客の属性や購買履歴から、キャンペーンに反応しやすい顧客層を特定し、DMを送付するターゲットを絞り込む。
- 金融: 顧客の年齢、年収、借入状況などから貸し倒れリスクを評価し、融資の可否を判断する。
- 製造業: 設備の稼働データから故障に繋がるパターンを発見し、予防保全に役立てる。
- 医療: 患者の検査データから特定の疾患リスクを判別し、早期発見の補助とする。
Python (scikit-learn)での簡単な実装例
Pythonの機械学習ライブラリである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
# 1. データの準備
# アヤメ(iris)のデータセットを読み込む
iris = load_iris()
X = iris.data # 特徴量 (がくの長さ・幅, 花びらの長さ・幅)
y = iris.target # 正解ラベル (アヤメの品種)
# データを学習用とテスト用に分割する
# random_stateで分割を固定し、再現性を担保
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 2. モデルの選択と学習
# 決定木モデル(分類木)を作成
# max_depthは木の深さを指定し、過学習を防ぐ
clf = DecisionTreeClassifier(max_depth=3, random_state=42)
# 学習用データを使ってモデルを学習させる
clf.fit(X_train, y_train)
# 3. モデルの評価
# テスト用データを使って予測を行う
y_pred = clf.predict(X_test)
# 正解率を計算して表示する
accuracy = accuracy_score(y_test, y_pred)
print(f"モデルの正解率: {accuracy:.2f}")
# (実行結果例)
# モデルの正解率: 1.00
このコードでは、アヤメのがくや花びらのサイズから、どの品種に属するかを分類するモデルを構築しています。scikit-learnには決定木を可視化する機能もあり、どのようなルールで分類が行われているかを視覚的に確認することも可能です。