Pythonで完全な異常検出アルゴリズムをゼロから実装する

Pythonで完全な異常検出アルゴリズムをゼロから実装する

確率を用いた異常検出アルゴリズム

異常検出は、外れ値分析の統計タスクとして扱うことができます。 しかし、機械学習モデルを開発すれば、自動化が可能になり、通常通り多くの時間を節約できます。 異常検出には多くのユースケースがあります。 クレジットカード詐欺の検出、異常な機能に基づく故障した機械やハードウェア システムの検出、医療記録に基づく病気の検出などがその良い例です。 他にも多くのユースケースがあります。 そして、異常検出の使用は増加するばかりです。

この記事では、Python で異常検出アルゴリズムをゼロから開発するプロセスを説明します。

[[346860]]

公式と手順

これは、前に説明した他の機械学習アルゴリズムに比べてはるかに簡単です。 アルゴリズムは平均と分散を使用して各トレーニング データの確率を計算します。

トレーニング例の確率が高い場合、それは正常です。 トレーニング例の確率が低い場合、それは異常です。 トレーニング セットが異なれば、高確率と低確率の定義も異なります。 これをどのように決定するかについては後で説明します。

異常検出の仕組みを説明すると、非常に簡単です。

(1)次の式を用いて平均値を計算する。


ここで、m はデータセットの長さまたはトレーニング データの数であり、xi はトレーニング例です。 複数のトレーニング機能がある場合、ほとんどの場合、各機能の平均を計算する必要があります。

(2)次の式を用いて分散を計算する。


ここで、mu は前のステップから計算された平均値です。

(3)次に、この確率式を使用して各トレーニング例の確率を計算します。


この式のプラス記号に惑わされないでください。これは実際には対角線の形状の変化です。

後でアルゴリズムを実装すると、これがどのように見えるかがわかります。

(4)次に確率の閾値を見つける必要がある。 前に述べたように、トレーニング例の確率が低い場合、それは異常な例です。

低確率とはどの程度の確率でしょうか?

一般的な制限はありません。 トレーニング データセットの答えを見つける必要があります。

ステップ3で得られた出力から一連の確率値を取得します。それぞれの確率について、データが異常か正常かを示すラベルを見つけます。

次に、さまざまな確率の精度、再現率、および f1 スコアを計算します。

精度は次の式で計算できます。


リコール率は次の式で計算できます。


ここで、「真陽性」とは、アルゴリズムが例を異常として検出し、実際に異常であったケースの数を指します。

アルゴリズムが例を異常として検出したが、実際には異常ではない場合に、誤検知が発生します。

False Negative は、アルゴリズムによって検出された例が異常な例ではないが、実際には異常な例であることを意味します。

上記の式から、精度と再現率が高いほど、より多くの肯定的なエッジがあることを意味するため、常に良いことがわかります。 しかし同時に、式からわかるように、偽陽性と偽陰性も重要な役割を果たします。 そこにはバランスが必要です。 あなたが属する業界に応じて、どれを許容できるかを決める必要があります。

良いアプローチは平均を取ることです。 平均を求めるための独自の公式があります。 これはF1スコアです。 F1 スコアの計算式は次のとおりです。


ここで、P と R はそれぞれ精度と再現率です。

この式がなぜそれほどユニークなのかについては詳しく説明しません。 この記事は異常検出に関するものです。 精度、再現率、F1 スコアについて詳しく知りたい場合は、このトピックに関する詳細な記事をこちらでご覧ください。

精度、再現率、Fスコアの概念を完全に理解する

機械学習における偏ったデータセットの扱い方

f1 スコアに基づいて、しきい値確率を選択する必要があります。

1 は完全な f スコアであり、0 は最悪の確率スコアです。

異常検出アルゴリズム

2 つのトレーニング機能を備えた Andrew Ng の機械学習コースのデータセットを使用します。 このデータセットは学習に最適であるため、この記事の実際のデータセットは使用しませんでした。 機能は2つだけです。 現実世界のデータセットでは、特徴が 2 つだけである可能性は低いです。

ミッションを始めましょう!

まず、必要なパッケージをインポートします

  1. pandasをpdとしてインポートする
  2. numpyをnpとしてインポートする

データセットをインポートします。 これは Excel データセットです。 ここでは、トレーニング データとクロス検証データは別々のテーブルに保存されます。 それでは、トレーニング データを導入しましょう。

  1. df = pd .read_excel('ex8data1.xlsx', sheet_name = 'X' , header =なし)
  2. df.head()

