初心者向け!決定木をわかりやすく解説【機械学習の基本】

決定木とは?

決定木(けっていぎ)は、英語で「Decision Tree」とも呼ばれ、機械学習の分野で広く使われる代表的な分析手法の一つです。 その名の通り、データが持つ特徴をもとに「はい/いいえ」で答えられる質問を繰り返しながら、データを分類したり、数値を予測したりするモデルです。 その構造が木の枝分かれのように見えることから、この名前が付けられました。

例えば、「明日はゴルフに行くべきか?」を判断する場合、「天気は晴れか? → YES」「風は強いか? → NO」といったように、条件分岐を繰り返して最終的な結論(「ゴルフに行く」または「行かない」)を導き出します。この一連の判断プロセスを可視化したものが決定木です。

この手法の最大の特長は、分析結果に至るまでのプロセスが非常に分かりやすい点です。 なぜそのような結論になったのかという理由やルールが直感的に理解できるため、「ホワイトボックスモデル」とも呼ばれています。

決定木の仕組み

決定木は、いくつかの基本的な要素から成り立っています。

  • ノード(Node / 節点): 木の分岐点にあたり、データを分けるための「質問」や「条件」を表します。一番上の最初のノードは「ルートノード」と呼ばれます。
  • ブランチ(Branch / 枝): ノードからのびる線で、質問に対する「答え」(例:YES/NO)を表し、次のノードへと繋がります。
  • リーフ(Leaf / 葉): 木の末端にある最終的な結論を表す部分です。これ以上分岐しないノードで、「分類結果」や「予測値」が格納されます。

学習の過程では、データを最も上手く分割できる質問(条件)を自動で見つけ出し、木を成長させていきます。この分割の基準としては、「ジニ不純度」や「情報利得(エントロピー)」といった指標が用いられます。

決定木の種類

決定木は、その目的によって大きく「分類木」と「回帰木」の2種類に分けられます。

種類目的出力結果の例
分類木 (Classification Tree)データをカテゴリ(クラス)に分けることを目的とします。「メールがスパムか否か」「顧客が商品を買うか買わないか」
回帰木 (Regression Tree)連続的な数値を予測することを目的とします。「住宅価格の予測」「来月の売上予測」

どちらの手法も、データを条件で分割していくという基本的な考え方は同じです。

メリットとデメリット

決定木は分かりやすく強力な手法ですが、メリットとデメリットの両方があります。

メリットデメリット
  • 解釈しやすい: 分析結果のルールが明確で、専門家でなくても直感的に理解しやすい。
  • 前処理が少ない: データの正規化など、複雑な前処理をあまり必要としないことが多い。
  • 汎用性が高い: 分類問題と回帰問題の両方に適用でき、様々な種類のデータを扱える。
  • 過学習(Overfitting)しやすい: 学習データに過剰に適合しすぎて、未知のデータに対する予測精度が低くなる傾向がある。
  • 不安定さ: 学習データが少し変わるだけで、木の構造が大きく変わってしまうことがある。

特にデメリットである過学習を克服するため、決定木を複数組み合わせてより高い精度を出す「ランダムフォレスト」や「勾配ブースティング」といった発展的な手法(アンサンブル学習)も利用されています。

ビジネスでの活用事例

決定木はその分かりやすさから、様々なビジネスシーンで意思決定のサポートに活用されています。

  • マーケティング: 顧客の属性や購買履歴から、キャンペーンに反応しやすい顧客層を特定し、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には決定木を可視化する機能もあり、どのようなルールで分類が行われているかを視覚的に確認することも可能です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です