本記事では、異常検知に特化した決定木アルゴリズムであるIsolation Forestについて解説します。

Isolation Forestとは

Isolation Forestは、異常検知に使われる機械学習アルゴリズムです。データをランダムに選んで分割する木(ツリー)を多数作成し、異常値は少ない分割で孤立する性質を利用します。異常なデータポイントは、より浅いレベルで他と分離されるため、早期に見つかります。つまり、分割が少ないデータほど異常と見なされます。これにより、大規模なデータセットでも効率的に異常値を検出する事が可能です。

異常検知の重要性

異常検知の社会的需要は目まぐるしい勢いで増加しています。

例えば、世界の異常検出市場は、2022年から2030年までに53億米ドルから150億米ドルまでの収益増加、2023年から2030年の予測期間にかけて年平均成長率(CAGR)が16.10%で成長すると予測されています。特に金融、ヘルスケア、製造など、皆さんの生活に欠かせない分野で異常検知の技術はかなりコアな技術になってきています。

基礎知識

Isolation Forestを知る上で最も大事なのは決定木という概念です。決定木を利用したアルゴリズムは多く、優れた手法ですので、まずはどういうものか知っておきましょう。

決定木とは

一般的に木構造を用いてデータを分析する手法のことを決定木といいます。

木構造とはなんでしょうか?下の図をみてください。

このような構造を木構造といいます。複数のノードがあり、上から下にノードが分かれていっていますね。一番上のノードを親ノード、親ノードより下のノードを子ノードといいます。これ以上分岐しない、一番下のノードを葉ノードといいます。

この構造を利用して回帰や分類を解く問題が決定木になります。データが理解しやすく、解釈しやすい形であるため、多くの応用分野で利用されています。

ノードはデータを分割する条件がそれぞれ入ります。決定木の流れは下の図をみてください。

ここでは身長、体重、握力というパラメータで閾値を設定し(今回は170、60、45)、ターゲットを男性かどうかを判別するタスクで決定木を利用している様子を表しています。

機械学習は一般的にデータを入力して、そのデータをなんらかの形で分類したり、連続値を算出するものです。この図も機械学習アルゴリズムの一つで、入力を親ノードに入力し、さまざまな条件で分岐され、最終的に葉ノードへと到達します。葉ノードに示された結果が予測値となります。今回の図だと1番左の葉ノードである80%が最も高い確率となりました。

決定木はこの複数の条件の閾値を学習していきます。最適な条件を設定することで、データをより正確に処理していくように学習する、というものです。

ランダムフォレストとの違い

木構造の代表的なアルゴリズムとしてランダムフォレストがあります。Isolation Forestは聞いたことがなくても、ランダムフォレストは聞いたことがある人は多いのではないでしょうか。フォレストという単語が入っていることから、ランダムフォレストも決定木を扱うアルゴリズムです。

ランダムフォレストの基本概念

ランダムフォレストは複数の決定木を用いて分類や回帰を行うアンサンブル手法のことをいいます。それぞれの決定木が学習するデータの部分集合をランダムに選ぶことで個々の決定木のバラエティを高め、全体のモデルの性能を向上させるものです。

ランダムフォレストは分類問題では各決定木の出力の多数決を取る事で、全体の予測を行います。

回帰問題では、各決定木の出力の平均を取ります。

Isolation Forestとの比較

結論からいうと、ランダムフォレストは分類や回帰タスクとして利用される事が多く、Isolation Forestは異常検知に特化した分類を行います。どちらもデータを分割して複数の決定木を作成するプロセスは同じです。後に説明しますが、Isolation Forestはこの決定木から異常スコアを計算します。そしてある閾値に対して異常スコアがその閾値より上か下かで異常、否異常の2値に分けられます。2つの各プロセスは下の図のようになります。

Isolation Forestのアルゴリズム

Isolation Forestがどういうアルゴリズムで異常を検知しているのかをみていきましょう。

先ほど説明したようにランダムフォレストと同じく、複数の決定木を作成した後に、データごとの異常スコアを計算する事でデータの異常を判別します。これを詳しくみていきましょう。

