web-dev-qa-db-ja.com

Javaのサポートベクターマシン?

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

_<datetime> | <Java-method> | <seconds-to-execute>
_

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

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

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

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

Ithink多変量バージョンのlinear dichotomizersupport vectorと呼ばれるものですmachine(SVM) 。私が間違っている場合は、明確にしてください。質問のタイトルをより適切なものに変更します。 関係なく、私はこのアプリに次のことをさせる必要があります:

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

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

私の質問

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

前もって感謝します!

20
IAmYourFaja

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

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

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

フィーチャーの生成は重要な部分です。 生の値と(1回)観測値x_iとx_i-1の間の差分値の2つの機能からおそらく開始します。これらを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 [〜#〜] を発見しました。これは有望に見えます。

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

7
Jessica Mick

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

そのガイドは、サポートベクターマシン用の非常に成熟したライブラリであるlibsvmと同じ人からのものです( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ )。 Java( http://www.csie.ntu.edu.tw/~cjlin/libsvm/#Java )のバインディングがある

6
Pedrom

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

おそらく Apache Spark MLlib が役立つでしょう:

線形SVMは、大規模な分類タスクの標準的な方法です。これは、方程式(1)で前述した線形法であり、定式の損失関数はヒンジ損失によって与えられます。

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

デフォルトでは、線形SVMはL2正則化でトレーニングされます。代替のL1正則化もサポートしています。この場合、問題は線形プログラムになります。

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

1
Hendy Irawan