機能を抽出し、監視ツールからのアラートメールを適切なカテゴリに分類する方法


7

私の会社は多くのクライアントにマネージドサービスを提供しています。お客様は通常、次の監視ツールを使用してサーバー/ウェブアプリを監視します。

  1. OpsView
  2. ナギオス
  3. Pingdom
  4. カスタムシェルスクリプト

問題が見つかると、Opsチームにアラートメールが送信され、問題を修正するためのアクションが行われます。

何千ものサーバーを管理しているため、運用チームの受信トレイは常に電子メールアラートで溢れています。カスケード効果がある単一の問題でも、20〜30通の電子メールをトリガーできます。

今、私がやりたいのは、サーバーのIPアドレス、問題のタイプ、問題の重大度などのアラート電子メールから重要な機能を抽出し、電子メールを適切なカテゴリに分類できるシステムを実装することです。CPU-Load-Customer1-Server2, MySQL-Replication-Customer2-DBServer3その後、運用チームが問題をより迅速に修正できるように、各カテゴリに対して事前に定義された一連のデバッグ手順を用意します。また、機能エクストラクタは、問題の入力データをチームに提供します。

これまでのところ、教師付き学習手法、つまりラベル付きトレーニングデータ(クラスターデータ)でNaiveBayesClassifierをトレーニングし、新しい未確認のメールを適切なクラスター/カテゴリに分類できました。電子メールは特定のテンプレートに基づいているため、分類子の精度は非常に高くなります。ただし、カスタムスクリプトからアラートメールを受信することもあるので、テンプレートに従っていない可能性があります。そこで、教師あり学習ではなく、教師なし学習を試したいと思います。KMeansクラスタリング調べています。しかし、やはり問題は、事前にクラスターの数がわからないことです。では、この使用例に最適なアルゴリズムはどれですか?現在、分類にはPythonのTextBlobライブラリを使用しています。

また、アラートメールから機能を抽出するために、NLTK(http://www.nltk.org/book/ch07.html)ライブラリを調べています。試してみましたが、適切な英語のパラグラフ/テキストでうまく機能するようですが、アラートメールの場合は、多くの不要な機能が抽出されました。同じための既存のソリューションはすでにありますか?そうでない場合、同じものを実装するための最良の方法は何ですか?どのライブラリ、どのアルゴリズムですか?

PS:私はデータサイエンティストではありません。

メールの例:

PROBLEM: CRITICAL - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 -  CPU Load Avg     Service: CPU Load Avg  Host: Customer1_PROD_SLAVE_DB_01  Alias: Customer1_PROD_SLAVE_DB_01  Address: 10.10.0.100  Host Group Hierarchy: Opsview > Customer1  - BIG C > Customer1_PROD  State: CRITICAL  Date & Time: Sat Oct 4 07:02:06 UTC 2014    Additional Information:     CRITICAL - load average: 41.46, 40.69, 37.91
RECOVERY: OK - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 -  CPU Load Avg     Service: CPU Load Avg  Host: Customer1_PROD_SLAVE_DB_01  Alias: Customer1_PROD_SLAVE_DB_01  Address: 10.1.1.100  Host Group Hierarchy: Opsview > Customer1  - BIG C > Customer1_PROD  State: OK  Date & Time: Sat Oct 4 07:52:05 UTC 2014    Additional Information:     OK - load average: 0.36, 0.23, 4.83
PROBLEM: CRITICAL - Customer1_PROD - Customer1_PROD_SLAVE_DB_01 -  CPU Load Avg     Service: CPU Load Avg  Host: Customer1_PROD_SLAVE_DB_01  Alias: Customer1_PROD_SLAVE_DB_01  Address: 10.100.10.10  Host Group Hierarchy: Opsview > Customer1  - BIG C > Customer1_PROD  State: CRITICAL  Date & Time: Sat Oct 4 09:29:05 UTC 2014    Additional Information:     CRITICAL - load average: 29.59, 26.50, 18.49

分類子コード:(csvの形式-電子メール、<disk / cpu / memory / mysql>)

from textblob import TextBlob
from textblob.classifiers import NaiveBayesClassifier
import csv
train = []
with open('cpu.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)
// this can be done in a loop, but for the time being let it be
with open('memory.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)

with open('disk.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)

with open('mysql.txt', 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in reader:
        tup = unicode(row[0], "ISO-8859-1"), row[1]
        train.append(tup)

cl = NaiveBayesClassifier(train)
cl.classify(email)

特徴抽出コード: https : //gist.github.com/shlomibabluki/5539628

ここにさらに情報が必要な場合はお知らせください。

前もって感謝します。


まず、各メールをtf-idfベクトルscikit-learn.org/stable/modules/feature_extraction.htmlに変換します。Kの適切な数を見つけることは難しい問題です。これは、stackoverflow.com
questions / 1793532 /…

とてもいいユースケース。しかし、「特徴抽出」、「分類精度」、「教師あり学習」を混ぜていると思います。メールを簡単に解析できないということは、教師あり学習ができないという意味ではありません。それはすべて事前にクラスを知っており、列車のデータを分類することであり、両方ともあなたのケースで収集することができます。
Amir Ali Akbari 2015年

@SaurabhSaxena TF-IDFは、単一の新しいメールだけでなく、ドキュメントコーパス全体で実行する必要があるため、新しいアラートメールを受信したときにリアルタイムでTF-IDFを実行することは不可能です。リンクと情報をありがとう。
Kartikeya Sinha 2015

@AmirAliAkbariわかりません。私の使用例では、メールからの重要な情報の「機能抽出」、メールの「監視されたクラスタリング」によるメールのルーティング、および新しいメールの「分類」を正確に適切なクラスタに行う必要があります。アプリサーバーのCPU負荷アラートメールはMySQL DBサーバーのディスク容量アラートメールに分類されるため、ここでは精度が重要です。:)
Kartikeya Sinha 2015

回答:


3

同じことについて教師なし学習を試してみたい。KMeansクラスタリングを調べています。しかし、やはり問題は、事前にクラスターの数がわからないことです。では、この使用例に最適なアルゴリズムはどれですか?

クラスターの数が事前にわからない場合でも、ディリクレプロセスを使用して教師なし学習を行い、クラスター/グループに関連付けられたパラメーターをサンプリングし、それらのパラメーターに従ってトークンをクラスター化することができます。一般的な考え方は、ディリクレ分布を使用して各クラスターの単語の確率を生成することであり、ディリクレプロセスはこれらの確率を使用して、語彙の各単語にクラスターを割り当てます。電子メール間でクラスターを共有する場合は、階層型ディリクレプロセスを使用します。ここでは、これがどのように機能するかについての素晴らしいブログ投稿を見つけることができます。

クラスタリングに最も人気のあるライブラリはgensimですが、階層ディリクレプロセスの実装に関する警告に注意してください。

gensimは、[3]に基づく高速なオンライン実装を使用します。HDPモデルはgensimに新たに追加されたものであり、まだ学問の境界が粗い–注意して使用してください。

特徴の抽出については、質問では正確にどのような不要な特徴が得られているかはわかりませんが、その場合は、NLTKで処理する前または後にトークンをフィルター処理する必要があります。一般に、非常に特定のアプリケーションでは優れた結果を期待できません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.