すべてのデータ サイエンティストに必要な 3 つのシンプルな異常検出アルゴリズム

すべてのデータ サイエンティストに必要な 3 つのシンプルな異常検出アルゴリズム

外れ値検出の詳細と、Python で 3 つのシンプルで直感的かつ強力な外れ値検出アルゴリズムを実装する方法を学びます。

[[349935]]
> Flickr の Scott.T による写真

次のような状況に遭遇したことがあると思います。

  • モデルが期待どおりに動作していません。
  • いくつかの場所は他の場所とは非常に異なっているように見えることに気づかずにはいられません。

おめでとうございます。おそらくデータに外れ値があるはずです。

外れ値とは何ですか?


> 写真はStackExchangeで見つかります

統計学では、外れ値とは他の観測値と大きく異なるデータ ポイントのことです。 上の図から、ほとんどの点が線形超平面内またはその周囲にあるにもかかわらず、1 つの点が他の超散乱点と異なることがわかります。 これは外れ値です。

たとえば、次のリストを見てください。

  1. [1,35,20,32,40,46,45,4500]

ここで、1 と 4500 がデータセット内の外れ値であることが簡単にわかります。

データに外れ値があるのはなぜですか?

通常、例外は次のいずれかの状況で発生する可能性があります。

  • 測定誤差により偶発的に発生することもあります。
  • データが外れ値なしで 100% クリーンであることはめったにないため、外れ値がデータに表示される場合もあります。

外れ値はなぜ問題になるのでしょうか?

理由は次のとおりです。

線形モデル

あるデータがあり、線形回帰を使用してそのデータから住宅価格を予測したいとします。 考えられる仮説は次のとおりです。


> 出典: http> 写真提供: 著者:://arxiv.org/pdf/1811.06965.pdf

この場合、実際にはデータがあまりにも適合しすぎています (過剰適合)。 ただし、すべてのポイントがほぼ同じ範囲内にあることに注意してください。

それでは、外れ値を追加すると何が起こるか見てみましょう。


> 著者撮影

明らかに、仮定に変化が見られるため、外れ値がなければ推論はさらに悪くなるでしょう。 線形モデルには以下が含まれます。

  • パーセプトロン
  • 線形 + ロジスティック回帰
  • ニューラルネットワーク
  • ナレッジネットワーク

データ補間

よくある状況として、データが欠落しているというものがあります。これは、次の 2 つの方法のいずれかで対処できます。

  • 欠落している行のインスタンスを削除する
  • 統計的手法を用いてデータを推定する

2 番目のアプローチを選択した場合、外れ値によって統計手法の価値が大幅に変わる可能性があるため、疑わしい推論を導き出す可能性があります。 たとえば、外れ値のない架空のデータに戻ってみましょう。

  1. #データ 外れ値なし 
  2. np.array([35,20,32,40,46,45]).mean() = 36.333333333333336  
  3. #外れ値が2つあるデータ 
  4. np.array([1,35,20,32,40,46,45,4500]).mean() = 589.875

明らかにこの類推は極端ですが、考え方は同じです。 データ内の外れ値は、統計分析やモデリングにおいて深刻な問題を引き起こす可能性があるため、しばしば問題となります。 ただし、この記事では、それらを検出して対処するいくつかの方法について説明します。

ソリューション 1: DBSCAN


> 写真提供:Wikipedia

KMeans と同様に、ノイズを含むアプリケーションの密度ベースの空間クラスタリング (または、より簡単に DBSCAN) は、実際には教師なしクラスタリング アルゴリズムです。 ただし、その用途の 1 つは、データ内の外れ値を検出する機能でもあります。

DBSCAN は、KMeans やガウス混合ではできない、非線形に分離可能なクラスターを見つけることができるため人気があります。 クラスターが十分に密集していて、低密度領域によって分離されている場合にうまく機能します。

DBSCAN の仕組みの概要

