木(ツリー)の世界へようこそ!
皆さん、こんにちは!今日は、Exam PA(予測分析試験)の中で最も直感的で視覚的なテーマの一つ、決定木(Decision Trees)について学んでいきましょう。「20の質問ゲーム」をしたことがある方や、フローチャートに従ってインターネットの接続トラブルを解決したことがある方なら、すでに決定木の基本的な論理を理解しているも同然です。この章では、木の構築方法、木が「暴走」して複雑になりすぎるのを防ぐ方法、そして見たことのないデータに対しても正しく機能させる方法を学びます。最初は少し専門的だと感じるかもしれませんが、大丈夫です。一つひとつ丁寧に紐解いていきましょう!
1. 木の構築:再帰的二分割(Recursive Binary Splitting)
私たちが木を構築するとき、行っているのはデータをより小さく、より「純粋な」グループに分割する作業です。このプロセスを再帰的二分割と呼びます。洗濯物を分類する作業を想像してみてください。まず色(白物 vs 色物)で分け、次にその色物の中から生地の種類(綿 vs 化学繊維)で分けるといった具合です。
構築のステップ(順を追って):
1. トップからスタート: すべての観測データを含む一つの大きなグループ(ルートノード)から始めます。
2. 最適な分割: すべての予測変数と、可能な限りの「分割点」(例:年齢 < 30 vs 年齢 ≧ 30)を検討します。
3. 目標: 「不純度」を最も減少させる分割を選びます。最終的にできあがるグループ(リーフ/葉)の中身が、可能な限り似通ったものになるように目指します。
4. 繰り返す: 新しくできた枝それぞれに対して、同じ処理を繰り返します。これが「再帰的」と呼ばれる理由です。
成功の測定(数学的な側面)
分割が「良い」かどうかはどう判断するのでしょうか?それは何を予測するかによって決まります:
回帰木(数値を予測する場合):
残差平方和(RSS)を使用します。以下の値を最小化する分割点を探します:
\( \sum (y_i - \hat{y}_{R})^2 \)
訳: あるグループ内の実際の値が、そのグループの平均値にできるだけ近い状態を目指します。
分類木(カテゴリを予測する場合):
ジニ不純度(Gini Index)やエントロピーなどの尺度を使用します。
- ジニ不純度: \( G = \sum_{k=1}^{K} \hat{p}_{mk}(1 - \hat{p}_{mk}) \)
- エントロピー: \( D = -\sum_{k=1}^{K} \hat{p}_{mk} \log \hat{p}_{mk} \)
どちらの尺度も、ノードが「純粋」(グループ内のほぼ全員が同じカテゴリに属している状態)であればあるほど値は小さくなります。
クイック復習: 分割は「貪欲法(Greedy)」です。これは、5ステップ先のことまで考慮して木全体を最適化するのではなく、現時点で最も良い選択をその場で行うというアプローチであることを意味します。
2. 大きくなりすぎる危険性:過学習(Overfitting)
もし木を成長させ続け、個々の観測データがそれぞれ独自の小さなリーフに収まるまで分割したら、学習データに対する誤差は0%になります。完璧に聞こえますよね?違います! これこそが過学習という典型的な失敗例です。
例え: 練習問題の基礎的な概念を学ぶ代わりに、すべての問題と回答を一言一句暗記してしまうようなものです。本番の試験で少しだけひねった問題が出たとき、あなたは「パターン」ではなく「ノイズ(単なる丸暗記)」を覚えただけなので、解くことができず失敗してしまいます。
停止ルール(ハイパーパラメータ)
木が巨大で過学習した状態になるのを防ぐため、「停止ルール」を設けます:
- minbucket: リーフに含まれるべき最小の観測数。この数より小さくなるような分割は許可されません。
- maxdepth: 木が持てる最大の「階層」数。
- cp(複雑度パラメータ): 分割を行うために、誤差がどれだけ改善しなければならないかを示す閾値。
3. プルーニング:木の剪定
停止ルールを使っても、最初に大きく木を成長させてから、後で不要な枝を切り落とす「プルーニング」を行う方が良い結果が得られることがよくあります。これをコスト複雑度プルーニング(Cost Complexity Pruning)(または最弱リンクプルーニング)と呼びます。
木を評価するために以下の式を使います:
\( R_{\alpha}(T) = R(T) + \alpha |T| \)
- \( R(T) \) は誤差(RSSなど)です。
- \( |T| \) は末端ノードの数(木の大きさ)です。
- \( \alpha \)(アルファ): これは複雑さに対する「ペナルティ」です。
トレードオフ:
- \( \alpha = 0 \) の場合、ペナルティがないため、巨大で複雑な木になります。
- \( \alpha \) が大きくなるにつれ、リーフを増やすことへのペナルティが増大し、木はより小さくシンプルなものになります。
豆知識: R言語のパッケージ rpart において、複雑度パラメータ cp はこの \(\alpha\) に直接関連しています。cp が大きいほど、小さな木になるということです!
4. 検証:最適な木の選択
では、どの程度のプルーニング(最適な \(\alpha\))が完璧なのでしょうか?そこでK分割交差検証(K-fold Cross-Validation)を使います。
手順:
1. データを10個のグループ(フォールド)に分けます。
2. 9個のグループで木を学習させ、残りの1個でテストします。
3. これを様々な木のサイズで繰り返します。
4. 交差検証誤差が最も小さいサイズを選びます。
1-SEルール
Exam PAでは、1-SEルールについてよく耳にします。これは、誤差が最小となる木をそのまま選ぶのではなく、最小誤差から標準誤差(SE)の1倍以内に収まる範囲で、最も小さい(シンプルな)木を選ぶ手法です。
なぜか? 保険数理の分野では、倹約性(シンプルさ)が好まれるからです。モデルがシンプルであればあるほど、過学習の可能性は減り、ステークホルダーへの説明も容易になるからです!
5. まとめと重要ポイント
- 木は再帰的二分割という「貪欲」なアプローチで構築されます。
- 回帰木はRSSを最小化し、分類木はジニまたはエントロピーを最小化します。
- 過学習は、木が複雑すぎて信号ではなくノイズを取り込んでしまったときに起こります。
- プルーニングは、コスト複雑度を用いて精度とシンプルさのバランスを取ります。
- 交差検証は、最適な木のバージョンを選択するのに役立ちます。
- 覚え方: cpが高い=小さな木、cpが低い=大きな木。
避けたい一般的なミス: minbucket と minsplit を混同しないでください。minsplit は分割を「試みる」ために必要な観測数であり、minbucket は分割後にリーフに「残らなければならない」最小の観測数です。
頑張ってください! 木ベースのモデルは、ランダムフォレストやブースティングといった、より高度な技術の基礎となります。これらの基本をマスターすれば、合格はもう目前です!