枝刈りとは?決定木の過学習対策・方法・評価を解説

枝刈りとは、決定木の枝や葉を削除して、学習データへの適合しすぎ(過学習)を抑える手法です。

決定木は分割を重ねるほど訓練データを細かく分類できますが、データ固有の偶然まで覚えて、未知データで性能が下がることがあります。そこで枝刈りでは、予測にほとんど寄与しない分割を取り除きます。

枝刈りとは?決定木の複雑さを抑えて汎化性能を高める方法

決定木は、特徴量の条件でデータを二つ以上の子ノードに分け、分割後のクラス不純度や誤差を下げる処理を繰り返します。深い木では、訓練データの1件だけを分ける条件まで作れるため、訓練スコアは高くなります。

しかし、その条件が新しいデータでも有効とは限りません。枝刈りは、木の構造を小さくして、偶然の分割を予測ルールから外します。

枝刈りで目指すのは、訓練データの正解率を高めることより、検証データや将来データで安定して予測できる木にすることです。さらに、ルールを人が確認できることや、推論や保守のコストを抑えることも含めて、適切な複雑さを選びます。

ただし、葉を削りすぎると表現力が不足するため、アンダーフィッティングとのバランスも評価します。

枝刈りと過学習の関係|訓練性能と検証性能の差

木の深さや葉の数を横軸、訓練スコアと検証スコアを縦軸にとると、枝刈りの効果を確認できます。浅い木では両方のスコアが低く、深くするにつれて検証スコアが改善します。

さらに深くすると訓練スコアだけが上がり、検証スコアが下がる領域が現れます。枝刈りは、この過学習領域へ入る前、または入った後に木を簡素化する操作です。

分類では、正解率だけでなく、少数クラスの再現率、適合率、F1、混同行列も見ます。回帰では、MAEやRMSEと、予測残差の分布を見ます。

クラス不均衡や外れ値があると、単一のスコアが枝の選択を誤らせることがあります。そのため、業務上の誤りコストに合った指標を選びます。

ポイント

訓練スコアと検証スコアの差が広がり始める深さを、枝刈りの要否を判断する目安にします。差がどこから開くかは、深さや葉数を変えた結果を並べると見分けやすくなります。

事前枝刈りの方法|木を成長させる段階での制限

max_depthによる深さの制限

max_depth は、根から葉までの最大深さを指定するパラメータです。値を小さくすると木のルールが短くなり、局所的な分割を抑えられます。

ただし、大きすぎると過学習し、小さすぎると複雑な関係を表現できません。候補値は交差検証で比較し、訓練スコアと検証スコアの差やルールの長さを記録します。

min_samples_splitによる分割に必要な件数の指定

min_samples_split は、ノードをさらに分割するために必要な最小サンプル数です。値を増やすと、少数のデータだけで作る枝が減ります。

ただし、割合で指定した場合は、データ数に応じて実際の件数が変わります。そのため、学習データのサイズを変えたときの挙動も確かめておく必要があります。

min_samples_leafによる葉の最小件数の保証

min_samples_leaf は、分割後の各葉に残す最小サンプル数を指定します。葉が1件だけになるのを防ぎ、分類確率や回帰平均のばらつきを抑える効果があります。

顧客や店舗のように同じグループの観測が複数ある場合は、件数だけで判断せず、グループ単位の評価と組み合わせます。

min_impurity_decreaseによる改善幅の要求

min_impurity_decrease は、分割によって不純度が一定以上改善する場合にだけ分割を許可するパラメータです。わずかな改善しかない分割を除けます。

ただし、サンプル重みやクラス重みを使うと、計算される改善幅も変わります。そのため、パラメータの意味を実装バージョンの公式ドキュメントで確かめ、重みを含む学習条件を固定して比較します。

ポイント

深さや件数の制限、改善幅の要求は、訓練と検証のスコア差が小さく、ルールも短くなる値で選びます。どの制限が効いているかは、候補値を交差検証で比べて見極めます。

事後枝刈りの方法|大きな木からの不要な枝の削除

事後枝刈りでは、まず停止条件を緩めた木を成長させ、複雑な候補を作ります。その後、予測性能を大きく損なわない枝を順に削ります。候補を比較しやすい一方、最大の木を作るため、学習時の計算量やメモリが増えます。

データが少ない場合は、事前枝刈りと交差検証を組み合わせ、過度に大きな木を作らない設計も検討します。

コスト複雑度枝刈りとccp_alpha