このアルゴリズムは、クラスターを高密度の連続した領域として定義します。 アルゴリズムは非常にシンプルです:

  • 各インスタンスについて、そこから小さな距離 ε (ε) 内にあるインスタンスの数をカウントします。 この領域はインスタンスのεコミュニティと呼ばれます。
  • インスタンスの ε 近傍に min_samples を超えるインスタンスがある場合、そのインスタンスはコア インスタンスと見なされます。 これは、インスタンスが高密度領域(内部に多数のインスタンスが存在する領域)に配置されていることを意味します。
  • コアインスタンスのε近傍内のすべてのインスタンスは同じクラスターに割り当てられます。 これには他のコア インスタンスが含まれる場合があり、隣接するコア インスタンスの単一の長いシーケンスが単一のクラスターを形成します。
  • コアインスタンスではないインスタンス、またはコアインスタンスの ε 近傍にないインスタンスは外れ値です。

DBSCAN の活用

DBSCAN アルゴリズムは、Scikit-Learn の直感的な API のおかげで非常に簡単に使用できます。 アルゴリズムの動作例を見てみましょう。

  1. sklearn.clusterからDBSCANをインポートする 
  2. sklearn.datasetsからmake_moons をインポートします 
  3. X, y = make_moons(n_samples=1000, ノイズ=0.05)  
  4. dbscan = DBSCAN(eps=0.2、min_samples=5)  
  5. dbscan.fit(X)

ここでは、ε 近傍長が 0.05 の DBSCAN をインスタンス化し、インスタンスがコア インスタンスと見なされるために必要なサンプルの最小数を 5 に設定します。

覚えておいてください、これは教師なしアルゴリズムなので、ラベルは渡されません。 次のコマンドを使用して、ラベル、つまりアルゴリズムによって生成されたラベルを表示できます。

  1. dbscan.ラベル_  
  2. 出力: 配列([ 0, 2, -1, -1, 1, 0, 0, 0, ..., 3, 2, 3, 3, 4, 2, 6, 3])

いくつかのラベルの値が -1 になっていることに注意してください。これらは外れ値です。

DBSCAN には、predict メソッドはなく、fit_predict メソッドのみがあるため、新しいインスタンスをクラスタ化することはできません。 代わりに、トレーニングと予測に他の分類器を使用できます。 この例では、KNN を使用します。

  1. sklearn.neighborsからKNeighborsClassifier をインポートします 
  2. knn = K近隣分類子(n_近隣=50)  
  3. knn.fit(dbscan.components_、dbscan.labels_[dbscan.core_sample_indices_]) を実行します。  
  4. X_new = np.array([[-0.5, 0], [0, 0.5], [1, -0.1], [2, 1]])  
  5. knn.予測(X_new)  
  6. 出力: 配列([1, 0, 1, 0])

ここでは、コアサンプルとそれぞれの近傍に KNN 分類器を適合させます。

しかし、問題が発生しました。 当社が提供する KNN データには外れ値はありません。 これは、新しいインスタンスが実際には外れ値であっても、KNN に新しいインスタンスのクラスターを選択させる必要があるため、問題となります。

この問題に対処するために、KNN 分類器の kneighbors メソッドを使用します。このメソッドは、インスタンスのセットが与えられると、トレーニング セットの k 個の最近傍の距離とインデックスを返します。 次に、インスタンスを外れ値として分類する最大距離を設定できます。

  1. y_dist、y_pred_idx = knn.kneighbors(X_new、n_neighbors=1)  
  2. y_pred = dbscan.labels_[dbscan.core_sample_indices_][y_pred_idx]  
  3. y_pred[y_dist > 0.2] = -1y_pred.ravel()  
  4. 出力: 配列([-1, 0, 1, -1])

ここでは、異常検出のための DBSCAN について説明し、実装しました。 DBSCAN は、高速で、ハイパーパラメータが 2 つだけであり、外れ値に対して堅牢であるため優れています。

解決策 2: IsolationForest


> 著者撮影

