外れ値と異常検知の機械学習

外れ値と異常検知の機械学習

  • 人工知能(AI)
6分で読めます 更新日 Nov 21, 2019

ポイント: 外れ値検出は、詐欺検出や機器の故障分析などのアプリケーションにとって重要です。このガイドでは、データ分布と異常スコアを分析することによって外れ値を特定するscikit-learnのアイソレーションフォレスト法について説明しています。

  • 外れ値検出技術にはzスコアとアイソレーションフォレストが含まれます。
  • アイソレーションフォレストは、ランダムなデータ分割を通じて外れ値を特定する決定木を使用します。

この記事では、外れ値検出の方法を説明します。外れ値検出は、クレジットカードの詐欺、サイバーセキュリティ、システム内の故障した機器を検出するなど、さまざまなシナリオで重要です。

アプローチ

外れ値検出の最も簡単なアプローチは、正規分布を仮定し、いくつかの標準偏差でしきい値を設定することです。それをzスコアと呼びます。

この例では、異なるアプローチであるアイソレーションフォレストを使用します。これは、ランダムに値を選択し、ランダムに選択された範囲内で各データポイントを分割し、次に値を減少する範囲で再度ランダムに選択する決定木の一種です。最後に、そのツリー内の最短パスにあるものを外れ値としてフラグ付けします。これは計算によって異常スコアをフラグ付けします。

以下のサンプルでは、scikit-learnの機械学習フレームワーク内でアイソレーションフォレストを使用して異常検知を行う方法を示すためにサンプルデータをモックします。

コードの説明

この例のコードはこちらです。

まず、平均4、標準偏差1の標準正規分布から100サンプルを引き出して、100x2の行列を作成します:

    train = rng.normal(4,1,(100,2))

次に、そのモデルをトレーニングします:

    from sklearn.ensemble import IsolationForest

clf = IsolationForest(behaviour='new', max_samples=100,
                      random_state=rng, contamination='auto')

clf.fit(train)

次に、別のサンプルを作成します。

    typical =  rng.normal(4,1,(100,2))

印刷すると、値は2から6の範囲にあることがわかります。したがって、値8と1の外れ値を作成します:

    outliers = np.array([
                     [8,6],
                     [1,4]
])

ここに完全なコードがあります:

    import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

rng = np.random.RandomState(20)

train = rng.normal(4,1,(100,2))

 
typical =  rng.normal(4,1,(100,2))
 
outliers = np.array([
                     [8,6],
                     [1,4]
])
                       
 
clf = IsolationForest(behaviour='new', max_samples=100,
                      random_state=rng, contamination='auto')

clf.fit(train)

pred_train = clf.predict(train)
pred_test = clf.predict(typical)
pred_outliers = clf.predict(outliers)

データのサンプルは、1以上6未満の範囲ですので、アルゴリズムが外れ値としてフラグを立てるべき1以上と6未満のデータをモックします。

    typical

array([[2.49602218, 5.31396783],
       [3.96987389, 4.63501308],
       [4.50243523, 5.16196591],
       [3.69425171, 5.71228277],
       [5.169437  , 3.72418513],
       [1.48821929, 3.58272819],
       [4.54157245, 3.8548927 ],

その後、3つの予測を実行し、それらをプロットし、各行列の2番目の列[:1]をx列、1番目の列をy軸[:0]にプロットして、ペアを視覚化する簡単な方法を示します。正規分布から引き出されているため、中心に集まります。

    pred_train = clf.predict(train)
pred_test = clf.predict(typical)
pred_outliers = clf.predict(outliers)
    fig, axis = plt.subplots(2)

axis[0].scatter(train[:,1], train[:,0] )

axis[1].scatter(typical[:,1], typical[:,0]  , c='g'  )
axis[1].scatter(outliers[:,1], outliers[:,0] , c='r'  )

[8,6]と[1,4]の点は外れ値であり、赤でプロットされているため、簡単に確認できます。

これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも示すものではありません。

人工知能(AI)の関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。