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兆ドルの通貨市場に混乱をもたらしている

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

1 つの記事でポイント クラウドと自動車用 LiDAR の開発を理解しましょう。

01 車載レーザーレーダーのレーザー点群ポイントクラウド技術により、LIDAR イメージングは​​...

Objective-C でのソートアルゴリズムを学ぶ

データ構造とアルゴリズムを学習していたとき、ソートアルゴリズムをアニメーションで表現して、理解しやす...

末期の病気を患う58歳の女性が、メタバースで死に際の願いを叶えた。VRグランドキャニオンツアーだ。

慢性閉塞性肺疾患を患っている女性は長い間病気で寝たきりの状態です。しかし、彼女の最後の願いは、アメリ...

2021年4月のドローン業界の重要な動向の概要

2021年3月に入り、ドローン業界では新製品の登場、用途の深化、大きな出来事の連続など、発展は活気に...

人工知能時代に対応するための知識と技術の蓄積を向上させる

記者がインタビューした専門家によると、人工知能などの知能化技術の応用が加速するにつれ、雇用への構造的...

LeCunは再び自己回帰LLMを批判:2つの論文で証明されているように、GPT-4の推論能力は非常に限られている

「自己回帰型 LLM が人間レベルの AI に近い、あるいは人間レベルのパフォーマンスに達するにはス...

AI人材の確保をめぐる秘密の戦い:中国が勝利する可能性は?

[[251811]]画像ソース @Visual China人工知能の概念は、提唱されてから60年以...

...

監督が消えた! Midjourney+Miaoyaカメラ+Gen2の新ゲームプレイ:10元でMuskユニバースを作成し、ワンクリックでビデオを作成します

生成 AI の爆発的な増加により、無限の可能性がもたらされました。最近、国内ではミャオヤカメラがイン...

米上院司法委員会公聴会:AIは制御が難しく、悪意のある者が生物兵器の開発に利用する可能性がある

海外メディアTechCrunchによると、7月26日、米上院司法委員会は昨日、人工知能に関する公聴会...

4つの基本的なソートアルゴリズムのPHPコード実装

アルゴリズムはプログラムの核であり、アルゴリズムの品質がプログラムの品質を決定すると多くの人が言いま...

...

ヴィーナステックのヤン・ワンジア氏:人工知能を活用した産業用インターネットセキュリティの開発促進に関する提案

1. 問題と原因の分析インダストリアル インターネットは、新世代の情報通信技術と高度な製造技術の深い...