今回はイメージしてもらいやすいように特徴量が2つの場合にしぼって解説します。ただし3次元以上でもIsolation Forestは適応できます。

Isolation Forestにおける決定木を作成するアルゴリズムを順番に説明します。

  1. ランダムに特徴量を選択する
  2. 選択した次元の最小値〜最大値の範囲をランダムに選択、次元を交互に変えながら分割
  3. 全データが孤立するまで2を繰り返す(この際に決定木を作成)
  4. 異常スコアを計算し、異常データポイントを分類する

図を使ってみていきましょう。下の図は5つのデータポイントをIsolation Forestのアルゴリズムを用いて分割した様子を表しています。

ここから得られる決定木は以下のようになります。この決定木をIsolation Treeといいます。

さて、このように分割したデータポイントごとにたくさんの決定木をつくった後に、異常スコアを計算し異常データポイントを特定します。決定木からどのように異常スコアを計算するのでしょうか?

結論からいうとデータポイントのパス長に注目します。パス長とは根ノードからデータポイントまでの距離のことです。勘のいい方なら分かったかと思いますが、このパス長が短いほど、早い段階で分割されたデータポイントとなり、異常スコアに大きな影響を与えます。異常スコアは以下の定義式で表す事ができます。

$$H(i) = ln(i) + 0.5772156649 $$
$$s(x,n)=2^{-\frac{E(h(x))}{c(n)}}$$
$$c(n)=2H(n-1)-\frac{2(n-1)}{n}$$

ここで、0.5772156649はオイラー定数です。また、\( E(h(x)) \)はデータポイント\( x \)の平均パス長を表しています。\( c(n) \)はサンプルサイズ\( n \)に対して正規化して調整するもの、という認識で大丈夫です。この2つから、平均パス長が低いほど異常スコアは1に近づくのが分かると思います。反対に、否異常スコアであるほど0に近づくようになっています。

この異常スコアがある閾値より高いか低いかで異常、否異常を判断しています。

やってみよう【基礎編】

実際にIsolation Forestがどのように動いているのか、みてみましょう。今回は有名なsklearnが提供しているアヤメのデータセットを用います。Isolation Forestを用いて、どのようなアヤメデータが異常と判断され、それを可視化する事を目標にしたいと思います。

まずは必要なライブラリを読み込みます。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

from sklearn.datasets import load_iris
from sklearn.tree import plot_tree
from sklearn.decomposition import PCA
from sklearn.ensemble import IsolationForest

データの構造を確認してみましょう。

iris = load_iris(as_frame=True)
X,y = iris.data, iris.target
df = iris.frame

df.head()

アヤメのデータは4つの特徴量から構成されています。今回は可視化をしたいので、この4つの特徴量を簡単の為に2つに減らします。手法は単純に削る等いろいろありますが今回は主成分分析を用いて2つの特徴量に変換します。

pca = PCA(n_components=2)
x = df.iloc[:,0:4]
pca.fit(x)
pca.components_.T

X = pca.transform(x)
plt.scatter(x=X[:,0],y=X[:,1],c=iris.target)

主成分分析を用いて2つの特徴量に変換した後にプロットした図を表示してみましょう!

下のコードを実行してください。

 

アヤメデータがクラスごとにプロットされているのが分かりますね。そしてなんとなく特徴量の傾向でクラスの傾向も見て取れるとおもいます。しかし今回のIsolation Forestでは元々あるクラスの情報は利用しません。単純に特徴量から、異常か、否異常かの2つに分類します。

ここから、Isolation Forestを用いてこのデータの中で異常と判断されたものを可視化したいと思います。

Isolation Forsestはsklearnライブラリから簡単に使うことができます

from sklearn.ensemble import IsolationForest

model = IsolationForest(
                            n_estimators=100,                            
                            max_features=2,           
                            random_state=1
                        )
 
model.fit(X)

ここで主要なパラメータ設定としてn_estimatorsは作成する決定木の数を表します。またmax_features=2 に設定しているので、各決定木はランダムに選択された2つの特徴量を使用して構築されます。ここら辺の詳しいパラメータ設定はscikit learnの公式サイトを参照する事をオススメします。

df['anomaly_label'] = model.predict(X)
df['scores'] = model.decision_function(X)

