ジニ係数と情報エントロピー|高校数学の演習を通して理解する決定木・ランダムフォレスト #3

f:id:lib-arts:20190427143114p:plain

上記ではニューラルネットワークを中心に取り扱いましたがその他アルゴリズムも取り扱えればということで、決定木・ランダムフォレストについて新規で連載をスタートしました。
#1では微分の最小値問題の復習と関数の増減表について、#2では二項定理について取り扱いました。

#3では決定木の学習の際に設定する不純度(inpurity)を計算するにあたって用いられる、ジニ係数と情報エントロピーに関して取り扱います。
以下、目次になります。

1. 例題⑤ ジニ係数の増減表
2. 例題⑥ 情報エントロピーの増減表
3. まとめ

 

1. 例題⑤ ジニ係数の増減表
1節では、ex.02で取り扱った関数の増減表の考え方を元にジニ係数の増減表について取り扱います。具体的には、二値分類問題を想定し、成功する確率をp、失敗する確率を(1-p)とおきます。この際に情報エントロピーを用いた不純度I(Gini)の式は下記になります。
I(Gini) = 1-p^2-(1-p)^2

ex.05
(1) f(x)=1-x^2-(1-x)^2の増減表をかけ。
(2) f(x)のグラフをPythonを用いて描け(参考)

Answer.
(1) まずはf'(x)を計算する。
f'(x)=-2x+2(1-x)=-4x+2
これを考察することで、f'(x)x \lt \frac{1}{2}のとき、0より大きく、\frac{1}{2} \lt xのとき0より小さい。また、f(0)=0f(1)=0したがって増減表は下記のようになる。

f:id:lib-arts:20190504234108p:plain

(2) 下記のコードを実行することでPythonで描画することができる。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0.01,1,0.01)
y = 1-x**2-(1-x)**2

plt.plot(x,y)
plt.show()

実行結果は下記のようになる。

f:id:lib-arts:20190428231331p:plain
解説.
(1)と(2)はそれぞれ手計算とPythonによる描画で二値分類問題におけるジニ係数の関数の可視化を行っています。
ここで、着目なのが、p=0p=1では不純度は0の値、p=\frac{1}{2}では不純度は最大値1を取ります。これを考察することで、不純度は不確かさが高い状況で大きな値を取るということを納得することができます。


2. 例題⑥ 情報エントロピーの増減表
2節では、ex.02で取り扱った関数の増減表の考え方を元に情報エントロピーの増減表について取り扱います。具体的には、1節と同様に二値分類問題を想定し、成功する確率をp、失敗する確率を(1-p)とおきます。この際に情報エントロピーを用いた不純度I(entropy)の式は下記になります。
I(entropy) = -(plogp + (1-p)log(1-p))
ここで、log(0)は値を持たないため、0 \lt p \lt 1を仮定するとします。

ex.06
(1) f(x) = -(xlog(x) + (1-x)log(1-x))0 \lt x \lt 1区間での増減表をかけ
(2) \lim_{x \to +0} f(x)を求めよ
(3) \lim_{x \to 1-0} f(x)を求めよ
(4) f(x)のグラフをPythonを用いて描け(参考)

Answer.
(1) まずはf'(x)を計算する。
f'(x)=-logx-1+log(1-x)+1=log(\frac{1}{x}-1)
ここで、0 \lt x \lt 1において\frac{x}{1-x}x \lt \frac{1}{2}のとき1より大きく、\frac{1}{2} \lt xのとき1より小さい。したがってf'(x)x \lt \frac{1}{2}のとき0より大きく、\frac{1}{2} \lt xのとき0より小さい。よって増減表は下記のようになる。

f:id:lib-arts:20190428222032p:plain
(2) x = \frac{1}{y}とおく。このとき、以下のように計算できる。
\lim_{x \to +0} f(x) = \lim_{x \to +0} -xlogx = \lim_{y \to +\infty} \frac{logy}{y} = 0
ここで、logyyの収束の速さを用いている。
(3) x_ = 1-xとおけば(2)と同様に0を導出できる。
(4) 下記のコードを実行することでPythonで描画することができる。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0.01,1,0.01)
y = -(x*np.log2(x) + (1-x)*np.log2(1-x))

plt.plot(x,y)
plt.show() 

実行結果は下記のようになる。

f:id:lib-arts:20190428224328p:plain

解説.
以下、問題の解釈を行います。(4)のPythonで描いたグラフを手計算で導出する過程が(1)〜(3)だと考えていただければ良いです。(1)でグラフの増減についてわかるのですが、0と1に限りなく近づくところでのf(x)の極限も気になるところです。これについては(2)と(3)で値を計算しており、極限は0となっています。
このことから、(4)の描画と(1)〜(3)の手計算が一致し、関数の形のイメージがつくのではないかと思います。


3. まとめ
1節で取り扱ったジニ係数と2節で取り扱った情報エントロピーはグラフにしてみるとどちらも似たような形をしています。
機械学習などの工学で用いられる数学は、望ましい振る舞いをする関数を設定して近似するということもよく行うので、関数そのものの厳密性も重要ですが、どういった挙動が望まれているかに着目した上で考察するというのもなかなか面白かったりします。
今回はジニ係数と情報エントロピーの二つの二値分類を取り扱いましたが、どちらも似たような関数が得られ、これ自体はなかなか興味深い結果なのではと思います。