IsolationForest は、高次元データセット内の外れ値を検出するのに特に役立つ、アンサンブル学習異常検出アルゴリズムです。 アルゴリズムは基本的に次のことを行います。

  • ランダム フォレストを作成し、そこでは決定木がランダムに成長します。各ノードで、特徴がランダムに選択され、ランダムなしきい値を選択してデータセットを 2 つに分割します。
  • すべてのインスタンスが最終的に互いに分離されるまで、データセットの削減が継続されます。
  • 異常は通常、他のインスタンスから遠く離れているため、平均すると (すべての決定木にわたって) 異常は通常のインスタンスよりも少ないステップで分離されます。

森林の活動

ここでも、Scikit-Learn の直感的な API の助けを借りて、IsolationForest クラスを簡単に実装できます。 アルゴリズムの動作例を見てみましょう。

  1. sklearn.ensembleからIsolationForest をインポートします 
  2. sklearn.metricsからmean_absolute_errorをインポートします 
  3. pandasをpdとしてインポートする

エラーを測定するために、mean_absolute_error もインポートします。 データについては、Jason Brownlee の GitHub から入手できるデータセットを使用します。

  1. url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'    
  2. df = pd.read_csv(url、ヘッダー=なし)  
  3. データ = df.values    
  4. #入力分割し  出力要素 
  5. X, y = データ[:, :-1], データ[:, -1]

分離フォレストをフィッティングする前に、データにバニラ線形回帰モデルをフィッティングして MAE を取得してみましょう。

  1. sklearn.linear_modelからLinearRegression をインポートします 
  2. lr = 線形回帰()  
  3. lr.fit(X,Y) は、  
  4. 平均絶対誤差(lr.predict(X),y)  
  5. アウト:3.2708628109003177

スコアは良くなりました。 それでは、Isolation Forest が外れ値を排除することでスコアを向上できるかどうかを見てみましょう。

まず、IsolationForest をインスタンス化します。

  1. iso = IsolationForest(汚染= 'auto' 、ランダム状態= 42)

おそらく、このアルゴリズムで最も重要なハイパーパラメータは、データセット内の外れ値を推定するために使用される汚染パラメータです。 これは0.0から0.5の間の値で、デフォルトでは0.1に設定されています。

ただし、本質的にはランダム化されたランダム フォレストであるため、ランダム フォレストのすべてのハイパーパラメータもアルゴリズムで使用できます。

次に、データをアルゴリズムに適合させます。

  1. y_pred = iso.fit_predict(X,y)  
  2. マスク = y_pred != -1

DBSCAN と同様に、予測値 = -1 も外れ値としてフィルター処理されていることに注意してください。

ここで、外れ値をフィルタリングしたデータを使用して、X と Y を再配布します。

  1. X,y = X[マスク,:],y[マスク]

それでは、線形回帰モデルをデータに当てはめて MAE を測定してみましょう。

  1. lr.fit(X,Y) は、  
  2. 平均絶対誤差(lr.predict(X),y)  
  3. アウト:2.643367450077622

すごいですね、大幅なコスト削減ですね。 これは明らかに隔離林の威力を示しています。

解決策 3: ボックスプロット + タッキー法

箱ひげ図は外れ値を識別する一般的な方法ですが、後者はおそらく外れ値を識別する最も過小評価されている方法だと思います。 しかし、「タッキー法」に入る前に、ボックスプロットについて説明しましょう。

ボックスプロット


> 写真提供:Wikipedia

箱ひげ図は基本的に、数値データを四分位数でグラフィカルに表示するもので、外れ値を視覚化する非常にシンプルかつ効果的な方法です。

上ヒゲと下ヒゲは分布の境界を示し、それより上または下の値は外れ値とみなされます。 上記のグラフでは、約 80 を超える値と約 62 を下回る値は外れ値と見なされます。

ボックスプロットの仕組み

基本的に、ボックス プロットはデータセットを 5 つの部分に分割することによって機能します。


