決定木の不純度指標シミュレーター 戻る
機械学習シミュレーター

決定木の不純度指標 — Gini・Entropy・誤分類率の比較

2クラス分類における3つの不純度指標を1つのグラフで比較。クラス比と分割を変えて、なぜCARTがGiniを使うのか、なぜ誤分類率が分割基準に向かないのかを直感的に学べます。

パラメータ設定
親ノードのクラス1比率 p1
左子ノードのサンプル数
左子ノードのクラス1比率
右子ノードのクラス1比率

右子ノードのサンプル数は100で固定。左子の比率は leftN/(leftN+100) で決まります。

計算結果
親 Gini 不純度
親エントロピー
Gini 情報利得
Entropy 情報利得
不純度カーブと分割の樹形図

上段:横軸=p1、3線(青=Gini、緑=Entropy、赤=誤分類率)/下段:親→左子・右子の分割樹形図

理論・主要公式

2クラス分類(p1=クラス1比率、p2=1−p1)における3つの不純度指標:

$$G = 2 p_1 p_2 = 2 p_1 (1 - p_1)$$

Shannonエントロピー(底2、p1=0,1ではH=0):

$$H = -p_1 \log_2 p_1 - p_2 \log_2 p_2$$

誤分類率:

$$ME = \min(p_1, p_2)$$

親→子分割の情報利得:

$$IG = I(\text{parent}) - \sum_k \frac{|S_k|}{|S|} I(S_k)$$

最大値はいずれも p1 = 0.5 で取り、Gini = 0.5、Entropy = 1.0、ME = 0.5 となります。

決定木の不純度指標シミュレーターとは

🙋
決定木って「if文を積み重ねたやつ」くらいのイメージなんですが、不純度ってなんですか?
🎓
ざっくり言うと、あるノードに集まったサンプルが「どれくらいクラスが混ざっているか」を測る指標だよ。例えば、リンゴとミカンが半分ずつのノードは「不純」、ほぼリンゴしかないノードは「純粋」。決定木はこの不純度をできるだけ小さくするように、毎回データを分割していくんだ。シミュレーターの「親ノードのクラス1比率 p1」を0.5から0や1に動かしてみて——Giniもエントロピーも誤分類率もスッと下がるでしょ。
🙋
あ、本当だ。3本の線が全部0.5でピークになって、両端で0になりますね。でも、Gini(青)とエントロピー(緑)は丸い山で、誤分類率(赤)は三角の山。なんでですか?
🎓
そこが大事なポイントだ。GiniとEntropyは「凹関数」と呼ばれる滑らかな山。誤分類率は折れ線——p1=0.5で角があるだろう。実は決定木の分割で情報利得を計算するとき、凹関数だと「分けるほど必ず利得が出る」性質があるんだ。誤分類率は折れ線なので、分けても利得が0になっちゃうケースが頻発する。だからCARTやID3は誤分類率を分割基準には使わない。剪定の評価には使うけどね。
🙋
「情報利得」っていうのが下の樹形図に出てる「IG_Gini」のことですか?親0.500から子の重み付け0.320を引いて0.180、みたいな。
🎓
その通り!式は IG = I(親) − Σ (|S_k|/|S|) · I(子_k) で、子ノードの不純度をサンプル数で重み付けして平均し、親から引く。デフォルト値(左 leftP1=0.8、右 rightP1=0.2)だと、左も右もそれぞれ片方のクラスに偏っていて純度が上がっているから、IGが大きくなる。試しに左右のp1を両方0.5にしてみて——IGがほぼ0になる。「分けても情報が増えていない」って意味だね。
🙋
scikit-learnのDecisionTreeClassifierって criterion='gini' がデフォルトですよね。なんでentropyじゃなくてgini?
🎓
実用上は両者の分割結果はほとんど変わらないんだ。研究でも「数%程度しか違わない」って報告が多い。それなら計算コストの低いGiniを使ったほうが速い——エントロピーは log2 が必要で、Giniは掛け算2回だけだからね。だからCARTはGiniを標準採用。一方、ID3やC4.5はエントロピー(情報利得)系統。実務でハイパーパラメータチューニングするときに、両方試してCVスコアを比較するのが堅実だよ。

よくある質問

