Java用サポートベクターマシン?質問する

Java用サポートベクターマシン?質問する

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ライブラリはありますか?私が見つけたのはjlibsvmそしてsvmlearnしかし、前者は完全にベータ版の状態のようで、後者はバイナリ決定のみをサポートしているようです(私の古い線形二分法のように)。マハウトしかし、これは Hadoop の上に構築されており、独自の Hadoop クラスターをセットアップするための時間と精神力を正当化するほどのデータが揃っていないと思います。

ベストアンサー1

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

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

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

特徴を生成することが非常に重要な部分です。私はおそらく2つの特徴から始めるでしょう。生の値そして(かつて)差分値観測値 x_i と x_i-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、これは有望に思えます。

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

おすすめ記事