> StackOverflowからの写真
  • 最小値: 外れ値を除いた分布内の最小のデータ ポイント。
  • 最大値: 外れ値を除いた分布内の最高データ ポイント。
  • 中央値 (Q2 / 50%): データ セットの中央値。
  • 第 1 四分位数 (Q1 / 25 パーセンタイル): データ セットの下半分の中央値です。
  • 第 3 四分位数 (Q3 / 75 パーセンタイル): データ セットの上位半分の中央値です。

四分位範囲 (IQR) は外れ値を定義するため重要です。 本質的には、次のようになります。

  • IQR = Q3 - Q1
  • Q3: 第3四分位
  • Q1: 第1四分位

ボックス プロットでは、測定された距離は 1.5 * IQR であり、データセットのより高い観測値が含まれます。 同様に、データセットの下位の観測ポイントで測定された距離は 1.5 * IQR です。 これらの距離外の値は外れ値となります。 具体的には:

  • 観測値が (Q1-1.5*IQR) を下回るか、ボックス プロットの下側のヒゲを下回る場合、外れ値と見なされます。
  • 同様に、観測値が (Q3 + 1.5 * IQR) またはボックス プロットのヒゲを超える場合も、外れ値と見なされます。


> 写真提供:Wikipedia

箱ひげ図の実際の動作

Python で Boxplot を使用して外れ値を検出する方法を見てみましょう。

  1. matplotlib.pyplot をpltとしてインポートします。  
  2. Seaborn をSNSとしてインポートする 
  3. numpyをnpとしてインポートする 
  4. X = np.array([45,56,78,34,1,2,67,68,87,203,-200,-150])  
  5. y = np.array([1,1,0,0,1,0,1,1,0,0,1,1])

データのボックスプロットを作成しましょう。

  1. sns.boxplot(X)  
  2. plt.show()


> 著者撮影

したがって、箱ひげ図に基づくと、データの中央値は 50 で、外れ値は 3 つあることがわかります。 以下の点をまず説明しましょう:

  1. X = X[(X < 150) & (X > -50)]  
  2. sns.boxplot(X)  
  3. plt.show()


> 著者撮影

ここでは基本的に、-50 未満および 150 を超えるすべてのポイントが除外されるようにしきい値を設定しました。 結果は均等に分配されます!

外れ値検出のためのTukey法

ホッケースティック法による外れ値検出は、実際にはボックス プロットに対する非視覚的なアプローチです。視覚化がないことを除けば、アプローチは同じです。

私がボックスプロットよりもこのアプローチを好む理由は、視覚化を見てしきい値をどの程度に設定すべきかを大まかに見積もっても、実際にはうまくいかないことがあるからです。

代わりに、外れ値として定義したインスタンスを実際に返すアルゴリズムを作成できます。

この実装のコードは次のとおりです。

  1. numpyをnpとしてインポートする 
  2. コレクションからカウンターをインポート 
  3. def detect_outliers(df, n, 特徴):  
  4. #外れ値インデックスを保存するリスト 
  5. 外れ値指数 = []  
  6. # 特徴(列)を反復処理する 
  7. 機能のcol場合:  
  8. # 第1四分位数(25%)を獲得 
  9. Q1 = np.パーセンタイル(df[col], 25)  
  10. # 第3四分位数(75%)を獲得 
  11. Q3 = np.パーセンタイル(df[col], 75)  
  12. # 四分位範囲 (IQR) を取得する 
  13. IQR = Q3 - Q1  
  14. # 外れ値ステップを定義する 
  15. 外れ値ステップ = 1.5 * IQR  
  16. #外れ値インデックスリストを決定する 
  17. outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step)].インデックス   
  18. # 外れ値インデックスを追加 カラム 外れ値インデックスリスト 
  19. 外れ値インデックスを拡張します(外れ値リスト列)  
  20. # 2つ以上の外れ値を含む観測値を選択する 
  21. 外れ値インデックス = カウンター(外れ値インデックス)  
  22. multiple_outliers = list(k for k, v in outlier_indices.items() if v > n)  
  23. 複数の外れ値を返す 
  24.  
  25. #特徴リストから外れ値を検出する 
  26. 機能のリスト = [ 'x1' , 'x2' ]  
  27. # パラメータデータセット、拒否する外れ値特徴リスト 
  28. 除外する外れ値 = 除外値の検出(データセット、2、特徴のリスト)