2クラスの場合、G = 2·p1·p2 = 2·p1·(1−p1) です。これはp1の2次関数で、p1=0.5のとき最大値 2·0.5·0.5 = 0.5 を取ります。一般化すると K クラスでは最大値は 1 − 1/K で、2クラスなら0.5、3クラスなら2/3、10クラスなら0.9となります。Giniは「ランダムに2サンプルを選んだとき異なるクラスである確率」と解釈できます。
対数の底に何を使うかで単位が変わります。log2 を使えばbit、自然対数(ln)を使えばnat、log10ならditです。決定木やほとんどの機械学習文献では log2 が標準で単位はbitとなり、2クラスの最大値は1bit、Kクラスの一様分布での最大値は log2(K) bit です。本シミュレーターも log2 を使い、2クラスの最大値は1.0としています。
情報利得 IG を「分割情報量(Split Information)」で割って正規化した指標です。Gain Ratio = IG / SplitInfo で、SplitInfo は分割の枝の数や偏りに対するエントロピーです。素のIGは取り得る値が多い属性(例:顧客ID)を過大評価してしまうため、C4.5ではこのGain Ratioを使ってバイアスを補正します。CART(2分割)では枝数が常に2なので、この問題は比較的軽微です。
使えますが注意が必要です。極端な不均衡(例:99:1)ではGiniもEntropyも小さくなり、何も分割しなくても見かけ上「純度が高い」状態になります。scikit-learnでは class_weight='balanced' で各クラスを逆頻度で重み付けすることで、少数クラスの誤分類コストを上げる方法が一般的です。また、SMOTE等のオーバーサンプリングや、F1スコア・AUC等の評価指標の併用も検討しましょう。

実世界での応用

scikit-learn・XGBoost・LightGBM:Pythonの主要な機械学習ライブラリは、すべて内部でGiniまたはエントロピーを使って分割を評価しています。scikit-learnのDecisionTreeClassifierはcriterion='gini'がデフォルト、XGBoostやLightGBMの勾配ブースティング木も基本は同じ原理に基づきます。本シミュレーターで体感する「分割によって不純度が下がる」感覚は、これらライブラリの内部動作そのものです。

クレジットスコアリング・与信判断:金融業界では決定木やランダムフォレストが広く使われています。「年収」「勤続年数」「過去の延滞回数」等の属性を分割していき、デフォルト確率が高いグループと低いグループを分離します。Gini指数は金融分野では「ジニ係数」として所得格差の指標にも使われており、概念は共通です。

医療診断・症状からの疾患予測:患者の症状や検査値から疾患を予測する診断支援システムでは、解釈性の高い決定木が好まれます。「体温>38度ならインフル疑い、さらに咳があれば...」のような分岐は、医師の臨床推論プロセスに近く、不純度の減少=「症状によって疾患が絞り込めた度合い」と直感的に対応します。

製造業の不良品判定・品質管理:センサーデータから不良品を自動判定するシステムで、決定木が使われます。「温度>80度かつ振動>3.0G なら不良」のような明示的なルールが得られるため、現場のオペレーターでも判断根拠を理解しやすいのが特徴です。本シミュレーターで言う「左子の純度が高い分割」が、現場では「不良品が綺麗に分離される良い基準」に対応します。

よくある誤解と注意点

最も多い誤解は、「GiniとEntropyのどちらを選ぶかでモデル性能が大きく変わる」と考えてしまうことです。実際には、両指標の曲線形状は非常に似ており、分割結果は数%しか変わらないことがほとんどです。scikit-learnの公式ドキュメントにも「There is no clear empirical evidence to suggest that one is better than the other」と書かれています。重要なのはどちらを選ぶかではなく、木の深さ(max_depth)、最小サンプル数(min_samples_leaf)、剪定の強さ(ccp_alpha)といった他のハイパーパラメータをきちんと調整することです。シミュレーターでp1を動かして両曲線を見比べると、その類似性が一目瞭然です。

次に多いのが、誤分類率を分割基準に使おうとするミスです。「結局、誤分類を減らしたいのだから、誤分類率を最小化する分割を選べばいいのでは?」と考えてしまうのです。しかし、シミュレーターで左子と右子のp1を両方0.4と0.6のように非対称に設定してみてください。Giniは情報利得が出る一方、誤分類率の利得はゼロになる場合があります。これは誤分類率が折れ線(区分線形)で、凹関数のような分割への感度を持たないためです。誤分類率は分割基準としては不適切で、剪定の評価指標として使うのが正解です。

最後に、情報利得が大きい=必ず良い分割、ではない点に注意してください。極端な例として、各サンプルにユニークなIDを振って「ID=1なら左、ID=2なら右…」と分割すれば、全葉が純粋になりIGは最大化されますが、全く汎化しないモデルになります。C4.5のGain Ratioや、CARTの最小サンプル数制約、勾配ブースティングの正則化項などは、すべてこの「過学習につながる分割を抑制する」ための仕組みです。本シミュレーターのIG値は理論計算ですが、実務では交差検証やテストデータでの評価を必ず併用しましょう。