列 0 と列 1 をプロットしてみましょう。

  1. plt.figure()
  2. plt.scatter(df[0], df[1])
  3. plt.show()

このグラフを見ると、どのデータが異常であるかがわかるかもしれません。

このデータセットにトレーニング例がいくつあるか確認します。

  1. m =長さ(自由度)

各特徴の平均を計算します。 ここでは、0 と 1 の 2 つの特徴のみがあります。

  1. s = np .sum(df,= 0 )
  2. mu = s /mmu

出力:

  1. 0 14.1122261 14.997711
  2. データ型: float64

分散は、上記の「式と手順」セクションで説明した式を使用して計算されます。

  1. vr = np .sum((df - mu)**2、= 0 )
  2. 分散= vr /m分散

出力:

  1. 0 1.8326311 1.709745
  2. データ型: float64

今度は斜めの形にします。 確率の公式に続く「公式と手順」のセクションで説明するように、合計の符号は実際には分散の対角線です。

  1. var_dia = np .diag(分散)
  2. var_dia

出力:

  1. 配列([[1.83263141, 0. ], [0. , 1.70974533]])

確率を計算します。

  1. k =長さ(μ)
  2. X =自由度- ミュー
  3. p = 1 /((2*np.pi)**(k/2)*(np.linalg.det(var_dia)**0.5))*np.exp(-0.5*np.sum([email protected](var_dia) * X、= 1 ))
  4. p

トレーニング部分は完了です。

次のステップは閾値確率を見つけることです。 確率が閾値確率より低い場合、サンプルデータは異常です。 しかし、私たちの特殊なケースではその閾値を見つける必要があります。

このステップでは、ラベルとともにクロス検証データを使用します。 このデータセットでは、クロス検証データとラベルが別のワークシートに含まれています。

あなたの場合、相互検証のために元のデータの一部のみを保持する必要があります。

次に、クロス検証データとラベルをインポートします。

  1. cvx = pd .read_excel('ex8data1.xlsx', sheet_name = 'Xval' , header =なし)
  2. cvx.head()

タグは次のとおりです:

  1. cvy = pd .read_excel('ex8data1.xlsx', sheet_name = 'y' , header =なし)
  2. cvy.head()

私は配列を扱うのが好きなので、「cvy」を NumPy 配列に変換しました。 DataFramesでも大丈夫です。

  1. y = np .array(cvy)

