「異常検知への推測を排除する:ヒストグラムが閾値を設定します」
「美容とファッションに関する専門家が解説する:ヒストグラムを使用して異常検知の推測を排除する方法」
Pythonコードを使ってクイックダイブ
異常検知の領域では、データの広大な景観で隠された異常を見つけることは、隠された宝物を探すことと同様のものです。しかし、最先端の異常検知アルゴリズムやテクニックを駆使しても、重要な決断をしなければなりません。何を異常として扱い、何を正常とみなすか、その線引きはどこにするのかということです。
異常検知のプロセスでは、異常検知閾値の選択が鍵となります。これによって、異常としてフラグが立てられるものと正常範囲に留まるものが決まります。適切なバランスを見つけることは、不正取引の発見から装置の故障の特定など、貴重な洞察を開示するためのカギとなります。
しかし、冒険にはいくつかの課題があります。適切な閾値の選択は、データの深い理解、分析の具体的な目的、そして直感が必要です。この決定は、異常検知の完全な可能性を解放するか、誤報の海に飲み込まれるかの違いとなり得ます。
何が普通なのか?この質問は異常検知閾値の設定の中心にあり、異常検知システムの成否を左右する重要な部分です。
- 「トランスフォーマーの再定義:シンプルなフィードフォワードニューラルネットワークが効率的なシーケンス・トゥ・シーケンスのタスクにおいて注意機構を模倣する方法」
- 「LQ-LoRAに会ってください:効率的な言語モデルの微調整のための低ランク量子化行列分解を可能にするLoRAの派生版」
- Amazon Personalize Next Best Actionを使用して、ユーザーにアクションを推奨することでブランドの忠誠心を構築します
このブログでは、適切な閾値を選ぶより簡単な方法を探ります。ヒストグラムのスコアの分布を使用する方法を紹介します。これにより、教師なしの異常検知の正確性が向上します。
ヒストグラムカット閾値検出(HCTT)
通常、異常検知システムを設定する際には、データポイントを異常とみなすためにスコア0または1を与える必要があります。しかし、分からない場合はどうでしょうか。
複雑なモデル構築の部分は今回は省略し、共通の課題に焦点を当ててみましょう。多くのブログは、データ中に何個の異常値が存在するかすでにわかっていることを前提としています。しかし、もし分からない場合はどうでしょうか。
そのような場合に役立つのが、教師ありおよび半教師ありの異常検知方法です。これらはセーフティネットのようなものですが、注意が必要です。データは時間とともに変わる可能性があるため、システムを監視し、状況が変わった際に閾値を調整する必要があります。これは多くのブログで見落とされる重要なステップですが、実世界の応用では欠かせません。
異常検知に適切な閾値を選ぶプロセスを簡素化しましょう。複雑さを解説し、データの変化に適応する方法をご紹介します。パーフェクトな閾値を見つけることは、迷路を抜けるようなものであり、私がガイドします。
この方法はシンプルです。対応するデータにモデルを調整すると、常に異常スコアを決定できるようになります。ガウス分布の場合は確率の対数、K-Meansの場合は重心までの距離などが使用されます。しかし、ここでポイントです。全体のグループに基づいてその値が意味を成すかどうかを判断するスコアがあり、それに取り組むことが必要です。そのためには、分布プロットを100のビンに分ける必要があります。このヒストグラムはデータの累積変化ごとに1%の変化を反映することが期待されるため、対応する閾値を選択するための参考となります。
ヒストグラムを分析して、どのような方向性を把握できますか?ヒストグラムの分布に基づいて、どのような閾値を提案できますか?スコアのビンの明確な切り離しが見られるときに閾値を決定することができますが、課題はこれをアルゴリズム関数に統合することです。観察的な洞察に基づいて決定できる主要なパラメータまたは2つのオプションパラメータを定義する必要があります。選ばれたパラメータは直感的に設定される場合に、変化に対して頑健であることが望ましいです。これらは、パーセンテージの差異とデータの累積分布(オプション)といったものです。
パーセンテージ差カット:これは、ヒストグラムの各ビンの累積比率間の差です。アルゴリズムの使用によって順序が異なることに注意してください。たとえば、ガウシアンミックスチャーを考慮し、対数確率を使用する場合、ビンカットは右から左に実行する必要があります。一方、K平均法を使用して重心までの距離を測定する場合は、ビンは左から右に処理する必要があります。左は負の値、右は正の値と見なされます。3〜6%の設定で頑健な結果が得られることがあります。これは、新しいデータを追加しても以前の累積分布に大きな変化がないポイントであり、カットを行うことができます。このポイント以降にマップされたデータは、大多数に対応していません。
データの累積分布(オプション):このパラメータは主に直感的なアラームの選択に基づいています。これは、アルゴリズムが検出可能な外れ値の割合の上限として設定できます。たとえば、データの20%を超える外れ値としてフラグ付けしたくない場合、これは安全なダブルチェックとして機能します。
ご覧のように、このアルゴリズムは直感的で理解しやすいものです。私は他のモデルを使用しても転送可能な検出方法を見つけることができなかったため、この手法を共有することにしました。他の人も自分の目的に役立つと思います。
試してみて、どれだけうまく機能するか確認しましょう!
アクション!
例1:ガウシアンミックスチャー
まず、ガウシアンミックスモデルで作業を開始しましょう。 PyODライブラリを使用して異常な観測値を作成します。最初に、外れ値の割合が15%であるデータを生成します。これは、提案されたアルゴリズムを使用して検出する割合です。
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom pyod.utils.data import generate_datafrom sklearn.mixture import GaussianMixturecontamination = 0.15 # 外れ値の割合n_train = 1000 # トレーニングポイントの数n_test = 100 # テストポイントの数n_features = 6 # 特徴量の数X_train, X_test, y_train, y_test = generate_data( n_train=n_train, n_test=n_test, n_features= n_features, contamination=contamination, random_state=123)X_train_pd = pd.DataFrame(X_train)X_train_pd.head()
データから、異常値(y=1)とそれ以外(y=0)を既に知っています。これを使って動作するかテストします。まず、Gaussian Mixtureをモデルに調整します
df_model = X_train_pdgm = GaussianMixture(n_components = 1, covariance_type = 'full', random_state=0)gm.fit(df_model)df_model['log'] = gm.score_samples(df_model)
次に、各値のログ確率を確認するためにヒストグラムをプロットします。
-5の値で明確なシフトが観察されるため、-5より左側は外れ値である可能性があると推測できます。さて、カットアルゴリズムを実行しましょう。パーセンテージ差カットを0.005に、データの累積分布を80%に設定します。
perc_dif = 0.0005cum_perc = 0.8df_histogram_change = df_model['log'].value_counts(bins=100).sort_index(ascending=False)df_histogram_change = pd.DataFrame(df_histogram_change)df_histogram_change['cumsum'] = df_histogram_change['log'].cumsum()df_histogram_change['index'] = range(len(df_histogram_change))df_histogram_change['cumsum_diff'] = df_histogram_change['cumsum'].pct_change()df_histogram_change['interval'] = df_histogram_change.indexdf_histogram_change['cum_pct'] = df_histogram_change['cumsum']/sum(df_histogram_change['log'])df_histogram_changefilter_df = df_histogram_change[(df_histogram_change['cumsum_diff']<perc_dif) & (df_histogram_change['cum_pct']>cum_perc)]index = filter_df.iloc[0]['index']tresh = df_histogram_change.index[index].leftdf_model = df_model.copy()df_model['outlier'] = np.where(df_model ['log']<tresh,1,0)
私たちが興味を持つ変数を含む対応するヒストグラムデータフレーム
「cumsum」はヒストグラムプロット上で右から左に向かって累積和を表しています。「cumsum_diff」はビンとの差を示し、「cum_pct」は全値に対する値の割合を表しています。
さて、この方法で決定したしきい値が0.15(15%)であると判断することができます
df_cases = df_model['outlier'].value_counts()df_cases[1]/sum(df_cases)#0.15
推定値と実際の値の差が0であることがわかります
例2: 時系列データのK-means
関連するブログで概説された方法論に基づいて、時系列データ異常の分析にK-meansを利用するアプローチを洗練させましょう。しかし、しきい値の選択に改善の余地があることが明らかになります。
from sklearn.cluster import KMeansfrom numpy import sqrt, random, array, argsortfrom sklearn.preprocessing import scaleimport matplotlib.pyplot as plt
対応するデータを生成しましょう
random.seed(123)def makeData(N): x = [] for i in range(N): a = i/1000 + random.uniform(-3, 2) r = random.uniform(-5, 10) if(r >= 9.9): r = r + 10 elif(r<(-4.8)): r = r +(- 10) x.append([a + r]) return array(x)x = makeData(500)
プロットしましょう
x_ax = range(500)plt.title("Time Series")plt.xlabel('Time')plt.ylabel('Value')plt.plot(x_ax, x)plt.show()
K-meansモデルを適用し、データセットをこの方法でスケーリングしましょう
x = scale(x)kmeans = KMeans(n_clusters = 1).fit(x)center = kmeans.cluster_centers_distance = sqrt((x - center)**2)df = pd.DataFrame(x)df['distance'] = distance
スコアの対応するヒストグラムをプロットします
import seaborn as snsplt.figure( figsize=(10, 6), # ここで図のサイズを設定 dpi=100, # ここでdpi(または解像度)を設定)sns.histplot(data=df, x="distance", bins=100)# サブタイトルを設定plt.title( "Histogram of Log", # サブタイトルのテキスト fontsize=14, # フォントサイズを設定)
この方法は、スコアの大きさが中心からの距離に対応しているため、左から右へと操作するように設計されている点を重要視する必要があります。この基本的な側面を理解することは、この方法を適用するためには重要です。
df_histogram_change = df['distance'].value_counts(bins=100).sort_index(ascending=True)df_histogram_change = pd.DataFrame(df_histogram_change)df_histogram_change['cumsum'] = df_histogram_change['distance'].cumsum()df_histogram_change['index'] = range(len(df_histogram_change))df_histogram_change['cumsum_diff'] = df_histogram_change['cumsum'].pct_change()df_histogram_change['interval'] = df_histogram_change.indexdf_histogram_change['cum_pct'] = df_histogram_change['cumsum']/sum(df_histogram_change['distance'])df_histogram_changefilter_df = df_histogram_change[(df_histogram_change['cumsum_diff']<0.0005) & (df_histogram_change['cum_pct']>0.8)]index = filter_df.iloc[0]['index']tresh = df_histogram_change.index[index].leftdf = df.copy()df['outlier'] = np.where(df['distance']>tresh,1,0)#tresh 1.99
しきい値は1.99であり、これ以降のすべてがアウトライアとみなされます。
indexes = df[df['outlier']==1].indexvalues = df.loc[indexes,0]
さあ、アウトライアをプロットしてみましょう!魔法のように機能します。
通常のデータと異常なデータを区別することが重要な異常検知のダイナミックな領域で、異常検知しきい値の設定プロセスが中心に立ちます。本ブログでは、この意思決定の複雑さに深く踏み込んで、詐欺トランザクションの検出から機器の故障の特定まで、貴重な洞察を解き放つための鍵となる役割を強調しています。
正しいしきい値を選択することに inherent な課題を認識しつつ、本ブログはゲームチェンジングな解決策として、ヒストグラムカット検出(HCT)メソッドを紹介します。HCTは、ヒストグラム内のスコアの分布を利用することにより、教師なしの異常検知によりアクセス可能で正確なアプローチを提供し、しきい値の設定プロセスを簡略化します。
この方法は、ガウシアンミクスチャーモデルやK-Meansモデルのような例を通じて説明され、分布プロットを100個のビンに分割し、蓄積データの変化率1%に対応する各ビンを反映させます。この細かい分析により、スコアのビンの明確な切断に基づいてしきい値を直感的に選択することが可能です。
本ブログでは、パーセンテージの差異やデータの累積分布といった重要なパラメータが紹介され、アルゴリズムの適応性と変化に対する堅牢性が向上します。これらのパラメータは、しきい値の決定に直感的なレイヤーを追加し、アルゴリズムが時間とともに効果的であることを保証します。
実際の応用では、ブログではこの方法のシンプルさと効果を示し、読者に特定の異常検知シナリオでのパフォーマンスをテストするよう奨励しています。示された例は、この方法がさまざまなモデルに適用可能であり、広範囲に使用できる潜在能力を示しています。
結論として、ヒストグラムカット検出メソッドは、異常検知しきい値の設定に対して直感的で移植可能なアプローチを提供します。本ブログは、この方法をフィールド内の他の方々の利益を促進する目的で共有し、独自の異常検知の取り組みでこの方法を探索し実装する読者を奨励しています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「Amazon Personalizeと創造的AIを活用して、ハイパーカスタマイズされたお客様体験を実現しましょう」
- Amazon Transcribeは、100以上の言語に対応する新しいスピーチ基礎モデル搭載のASRシステムを発表しました
- 医療画像AIがより簡単になりました:NVIDIAがMONAIをホステッドクラウドサービスとして提供
- 効果的にLLMをトレーニングする方法:小規模な導入のためのベストプラクティス
- 「PhysGaussian(フィジカルガウシアン)に会いましょう:物理的に根拠のあるニュートン力学を3Dガウス関数に組み込むことで高品質な新世代モーションシンセシスを生み出す人工知能技術」
- 「インフレクションは、世界で最高のAIモデルであり、そのクラスのコンピューティングでは世界で2番目に能力のあるLLMです」
- 「ゲームの名門生(SoG)と呼ばれる、新しいAIシステムをチェックしてみてくださいこのシステムは、様々なゲームで人間に勝つことができ、さらに新しいゲームのプレイ方法を学んでいく能力を持っています」