scikit-learnの決定木では、コスト複雑度枝刈りを ccp_alpha で制御できます。その考え方は、木の不純度に葉の数に応じた複雑さのペナルティを加え、合計の評価が小さくなる部分木を選ぶことです。ccp_alpha=0 では通常、事後枝刈りを行わず、値を大きくするほど複雑な枝が削られます。

from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(random_state=42)
path = tree.cost_complexity_pruning_path(X_train, y_train)
alphas = path.ccp_alphas

models = [DecisionTreeClassifier(ccp_alpha=a, random_state=42).fit(X_train, y_train)
          for a in alphas]

cost_complexity_pruning_path は、枝を削る候補となる複雑度パラメータと不純度の情報を返します。候補はそのまま採用せず、訓練データ内の交差検証で検証スコアを比べて選びます。最終的な評価は、パラメータ選択に使っていないテストデータで一度だけ行い、選択後の性能を報告します。

ポイント

事後枝刈りを使うかは、学習時の計算量やメモリに余裕があるかで決めます。ccp_alphaの候補は、訓練データ内の交差検証で検証スコアを比べて選びます。

枝刈りのパラメータを選ぶ手順|交差検証と業務制約の組み合わせ

1. 目的と評価指標の決定

まず、誤分類や予測誤差のどれを減らしたいかを決めます。たとえば、医療のスクリーニングなら少数クラスの見逃し、審査なら誤承認と誤却下、予測値なら許容できる金額や時間のずれが問題になります。

単純なaccuracyだけで枝刈りの設定を選ぶと、業務上重要なクラスの性能が見えなくなります。そのため、主指標と補助指標を事前に定めておきます。

2. データ分割と前処理の固定

パラメータを選ぶ検証データと最終テストデータは、必ず分けておきます。時系列データなら未来の期間を評価側に置き、同じ顧客や設備が学習側とテスト側にまたがる場合は、グループ分割を検討します。

欠損補完やカテゴリ変換の基準は、学習分割だけに合わせます。そうしないと、テストデータの情報が枝の選択に漏れてしまいます。

3. 検証スコアと木の複雑さの比較

各パラメータについて、検証スコアと葉の数、深さを記録します。学習時間と推論時間も、あわせて残します。検証スコアがほぼ同じなら、葉が少なく説明しやすい木を選ぶ価値があります。

交差検証の平均だけでなく分割ごとのばらつきも見て、特定の期間やグループにだけ依存していないかを確かめます。

4. 最終テストと再学習

設定を選んだら、テストデータで一度だけ評価します。問題がなければ、運用で利用する学習データ全体に、同じ設定で再学習します。

再学習後の木は、パラメータ選択時と構造が変わる可能性があります。そのため、木のルールと特徴量の順序を保存しておきます。加えて、クラス対応とモデルファイルのハッシュも残します。

ポイント

業務上の誤りコストに合う指標を主指標に置き、スコアがほぼ同じなら、葉が少なく説明しやすい木を選びます。最終的な性能は、設定選択に使わなかったテストデータで一度だけ測ります。

枝刈りの効果|性能・説明性・運用コストの評価

枝刈り後の木は、条件分岐が減るため、人が中身を確認しやすくなります。審査や営業支援など、予測理由を説明する必要がある業務では、深い木より短いルールが適することがあります。

ただし、浅くすれば説明が必ず正確になるとは限りません。各葉のサンプル数、クラス割合、適用条件を表示し、説明対象のケースがどの葉に到達したかを追跡します。

木が小さくなるほど、推論速度やメモリ使用量も改善する可能性があります。低遅延のAPIやエッジ端末では、精度が少し下がっても、計算量が安定する木を採用する価値があります。

一方で、ランダムフォレストや勾配ブースティングの各木を個別に枝刈りする場合は、アンサンブル全体での検証が必要です。単一木で得た効果を、そのままアンサンブルに当てはめないようにします。

枝刈りで失敗しやすい点と対策

テストデータのパラメータ選択への利用

ccp_alphaやmax_depthを、テストスコアを見ながら調整すると、テストデータへ過学習します。テストデータは最終確認だけに残し、パラメータ選択は訓練データ内の交差検証で行います。

テスト結果が期待より悪かったときも、同じテストデータで何度も設定を変えないようにします。

サンプルの少ない葉の性能だけによる評価

訓練データで不純度が0の葉が多くても、各葉が数件しかなければ、新しいデータで不安定になります。そこで、葉ごとの件数と検証時の誤りを確かめ、min_samples_leafを設定します。

