決定木の世界へようこそ!
このセクションでは、実際に決定木を「成長」させる方法、そしてさらに重要な「剪定(せんてい)」して新しいデータに対しても完璧に機能させる方法を学びます。決定木を本物の植物だと想像してみてください。手入れをせずに放置すれば、扱いづらい絡まり合った茂みになってしまいます。しかし、慎重に剪定すれば、予測を行うための美しく有用なツールに生まれ変わるのです。
決定木は、関係者(上司やクライアントなど)に説明しやすく、人間が意思決定を行うプロセスと似ているため、アクチュアリーに非常に好まれています。さあ、詳しく見ていきましょう!
クイック復習: 決定木は、入力変数の値に基づいてデータをさまざまなグループ(ノードと呼びます)に分割することを思い出してください。一番下の最終的なグループは葉(リーフ)や末端ノードと呼ばれます。
ステップ1:木の構築(再帰的二分割法)
木の構築を始めるときは、再帰的二分割法(Recursive Binary Splitting)というプロセスを使います。名前が難しそうに聞こえるかもしれませんが、分解してみると実はとてもシンプルです。
1. 再帰的(Recursive): 生じた各枝に対して、このプロセスを何度も繰り返します。
2. 二分割(Binary): 各分割は必ず2つの枝に分かれます(例:「はい」または「いいえ」)。
3. 分割(Splitting): データをより小さなグループに分けていきます。
「欲張り(Greedy)」なアプローチ:
決定木の構築は欲張りアルゴリズムです。これは、各ステップにおいて、コンピュータがモデルを改善するために今すぐできる最も優れた分割を探すことを意味します。今の「少し悪い」分割が、後で「ずっと良い」分割につながる可能性があるかどうかといった先読みはしません。まさに「今この瞬間」を生きているのです!
どの分割が「ベスト」かどう判断するのか?
それは、何を予測しようとしているかによって決まります。
回帰木の場合(数値を予測):
残差平方和(RSS)を最小化することを目指します。各リーフに含まれるデータポイントが、そのリーフの平均値にできるだけ近くなるようにしたいのです。式は次のようになります。
\( RSS = \sum_{j=1}^{J} \sum_{i \in R_j} (y_i - \hat{y}_{R_j})^2 \)
解説: 全ての最終領域(\( R_j \))において、合計の二乗「誤差」を最小化したいということです。
分類木の場合(カテゴリを予測):
結果として得られるグループを「純粋」にしたいと考えます。あるリーフが100%「カテゴリA」で0%「カテゴリB」であれば、それは完全に純粋です。これには通常、ジニ不純度(Gini Index)やエントロピーを用います。これらの値が低いほど、そのグループはより「純粋」であることを意味します。
豆知識: ジニ不純度は、よくノードの不純度の指標と呼ばれます。ジニ不純度が0であれば、そのノードは完全に純粋(グループ内の全員が同じカテゴリ)ということです。
まとめ: 木は上から下へ、一度に1つの分割ずつ構築していきます。その瞬間において、誤差(RSS)や不純度(ジニ不純度/エントロピー)を最も減少させる分割を選択するのです。
ステップ2:大きくなりすぎる危険性
もしデータセット内のすべての人が自分専用のリーフを持つまで分割を繰り返すと、トレーニングデータに対する誤差率は0%になります。しかし、そこには大きな問題があります。過学習(オーバーフィッティング)です。
過学習とは、木が実際のパターンではなく、特定のデータセットに含まれる「ノイズ」や偶然の癖を学習してしまう現象です。過学習した木は、練習問題の答えを丸暗記しただけで数学の根本を理解していない学生のようなものです。本番の試験で数値が変わると、全く解けなくなってしまいます!
バイアスとバリアンスのトレードオフ:
- 巨大で複雑な木はバリアンスが高い(データを少し変えるだけで結果が大きく変わる)。
- 分割が1回しかない小さな木はバイアスが高い(単純すぎて本当のパターンを捉えられない)。
ステップ3:木の剪定(コスト複雑度剪定)
過学習を解消するために、まずは非常に大きな木を成長させ、そこからより小さな部分木(サブツリー)を見つけるために「剪定」を行います。しかし、適当に部分木を選ぶわけにはいきません。可能性が多すぎるからです!そこで、コスト複雑度剪定(Cost-Complexity Pruning)(別名:Weakest Link Pruning)を使います。
どの枝を切り落とすべきかを決めるために、特別なスコアを使用します。スコアの式は次の通りです。
\( \sum_{m=1}^{|T|} \sum_{i \in R_m} (y_i - \hat{y}_{R_m})^2 + \alpha|T| \)
この式を「アクチュアリー用語」で解説します:
1. 前半の \( \sum \sum (y_i - \hat{y}_{R_m})^2 \) は、単なるRSS(木がどれだけデータに適合しているか)です。
2. 後半の \( \alpha|T| \) はペナルティです。
- \( |T| \) は末端ノード(リーフ)の数です。リーフが多い=複雑であるということです。
- \( \alpha \)(アルファ)は調整パラメータです。これは木が複雑すぎることに対してどれだけ「罰則」を与えるかを決める数字です。
\( \alpha \) の働き:
- \( \alpha = 0 \) の場合:ペナルティはありません!巨大な元の木がそのまま得られます。
- \( \alpha \) が非常に大きい場合:ペナルティが巨大です!非常に小さな木(場合によってはノード1つだけ)になってしまいます。
- \( \alpha \) を0から大きくしていくと、枝は予測可能な順番で一つずつ切り落とされていきます。
覚え方: \( \alpha \) はリーフに対する「税金」だと考えてください。税金が安ければ、木は多くのリーフを持つことができます。税金が高ければ、利益を保つために木はダウンサイジングしなければなりません。
まとめ: 剪定は、単純すぎず複雑すぎないバランスの良い木を見つけるのに役立ちます。このバランスを制御するために、調整パラメータ \( \alpha \) を使うのです。
ステップ4:最適なアルファ(\(\alpha\))の選択
どの値の \( \alpha \) を使うべきか、どうやって知るのでしょうか?それにはK分割交差検証(K-Fold Cross-Validation)を使います!
1. データを \( K \) 個のグループ(フォールド)に分けます。
2. 各 \( \alpha \) の値について、一部のフォールドで木を構築し、残りのフォールドでテストします。
3. テストフォールドで平均誤差が最も小さくなる \( \alpha \) を選定します。
よくある間違い: トレーニングデータで最も良く見える \( \alpha \) を選んではいけません。必ず検証用データや交差検証を使って \( \alpha \) を選んでください。そうしないと、また過学習に逆戻りしてしまいます!
ステップ・バイ・ステップのまとめ
少し大変そうに感じるかもしれませんが、大丈夫です。優れた木を作るための標準的なレシピは以下の通りです:
1. 再帰的二分割法を使って、トレーニングデータで大きな木を成長させる(ノードが非常に小さくなるまで止まらない)。
2. コスト複雑度剪定を適用し、\( \alpha \) の関数として最適な部分木のシーケンスを見つける。
3. K分割交差検証を使って、最適な \( \alpha \) を選択する。
4. 手順2で見つけた部分木のうち、選択した \( \alpha \) に対応するものを使用する。
最終クイック・レビュー
- 成長戦略: トップダウン、欲張り(Greedy)、再帰的二分割法。
- 回帰の目標: RSSの最小化。
- 分類の目標: ジニ不純度またはエントロピーの最小化。
- 問題点: 大きすぎる木は過学習する(バリアンスが高い)。
- 解決策: ペナルティ項 \( \alpha|T| \) を使った剪定。
- 調整: 交差検証を使って最適な \( \alpha \) を選択する。
あなたなら大丈夫!決定木とは、可能な限りベストな分割を行い、その後で不要な部分を掃除して、新しいデータに対しても賢いモデルを維持するためのプロセスに過ぎません。