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

ブログ    
ブログ    

推薦する

AIコピーライティングの11のメリット

この記事では、AI がコピーライターにもたらす 11 のメリットの一部と、次のプロジェクトで AI ...

...

McKinsey AI Notes: 19 の業界における 400 を超える人工知能の使用事例を解読すると、1 兆ドルの価値はどこにあるのか?

[[229251]]最近、マッキンゼーは、人工知能が分析技術の年間価値の40%を占め、毎年3.5兆...

人工知能を迷わせない

[[438551]]人工知能技術の急速な発展に伴い、世界各国は兵器や装備の研究開発にインテリジェント...

Alimama は曲率空間学習フレームワークと連合学習ソリューションをオープンソース化し、共通の進歩のために AI 技術を一般に公開します。

9月15日、Alimamaは、曲率空間学習フレームワークと連合学習ソリューションという2つのAI技...

7つのダイナミックなトレンドが将来のAIサービス市場を形作る

[Lieyun.com (WeChat ID: )] 9月14日レポート(小白訳)ソフトウェアは世界...

...

スマートカーのブラックテクノロジーとは何ですか?

AlphaGoとイ・セドルの人間対機械の戦い以来、人工知能はかつてないほどの注目を集め、大手企業が...

ビジネスインテリジェンスの歴史と発展についてお話ししましょう

1865 年に、リチャード・ミラー・デベンスは著書『A Complete Collection of...

リチウム電池の防爆結果がネイチャー誌の表紙に登場、UCLAの中国チームが制作

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

[ディープラーニングシリーズ] PaddlePaddle と Tensorflow を使用したクラシック CNN ネットワーク AlexNet の実装

先週、私たちは PaddlePaddle と Tensorflow を使用して画像分類を実装し、自分...

KMPアルゴリズムを最初から最後まで徹底的に理解できるように指導します

[[121931]]この記事の参考文献: Li Yunqing 他著「データ構造 (C 言語版)」、...

敏捷性の秘密: iPCA ネットワーク パケット保存アルゴリズム

次世代ネットワークにおける「見える化」への欲求ネットワークが複雑になるにつれて、ネットワーク管理に対...

現代のサイバーセキュリティに人工知能が必要な理由

ダイヤルアップ インターネットの時代よりずっと以前、ウイルスが感染したフロッピー ディスクを介して拡...