Weight of Evidence (WOE) & Information Value (IV)

機械学習まわりで重要になるタスクの一つが特徴量(説明変数)の選択や生成である. この記事では,その選択や生成に関連して,特徴量を評価する指標であるWeight of Evidence (WOE)とInformation Value (IV)を解説する.

【目次】
1. Weight of Evidenceとは何か
2. Weight of Evidenceの計算方法と注意点
3. Information Valueとは何か
4. パッケージによる実装 (R & Python)
5. まとめ
6. References

1. Weight of Evidenceとは何か

WOEは二値分類問題(事象ありなしの判定)において「特徴量の影響度合」を数値化したものであり,ある一つの特徴量xに対して以下のように定義される.

 \displaystyle{
\text{WOE} := \log \frac{\text{(事象なしの割合)}}{\text{(事象ありの割合)}}
\hspace{1em} \text{for  }
{}^{\exists} x
}

ここで, {}^{\exists} xに対して,


\begin{aligned}
\text{(事象なしの割合)} &= \text{(xにおける事象なしの件数)} / \text{(事象なしの全件数)} \\
\text{(事象ありの割合)} &= \text{(xにおける事象ありの件数)} / \text{(事象ありの全件数)}
\end{aligned}


また, xは数値変数でもカテゴリ変数でもよい.このWOEをベースに特徴量をカテゴライズし直すことで,よりデータの分布をうまく反映する特徴量を生成することができる.

2. Weight of Evidenceの計算方法と注意点

定義だけではわかりにくいので,具体例を示しながらWOEの求め方を説明する.WOEの計算は以下の順で行う.

WOEの計算手順

1. 数値変数に対して,10~20ほどのビン(区分/グループ)に分ける.
NOTE: カテゴリ変数に対してはビンに分ける必要はない.
2. 各ビンについて,事象ありなしの件数を集計.
3. 各ビンについて,事象ありなしの割合を算出.
4. 各ビンについて,オッズ比の対数をとる.

例として年間における自動車の事故有無判定を考える.簡単のために,説明変数を走行距離のみとする.
手順1: 走行距離を1,000km単位で11個のグループ(ビン)に分ける.
手順2: それぞれのグループで事故のありなし件数をまとめる.
手順3: 事故なし総数と事故あり総数から,各グループで事故ありなしの割合を出す.
手順4: 各グループでオッズ比の対数としてWOEを計算.

適当に作成したデータで手順1から4を左から列でまとめると以下の表になる.

走行距離[km] ビン 事故なし 事故あり 事故なし[%] 事故あり[%] WOE
< 1,000 1 197 20 4.0 4.2 0.060
1,000 ~ 1,999 2 450 22 9.1 4.7 -0.671
2,000 ~ 2,999 3 492 38 10.0 8.1 -0.214
3,000 ~ 3,999 4 597 44 12.1 9.3 -0.261
4,000 ~ 4,999 5 609 54 12.4 11.5 -0.076
5,000 ~ 5,999 6 582 53 11.8 11.3 -0.049
6,000 ~ 6,999 7 386 36 7.8 7.6 -0.025
7,000 ~ 7,999 8 589 45 12.0 9.6 -0.225
8,000 ~ 8,999 9 424 52 8.6 11.0 0.249
9,000 ~ 9,999 10 378 46 7.7 9.8 0.241
>= 10,000 11 520 61 10.6 13.0 0.204
合計 4,924 471 100.0 100.0

■ 使い方

WOEがほぼ同じビンをまとめて新たなグループ分けとする.今回の場合,例えばビン9と10のWOEがかなり近いので,これらをまとめて新たなビンとしてカテゴライズする.

また,ここでは走行距離という数値変数をビンに分けてカテゴライズする方法を説明したが,カテゴリ変数でも機能する.カテゴリ変数の場合は,ビンに分けずにカテゴリのクラスをそのままビンと解釈して上のようにWOEを計算し,WOEが近いクラスをまとめて新たなカテゴリクラスとすればよい.

■ 整合条件

WOEの計算においては以下の条件を満たすべきと言われている.

  • 各ビンは全レコード数の少なくとも5%を含む.
  • 各ビンは事象ありなしをともに1件以上含む.
  • 各ビンごとにWOEは異なる.(ほぼ同じWOEのビンはまとめる.)
  • WOEは単調(増加or減少)である.
  • 欠損値は独立のビンにする.

■ ビン数

WOE計算において問題となるのがグループ分けの数である.

  • 少なすぎる ⇒ データの特徴を捉えにくくなる.
  • 多すぎる ⇒ 過学習の原因となり得る.

という問題があるため,ある程度適切に数を決めなければならないが,これまでの研究や事例によると10~20くらいがよいとされている.ビンの数が適切かどうかは以下の方法で確かめられる.

  1. WOEをプロットして単調性を検証.
  2. 1変数だけでロジスティック回帰を行い,傾きが1,もしくは切片がWOEになっているかどうか.

■ 事象ありなしが0の場合

ビン分けをした際にあるビンで事象ありorなしの件数が0だった場合,そのままではWOEが発散するので定義式を以下のように調整する.

 \displaystyle{
\text{WOE} := \log \frac{( \text{#(ビンにおける事象なしの件数)} + 0.5 ) \text{ / #(事象なしの全件数)}}{( \text{#(ビンにおける事象ありの件数)} + 0.5 ) \text{ / #(事象ありの全件数)}}
}

■ WOEのメリット

  • 外れ値の影響を抑えられる.
  • 欠損値があってもそのまま扱える.
  • カテゴリ変数を直接使える(ダミー変数化する必要がない).
  • オッズ比の対数で線形関係が作れる.

■ WOEのデメリット

  • 二値分類問題にしか使えない.

3. Information Valueとは何か

Information Value (IV)は「特徴量の重要度」を測る指標であり,ある特徴量 xについて以下のように定義される.

\displaystyle
\text{IV} := \sum _ {i \in \{ \text{bins} \}} \left\{ \text{(事象なしの割合)} _ {i} - \text{(事象ありの割合)} _ {i} \right\} \times \text{WOE} _ {i}
\hspace{1em} \text{for  }
{}^{\exists} x

IVを特徴量のビンごとに求めたい場合は \sumを外せば良い.

下表のようにIVはその値によって重要度が分類されている.

IV 重要度
< 0.02 Not useful for prediction
0.02 ~ 0.1 Weak predictive Power
0.1 ~ 0.3 Medium predictive Power
0.3 ~ 0.5 Strong predictive Power
> 0.5 Suspicious Predictive Power

■ IVの特徴

  • ビンの数が増えるとIVは大きくなる.
  • ロジスティック回帰による二値分類以外には適用しにくい(SVMやランダムフォレストなどでは高精度でロバストなモデルを生成できない).

4. パッケージによる実装 (R & Python)

RとPythonによる実装例はこの記事で紹介されている.

■ R

"Information"というライブラリのcreate_infotables()によりIVが計算でき,各変数のWOEは"$Tables$変数名"から取り出せる.

Python

残念ながらパッケージがないので自作で実装.

5. まとめ

  • WOEは特徴量の影響度合を数値化したもので,特徴量生成の指標となる.
  • IVは特徴量の重要度を表す指標で,値が大きいほど重要度が高い.
  • 変数の種類(数値かカテゴリか)には依存しない.
  • 外れ値や欠損値もそのまま扱える.
  • ただし,これらは二値分類問題にしか適用できない.

6. References