基本的に、このコードは次のことを行います。

  • 各機能について、次の情報を取得します。
  • 第1四分位
  • 第3四分位
  • 四分位数

2. 次に、ボックスプロットと同様に、外れ値ステップを1.5 * IQRとして定義します。

3. 次の方法で外れ値を検出します。

  • 観測点を確認する
  • 観測点がQ3 +外れ値ステップであるかどうかを確認する

4. 次に、選択した観測値にk個の外れ値があることを確認します(この場合、k = 2)

結論は

まとめると、外れ値検出アルゴリズムは多数ありますが、ここでは最も一般的な 3 つのアルゴリズム、DBSCAN、IsolationForest、Boxplots について説明しました。 以下のことをおすすめします:

  • これらの方法をタイタニック データセットで試してください。 外れ値を検出するのに最適なのはどれですか?
  • 他の異常検出方法を探して、最初の試みよりもパフォーマンスが良いか悪いかを確認します。

私はフォロワーの皆さんに心から感謝しており、これからも記事を書き続けて皆さんに考える材料を提供したいと考えています。 でも今は、さよならを言わなければなりません;}

<<:  MITチームがCOVID-19の早期警告に役立つ可能性のある咳分析AIを開発

>>:  脱ぐ!ドローンは1000億元の農薬市場の発展を加速させている

ブログ    
ブログ    
ブログ    

推薦する

GPTは「贅沢」すぎるが、代替案が多数用意されており、展開の問題を心配する必要はもうない

近年、生成的事前トレーニング済みモデル (GPT など) の台頭により、自然言語処理の分野に革命が起...

OpenAIの年間収益は13億ドルに達し、月間1億ドル以上となり、夏に比べて30%増加した。

10月13日、The Informationは現地時間12日、複数の関係者の話として、OpenAI...

...

人工知能がインダストリー4.0における製造業に革命をもたらす

人工知能 (AI) という用語は、流行語の地位を超え、業界全体にわたる技術革新の基礎となっています。...

AIによる顔の改造の一般的な手法の詳細な説明

最近また「AI変顔」が流行っていますね。 Leiphone.com(公式アカウント:Leiphone...

マスク氏と陳天橋氏の両者が期待している脳コンピューターインターフェースは、将来いつ実現するのだろうか?

[[415853]]失語症の人は再び話せるようになり、聴覚障害の人は再び聞こえるようになり、四肢麻...

Redditのランキングアルゴリズムの仕組み

これは、「Hacker News のランキング アルゴリズムの仕組み」に続く、ランキング アルゴリズ...

...

...

ロボット工学の分野にディープラーニングを取り入れる新たな試みはありますか?

ディープラーニングが人気を集めている今、誰もが自分の研究分野でそれを活用できないか考えています。その...

MIT テクノロジーレビュー: 6 つの質問が生成 AI の未来を決定する

「生成AIは2023年に世界を席巻します。その未来、そして私たちの未来は、私たちの次の一手によって決...

人工知能は都市をよりインテリジェントに発展させる力を与える

人工知能などのハイテク手段を基盤として構築された都市脳は、都市の経済発展のための「ブラックテクノロジ...

ロボットが高齢者介護のあらゆる問題を解決する

人口の高齢化は世界中の発展途上国や先進国が直面する深刻な問題となっている。 少数の人間が大多数の人間...

...

AIは脳スキャンだけであなたの政治的思想を予測できる

人工知能は、脳内の機能的接続のスキャンを分析するだけで、人の政治的イデオロギーを予測することができま...