![見出し画像](https://assets.st-note.com/production/uploads/images/133288405/rectangle_large_type_2_139d27ab026ef8cecf15fa72dd51f068.png?width=1200)
[論文紹介コード付き] Isolation Forest (2008)
タイトル:Isolation Forest
著者:Fei Tony Liu, Kai Ming Ting, Zhi-Hua Zhou
機関:Monash University, Nanjing University
会議:ICML
リンク:http://www.lamda.nju.edu.cn/publication/icdm08b.pdf
アブストラクト
まずは論文のアブストラクトを日本語に訳します.
既存のモデルベースの異常検知アプローチの多くは、正常なインスタンスのプロファイルを構築し、そのプロファイルに合致しないインスタンスを異常とみなしています。本論文では、正常点のプロファイリングではなく、明示的に異常を分離するという、根本的に異なるモデルベースの手法を提案しています。私たちが知る限り、分離という概念は現在の研究では探求されていません。分離の利用により、提案手法であるiForestは、既存の手法では実現できない程のサブサンプリングを活用できるようになり、定数が小さく、メモリ要求量が低い線形時間計算量のアルゴリズムを作ることができました。我々の実証的評価によると、iForestはAUCと処理時間の面で、近似線形時間計算量の距離ベースの手法ORCAやLOF、ランダムフォレストよりも優れた性能を示しており、特に大規模データセットにおいてその傾向が顕著です。iForestは、多くの無関係な属性を持つ高次元問題や、訓練セットに異常が含まれない状況でも良好に機能します。
理解
Isolation Forestは2008年に提案されたもので,技術解説が多く存在します.そのため,ここからは既存の解説ブログをベースに理解していきます.
上記により,iForestは異常検出に特化したモデルであり,「何が正常か」を定義せずに異常を特定していくのが特徴のようです.これは,論文のアブストラクトに「正常点のプロファイリングではなく、明示的に異常を分離する」と書いてあるとおりで,検証の始まりである木の根本から葉までの距離を元に異常値かどうかを見つけ出しているようです.
コード
では試しにiForestをクレジットカードの不正利用検出に使ってみましょう.iForestはpyodというライブラリに組み込まれているので,簡単に試すことができます.下記がそのコードです.
import pandas as pd
from pyod.models.iforest import IsolationForest
from sklearn.metrics import classification_report
# クレジットカード取引データを読み込む
data = pd.read_csv('/kaggle/Credit Card Fraud Detection/creditcard.csv')
# 説明変数と目的変数に分ける
X = data.drop('Class', axis=1) # 説明変数
y = data['Class'] # 目的変数 (0: 正常, 1: 異常)
# データを訓練用とテスト用に分割する
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# IsolationForestモデルを初期化する
iforest = IsolationForest(random_state=42)
# モデルを訓練する
iforest.fit(X_train)
# テストデータで予測を行う
y_pred = iforest.predict(X_test)
# 評価指標を表示する
print(classification_report(y_test, y_pred))
クレジットカードの取引データは下記からダウンロードすることができます.
ちなみにスコアは以下のようになりました.高い精度とは言い難いですね.
precision recall f1-score support
-1 0.00 0.00 0.00 0
0 0.00 0.00 0.00 56864
1 0.00 0.17 0.00 98
accuracy 0.00 56962
macro avg 0.00 0.06 0.00 56962
weighted avg 0.00 0.00 0.00 56962
この記事が気に入ったらサポートをしてみませんか?