出力:

  1. #配列の一部
  2. 配列([[0], [0], [0], [0], [0], [0], [0], [0], [0],

ここで、y 値が 0 の場合はこれが正常な例であることを示し、y 値が 1 の場合はこれが異常な例であることを示します。

さて、しきい値をどのように選択するのでしょうか?

確率のリストからすべての確率を単にチェックしたいわけではありません。 それはおそらく不必要です。 もう一度オッズを確認してみましょう。

  1. p.describe()

出力:

  1. 3.070000e+02を数える
  2. 平均5.905331e-02
  3. 標準 2.324461e-02
  4. 最小 1.181209e-2325% 4.361075e-0250% 6.510144e-0275% 7.849532e-02
  5. 最大 8.986095e-02
  6. データ型: float64

画像からわかるように、外れ値のデータはあまりありません。 したがって、75% の値から始めれば、問題なく進むはずです。 しかし、念のため、平均値から始めます。

したがって、平均値から下限値までの確率の範囲をとります。 この範囲内の各確率の f1 スコアを確認します。

まず、真陽性、偽陽性、偽陰性を計算する関数を定義します。

  1. tpfpfn(ep)を定義します:
  2. tp、 fpfn = 0、0、0
  3. iが範囲(len(y))内にある場合:
  4. p[i] < = ep かつ y[i][0] == 1 の場合:
  5. tp += 1
  6. p[i] < = ep かつ y[i][0] == 0 の場合:
  7. 関数p += 1
  8. p[i] > ep かつ y[i][0] == 1 の場合:
  9. 関数n+=1
  10. tp、fp、fn を返す

平均確率以下の確率をリストします。

  1. eps = [i が i 内にある場合、i < = p.mean()]

リストの長さを確認してください。

  1. 長さ(eps)

出力:

  1. 133

先ほど説明した式に従って、f1 スコアを計算する関数を定義します。

  1. f1(ep)を定義します。
  2. tp、fp、 fn = tpfpfn (ep)
  3. prec = tp /(tp + fp)
  4. rec = tp /(tp + fn)
  5. f1 = 2 *prec*rec/(prec + rec)
  6. f1を返す

すべての機能が準備完了です!

ここで、すべての ε または先ほど選択した確率値の範囲の f1 スコアを計算します。

  1. f = []
  2. i が eps の場合:
  3. f.append(f1(i))

出力:

  1. , 0.14285714285714285, 0.14035087719298248, 0.1927710843373494, 0.1568627450980392, 0.208955223880597, 0.41379310344827586, 0.15517241379310345, 0.28571428571428575, 0.19444444444444445, 0.5217391304347826, 0.19718309859154928, 0.19753086419753085、0.29268292682926833、0.14545454545454545、

これは f スコア リストの一部です。 長さは133になります。

f スコアは通常 0 から 1 の間であり、1 が完全な f スコアです。 F1スコアが高いほど良いです。 したがって、計算した「f」スコアのリストから最高の f スコアを取得する必要があります。

ここで、「argmax」関数を使用して最大 f スコア値のインデックスを決定します。

  1. np.array(f).argmax()

出力:

  1. 131

このインデックスを使用して、しきい値確率を取得します。

  1. e = eps [131]
  2. e

出力:

  1. 6.107184445968581e-05

珍しい例を見つける

閾値確率があります。 そこからトレーニングデータのラベルを見つけることができます。

確率値が閾値以下の場合、データは異常であり、それ以外の場合は正常です。 正常データと異常データはそれぞれ 0 と 1 で表します。

  1. ラベル= []
  2. iが範囲(len(df))内にある場合:
  3. p[i] < = eの場合:
  4. ラベル.追加(1)
  5. それ以外:
  6. ラベル.追加(0)
  7.  
  8. ラベル

出力:

  1. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

これはタグ リストの一部です。

この計算されたラベルを上記のトレーニング データセットに追加します。

  1. df['ラベル'] = np.array(ラベル)
  2. df.head()

赤いラベルを 1、黒いラベルを 0 としてデータをプロットしました。 これがあらすじです。


それは意味がありますか?

本当ですか?赤字のデータは明らかに異常です。

結論は

異常検出アルゴリズムの開発プロセスを段階的に説明してみました。 ここでは手順を隠していません。 これが理解できることを願います。 読んだだけでは理解しにくい場合は、各コードをノートブックで自分で実行することをお勧めします。 こうすると非常に明確になります。

<<:  ローコード機械学習ツール

>>:  人工知能、自動化、新興技術のトレンドが4.6兆ドルの通貨市場に混乱をもたらしている

ブログ    
ブログ    
ブログ    

推薦する

...

GPUベースの人工知能と機械学習アプリケーション

[51CTO.com クイック翻訳]今日、グラフィックス プロセッシング ユニット (GPU) は、...

顔認識エンジンのトップ 5 (テキストにイースター エッグあり)

[51CTO.com クイック翻訳] ご存知のとおり、顔の特徴は指紋ほどユニークで永続的ではありま...

機械学習とAIが飲食業界に与える影響

[[354952]]一般的に、食品業界について考えるとき、私たちはおそらく顧客サービスや食品配達のギ...

...

新型コロナウイルス感染症の流行中に音声テクノロジーが再び注目を集めているのはなぜでしょうか?

新型コロナウイルスの世界的大流行により、各国で厳しいロックダウン措置が取られ、多くの人が外出を控えざ...

中国情報通信科学院の張琳琳氏:AIセキュリティの標準化は、今後も基本的かつ規範的、主導的な役割を果たし続けるべきである。

最近、「強力なイノベーション、新しいことに挑戦、未来の共有」をテーマにしたチャイナモバイルの第4回テ...

...

F5、AI時代のアプリケーションセキュリティの新たな革命をリード

サンノゼ — 2024年2月20日— F5(NASDAQ: FFIV)は先日、アプリケーションセキュ...

...

優秀なプログラマーが開発効率を上げるために知っておくべき32のアルゴリズム

検索アルゴリズム - 指定された開始点から指定された終了点までのパスを計算するグラフ検索アルゴリズム...

...

人工知能とビッグデータを開発する際に留意すべき12のこと

人工知能は近年の科学技術発展の重要な方向です。ビッグデータの時代において、データの収集、マイニング、...

レポート:AI脅威論は誇張されている:導入と保守のコストが高いため、影響はそれほど早く広範囲に及ぶことはない

MITコンピュータ科学・人工知能研究所(MIT CSAIL)は3月3日、現段階では人間はAIに仕事を...