anomaly_df = df[df.anomaly_label==-1]
anomaly_df

Isolation Forestのライブラリにおいてmodel.predictでは正常ラベルを1,異常ラベルを-1としています。

新たにanpmaly_label columnsを定義し、異常と判断されたデータポイントを見てみましょう。

下のコードを実行してください。

 

どうでしょうか?黒で表されているデータがIsolation Forestで異常と判断されたデータです。なんとなく直感でも、外れている値が確認できるかと思います。

やってみよう【応用編】

先ほどのアヤメのデータセットでは可視化をしてみて、Isolation Forestが異常データポイントを検知しているかを見てもらいました。でも、実際に正しく異常検知できてるのか、他の異常検知モデルよりも優れているのか等、精度を知りたいですよね。

しかし精度をみるにはそもそも正常か異常かの正解データを持ったデータセットじゃないと検証ができません。

というわけで今回は別のデータセットとして「credit_card_fraud_detection」を用いて、Isolation Forestを用いた異常分類の精度を簡単に見てみましょう。

このデータはクレジットカード取引における約30個ほどの特徴量から、取引が正常か異常かがまとめられたデータセットです。

比較モデルとしてLocal Outlier Factor(局所外れ値因子法)を利用します。こちらのアルゴリズムの内容については今回は取り扱わないので、もし興味があれば調べてみてください。

まずはデータの構成を見てみましょう。

 

V1 – V28という名前で28個の特徴量がありますね。どういう情報なのかが気になるところですが実はコレ、機密情報であり内容が公開されていません。Amountは取引金額、Timeは取引時間を表しています。

from sklearn.model_selection import train_test_split

normal = data[data.Class==0]
normal = normal.drop(['Class'],axis=1)

abnormal = data[data.Class==1]
abnormal = abnormal.drop(['Class'],axis=1)

normal_train,normal_test = train_test_split(normal,test_size=0.2,random_state=42)

Classが0に設定されているのが正常、1に設定されているのが異常です。この2つを訓練データとテストデータ用に分けます。

このデータをIsolation Forestで推論した予測と答えが一致しているかみてみましょう。

下のコードを実行してみてください。(実行の度に微妙にスコアが変わります)

 

正常値も異常値も非常に高い精度で分類されている事が分かると思います!

次は同様にLocal Outlier Factorでの正答率もみてみましょう(少し時間がかかるかもしれません)

 

どうでしょうか。正常値の分類はあまり差がありませんが、異常値の分類の精度がIsolation Forestの方が高い事が分かると思います。Isolation Forestは異常というレアケースに対して、正確に分類できていますね。

まとめ

今回はIsolation Forestについて解説しました。異常検知モデルや決定木は非常に有用なアプローチであるので、内容をきちんと理解してみてください。

\ シェア /

E資格スピードパッケージ2023#2修了者合格率100%達成

zero to one E資格 jdla

zero to oneの「E資格」向け認定プログラム

日本ディープラーニング協会の実施するE資格の受験ならzero to oneの「E資格」向け認定プログラム (税込165,000円) をおすすめします。当講座は、東京大学大学院工学系研究科の松尾豊教授と東北大学大学院情報科学研究科の岡谷貴之教授が監修する実践的なプログラムとなっています。
厚生労働省の教育訓練給付制度対象のE資格認定プログラムの中では最安値※となり、実質負担額49,500円~(支給割合70%の場合)で受講可能です。※2023年弊社調べ zero to one E資格 jdla

人工知能基礎講座を提供中

人工知能の第一人者である東京大学の松尾豊教授が監修した人工知能基礎講座を受講してみませんか? 人工知能の歴史から自然言語処理、機械学習、深層学習といった最先端のトピックやAIに関わる法律問題まで網羅しているので全てのビジネスパーソン・AIの初学者におすすめです。

サンプル動画

人工知能基礎講座はこちら↓ zero to one G検定 人工知能基礎 jdla

AI初学者・ビジネスパーソン向けのG検定対策講座

G検定受験前にトレーニングしたい方向けの問題集「G検定実践トレーニング」も提供中です。 zero to one E資格 jdla