5.16.2
Isolation Forest
まとめ
- Isolation Forestを使って時系列データの異常値をラベルなしで検出する。
- 人工データに異常値を混入し、検出精度を検証する。
- 決定木の分岐ルールを可視化して、異常判定の根拠を確認する。
Isolation Forest #
Isolation Forestを使って異常値を検出してみます。時系列データの中に異常値を混ぜ、それが検出できるかどうか検証します。最後に異常値と判定したルールを可視化します。
| |
人工データの作成 #
[11, 49, 149, 240, 300, 310]の日付にて異常値を混ぜておきます。
カテゴリ変数や整数の特徴も含まれるデータです。数値のみプロットしてみます。
| |
<Axes: >

| |
| 月 | 曜日 | 特徴1 | 特徴2 | 特徴3 | 特徴4 | |
|---|---|---|---|---|---|---|
| 2016-01-01 | 01 | Friday | 0.432678 | 1.645027 | 1.118289 | ☀ |
| 2016-01-02 | 01 | Saturday | 0.099463 | 1.645734 | 0.289383 | ☀ |
| 2016-01-03 | 01 | Sunday | 0.297490 | 1.613958 | 2.499115 | ☀ |
| 2016-01-04 | 01 | Monday | 1.043077 | 1.029947 | 0.484240 | ☀ |
| 2016-01-05 | 01 | Tuesday | 0.184797 | 1.355265 | 2.795718 | ☁ |
| ... | ... | ... | ... | ... | ... | ... |
| 2016-12-26 | 12 | Monday | 0.914207 | 1.580330 | 0.617349 | ☂ |
| 2016-12-27 | 12 | Tuesday | 1.229753 | 1.599599 | 2.605319 | ☀ |
| 2016-12-28 | 12 | Wednesday | 0.936100 | 1.408378 | 2.540507 | ☀ |
| 2016-12-29 | 12 | Thursday | 1.156575 | 1.428601 | 0.831889 | ☀ |
| 2016-12-30 | 12 | Friday | 1.383185 | 1.544629 | 1.416885 | ☁ |
365 rows × 6 columns
カテゴリ変数の変換 #
「曜日」のような特徴をIsolation Forestで扱うためにダミー変数に変換します。
| |
| 特徴1 | 特徴2 | 特徴3 | 月_01 | 月_02 | ... | 曜日_Thursday | 曜日_Tuesday | 曜日_Wednesday | 特徴4_☀ | 特徴4_☁ | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2016-01-01 | 0.432678 | 1.645027 | 1.118289 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-01-02 | 0.099463 | 1.645734 | 0.289383 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-01-03 | 0.297490 | 1.613958 | 2.499115 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-01-04 | 1.043077 | 1.029947 | 0.484240 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-01-05 | 0.184797 | 1.355265 | 2.795718 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2016-12-26 | 0.914207 | 1.580330 | 0.617349 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-12-27 | 1.229753 | 1.599599 | 2.605319 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-12-28 | 0.936100 | 1.408378 | 2.540507 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-12-29 | 1.156575 | 1.428601 | 0.831889 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
| 2016-12-30 | 1.383185 | 1.544629 | 1.416885 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... |
365 rows × 25 columns
Isolation Forestの作成 #
| |
検出した日付と正解の比較 #
異常値として検出したタイミングと正解を比較します。
| |


異常値のルール #
サンプル数(samples)が1の分岐が一番右にあり、それは特徴1による分岐だと分かります。 実際、今回の異常値は特徴1が大きすぎる値のときに異常値になりやすいです。
| |

- rupturesで変化点検出 — rupturesライブラリで変化点を自動検出
- Zスコアで異常値検出 — 閾値超えの観測点を異常値として検出
- Isolation Forest (基本) — 機械学習アルゴリズムとしてのIsolation Forest