ただし、少数クラスの葉を単純に削ると見逃しが増える場合があります。そのため、クラス別の指標を併記します。

分布の変化の考慮不足

本番のクラス割合や特徴量の分布が学習時から変わると、枝刈りで選んだ木の性能も変わります。そこで、期間別、地域別、顧客属性別に評価し、データドリフトを監視します。

運用手順には、再学習の基準、木の深さや葉数の上限、性能が下がった場合の切り戻し方法を含めます。

ポイント

テストデータはパラメータ選択に使わず、最終評価に一度だけ使います。少数クラスの葉や期間別・地域別の評価も含め、どこで崩れるかを見て判断します。

枝刈りまとめ|検証データによる適切な複雑さの選択

枝刈りは、決定木の不要な分割を削除し、過学習を抑えながら汎化性能と説明性を整える方法です。枝刈りには、max_depth、min_samples_split、min_samples_leafなどで成長中の木を制限する事前枝刈りと、ccp_alphaを使って大きな木から部分木を選ぶ事後枝刈りがあります。

設定はテストデータを見ずに、交差検証で選びます。検証スコアだけでなく、葉数や深さ、推論コストを比べ、少数クラスの性能と説明のしやすさも確かめます。評価条件を固定し、データ分割と前処理の情報漏えいを防ぎます。

木を小さくすること自体を目的にせず、未知データで安定し、業務の誤りコストに合うモデルを選んでください。

よくある質問(FAQ)

Q. 枝刈りとは何ですか?

枝刈りとは、決定木の不要な枝や葉を削除し、過学習を抑える手法です。木の複雑さを下げ、未知データでの汎化性能や説明性を改善します。

Q. 事前枝刈りと事後枝刈りの違いは何ですか?

事前枝刈りは木を成長させる途中で深さやサンプル数を制限します。事後枝刈りは大きな木を作ってから、複雑度のペナルティなどで不要な枝を削ります。

Q. ccp_alphaは何を表しますか?

ccp_alphaはコスト複雑度枝刈りの複雑度パラメータです。大きくすると葉の数に対するペナルティが強くなり、より小さな部分木が選ばれます。交差検証で値を決めます。

Q. 枝刈りの設定はどう選びますか?

訓練データ内の交差検証で、主指標と補助指標、木の深さ、葉数、推論コストを比較します。最終的な性能は、設定選択に使っていないテストデータで一度だけ確認します。

Q. 深い決定木は必ず枝刈りすべきですか?

必ずではありませんが、深い木は過学習しやすいため、検証性能と葉のサンプル数を確認します。枝刈り前後を同じ条件で比較し、精度、説明性、運用コストに合う設定を選びます。

参考資料

枝刈りの実装と評価方法を確認できる公式資料です。

会社紹介

株式会社riplaでは、お客様の事業・ユーザー・業務に最適化したオーダーメイド型システムを、構想策定・要件定義から開発・改善まで一気通貫で支援。事業会社でIT・DXを経験したプロフェッショナルによる高い要件定義力・システム設計力を活かし、事業成果の最大化に伴走します。

また、当社独自の開発テンプレート「Boxシリーズ」による標準機能の高速開発と、AI駆動開発の独自フレームワーク「GoDD」による独自機能のAI実装を組み合わせることで、低コスト・短期間で開発を実現いたします。

もし、システム開発やプロダクト開発に関するご要望がございましたら、お気軽にお問い合わせください。

・サービス概要資料のURLはこちら >>>
・お問合せページのURLはこちら >>>
・お役立ち資料のURLはこちら >>>

執筆者プロフィール
張田谷凌央
張田谷凌央

株式会社ripla 代表取締役CEOとして、システムパッケージ活用、システム開発、データ分析、生成AI活用、SaaS開発、アプリ開発、EC構築など、幅広い領域で企業のDX推進と事業成長を支援している。事業会社でIT・DXを経験したプロフェッショナルが集う株式会社riplaにおいて、お客様の事業・ユーザー・業務に最適化したオーダーメイド型システムを構想策定・要件定義から開発・改善まで一気通貫で支援し、単なるシステム納品にとどまらず、クライアントと同じ目線で事業成果の最大化に向けた伴走支援を行う。早稲田大学卒業後、ラクスル株式会社、LINEヤフー株式会社にて事業開発やDX推進などに従事した後、株式会社riplaを創業。