20

近づいてくるパフォーマンスの問題を検出するたびにアラートを送信する「スマートモニター」をJavaで作成したいと思います。私のJavaアプリは、構造化された形式でデータをログファイルに書き込んでいます。

<datetime> | <java-method> | <seconds-to-execute>

したがって、たとえば、Widget#doSomething(String)実行に812ミリ秒かかるメソッドがある場合、次のようにログに記録されます。

2013-03-24 11:39:21 | Widget#doSomething(String) | 812

パフォーマンスが低下し始めると(メジャーコレクション中、負荷のピーク時、またはシステムの速度が低下している場合など)、メソッドの実行タイミングが遅くなり始めます。そのため、右端の列に膨大な数が表示され始めます(1つのメソッドを実行するのに20〜40秒かかる場合があります)。

大学では、機械学習の演習のために、教授が線形二分法と呼んでいるものを書きました。これは、簡単なテストデータ(人の身長、体重、性別)を取得し、人を男性または女性に分類する方法を「学習」しました。身長体重。次に、すべてのトレーニングデータを取得したら、新しいデータをフィードして、性別をどれだけ正確に判断できるかを確認しました。

多変量バージョンの線形二分法は、サポートベクターマシン(SVM)と呼ばれるものだと思います。私が間違っている場合は、明確にしてください。質問のタイトルをより適切なものに変更します。とにかく、私はこのアプリが次のことをする必要があります:

  • 「テストモード」で実行し、メインのJavaアプリ(監視したいアプリ)から構造化ログファイルをフィードし、各ログエントリ(上記のように)を取得してテストデータに使用します
    • 入力/テストデータとして重要なのはjava-methodと列だけです。seconds-to-execute日時は気にしない
  • ログファイルから新しいログデータをアクティブに読み取る「モニターモード」で実行し、同様の「機械学習」手法を使用して、パフォーマンスの低下が迫っているかどうかを判断します

ここで重要な要素は列だけではないことに注意することがseconds-to-execute重要です。素晴らしいパフォーマンスの期間中の特定のメソッドの恐ろしいタイミングと、サーバーが死にかけているように見えたときの他のメソッドの本当に素晴らしいタイミングを見てきました。デイジーを押します。したがって、明らかに特定のメソッドは「重み付け」されており、他のメソッドよりもパフォーマンスにとって重要です。

私の質問

  • 「線形二分法」または「サポートベクターマシン」をグーグルで検索すると、非常に恐ろしい、非常に学術的な、超大脳のホワイトペーパーが見つかります。オプション; だから私は、このようなものへの素人の紹介、またはJavaでそのようなシステムを構築するための素晴らしいサイト/記事/チュートリアルがありますか?
  • 堅実で安定したオープンソースのJavaライブラリはありますか?私は見つけることしかできませんでしたがjlibsvmsvmlearn前者は純粋なベータ状態にあるように見え、後者はバイナリ決定のみをサポートしているようです(私の古い線形二分法のように)。Mahoutがあることは知っていますが、それはHadoopの上にあり、自分のHadoopクラスターをセットアップするための時間と精神的なエネルギーを保証するのに十分なデータがないと思います。

前もって感謝します!

4

4 に答える 4

7

あなたが説明する「スマートモニター」は、まさに時系列分類です。

多くの分類アルゴリズムがあります。それらはすべて基本的に行列を取ります。行は観測値であり、列は観測値を何らかの形で説明する「特徴」であり、長さの行のラベルベクトルは0または1のいずれかです。問題では、観測値は微小なサンプルである可能性があります。 、およびラベルベクトルは、パフォーマンスの問題が発生している期間では1と評価され、それ以外の場合は0と評価されます。

この定義には、各観測値が秒、分、時間などのように均等に定義されるように、データをリサンプリングする必要があります(必要に応じてモード/中央値/平均を使用)。

機能の生成は重要な部分です。私はおそらく、2つの特徴、生の値と、観測値x_iとx_i-1の間の(1回の)差分値から始めます。これらを2のラグで定義します。技術的には、この4つの機能を作成します。各機能は将来を見据えることはできません。各機能は、各観測に対して同じものを表す必要があります。

たとえば、長さ10の時系列について考えてみます。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

過去にラグ2間隔を使用して一連の特徴を生成する場合、時系列の最初の2つの要素はバーンインサンプルと見なされます。それらに関連付けられた観測値を使用してアルゴリズムをトレーニングすることはできません。

8行2列の生の値は次のようになります。

[[ 1.,  0.]
 [ 2.,  1.],
 [ 3.,  2.],
 [ 4.,  3.],
 [ 5.,  4.],
 [ 6.,  5.],
 [ 7.,  6.],
 [ 8.,  7.]]

差の

[[ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.]])

これらは列を積み重ねます。探索できる追加機能はたくさんあります。ローリング平均は私の次の選択になります。

将来さらに予測したい場合は、トレーニングデータがラベルベクトルからさらに遅れている必要があります。

パフォーマンスが十分でない場合は、より大きなウィンドウでローリング平均を選択して機能を追加するか、将来さらに追加してみてください。時系列アルゴリズムのパフォーマンスを改善するための巧妙なトリックは、前の時間間隔の予測値を含めることです。

分類器をデータの初期部分に適合させてから、データの後半部分でその精度を観察します。使用できる分類子のメトリックは多数あります。ハード1/0の代わりに確率を出力する分類器を使用することを選択した場合、オプションはさらに広がります。(分類子の使用法も同様です。)

適合率と再現率は、分類子の直感的なパフォーマンスメトリックです。

データの前半(前半)でトレーニングし、後半(後半)でテストします。

アルゴリズムに関する限り、ロジスティック回帰を調べます。パフォーマンスが十分でなく、特徴抽出オプションを使い果たした場合にのみ、他の場所を調べます。

マレットはこのタスクに適したライブラリのようです。ドキュメントのこのビットを参照してください。

私は最近、有望に見えるJSATを発見しました。

時系列分類には、観測値とラベルの連続的な性質を明示的に考慮した、より具体的なアプローチがあります。これは、時系列への分類の汎用的な適応です。

于 2013-03-25T23:33:05.770 に答える
6

サポートベクターマシンの使用に興味がある場合は、初心者向けのガイドがあり、役立つ場合があります(http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

That guide is from the same guys of libsvm which is a very mature library for support vector machines (http://www.csie.ntu.edu.tw/~cjlin/libsvm/) and they do have binding for Java (http://www.csie.ntu.edu.tw/~cjlin/libsvm/#java)

于 2013-03-26T13:11:02.327 に答える
3

Wekaは、Javaで人気のある機械学習/データマイニングパッケージです。この本http://guidetodatamining.com/は役に立つかもしれません。これは実際にはSVMに対応していませんが、確かに優れた分類アルゴリズムを備えており、まったく難解ではありません。

于 2013-03-26T07:47:02.173 に答える
1

Perhaps Apache Spark MLlib will help you:

The linear SVM is a standard method for large-scale classification tasks. It is a linear method as described above in equation (1), with the loss function in the formulation given by the hinge loss:

L(w;x,y):=max{0,1−ywTx}.

By default, linear SVMs are trained with an L2 regularization. We also support alternative L1 regularization. In this case, the problem becomes a linear program.

線形SVMアルゴリズムはSVMモデルを出力します。xで示される新しいデータポイントが与えられると、モデルはwTxの値に基づいて予測を行います。デフォルトでは、wTx≥0の場合、結果は正であり、それ以外の場合は負です。

于 2015-03-05T10:54:26.990 に答える