Support vectoriel pour Java?
je voudrais écrire une "smart monitor" en Java qui envoie une alerte chaque fois qu'il détecte problèmes de performance venant en sens inverse. Mon application Java est l'écriture de données dans un format structuré dans un fichier journal:
<datetime> | <java-method> | <seconds-to-execute>
Si, par exemple, si j'avais un Widget#doSomething(String)
méthode qui a pris 812ms à exécuter, il serait consigné sous la forme:
2013-03-24 11:39:21 | Widget#doSomething(String) | 812
au fur et à mesure que les performances commencent à se dégrader (comme lors d'une collecte majeure, lors de pics de charge, ou si le système est juste en train de ralentir à la rampe).), les temps d'exécution de la méthode commencent à ralentir; ainsi la colonne de droite commence à voir des nombres énormes (environ 20 - 40 secondes pour exécuter une seule méthode).
à l'université-pour un exercice d'apprentissage de la machine - j'ai écrit ce que mon professeur a appelé un dichotomiseur linéaire qui ont pris des données d'essai simples (la taille, le poids et le sexe d'une personne) et "appris" comment Catégoriser une personne comme mâle ou femelle en fonction de leur taille/poids. Puis, une fois qu'il a eu toutes ses données de formation, nous avons nourri il s'agit de nouvelles données permettant de déterminer avec quelle précision le sexe peut être déterminé.
I penser la version multivariée d'un dichotomiseur linéaire est quelque chose qui s'appelle un machine à vecteurs de support (SVM). Si je me trompe, veuillez clarifier et je changerai le titre de ma question en quelque chose de plus approprié. peu importe, j'ai besoin de cette application pour faire les choses suivantes:
- exécuter en" mode test " où I alimentez le fichier journal structuré de mon application Java principale (celle que je souhaite surveiller) et il prend chaque entrée de journal (comme indiqué ci-dessus) et l'utilise pour données de test
java-method
etseconds-to-execute
les colonnes sont importantes comme entrées / données de test; je ne me soucie pas du datetime
- exécutez en "mode monitor" où il lit activement les nouvelles données de journal du fichier journal, et en utilisant des techniques similaires "d'apprentissage machine" pour déterminer si une performance la dégradation est imminente
il est important de noter que le seconds-to-execute
la colonne n'est pas le seul facteur important ici, car j'ai vu des temps horribles pour certaines méthodes pendant les périodes de performance impressionnante, et vraiment de grands temps pour d'autres méthodes à des moments où le serveur semblait sur le point de mourir et de pousser des marguerites. Alors, évidemment certains les méthodes sont "pondérées"/plus importantes pour la performance que les autres.
mon question
- Googler "linéaire dichotomizer" ou "support vector machines" se présente certains vraiment effrayant, très académique, ultra-blanche cérébrale des papiers que je n'ai pas l'énergie mentale (ni le temps) de consommer, sauf si elles sont vraiment mes seules options; je demande donc est-il des laïques introduction à ce genre de choses, ou un grand site/article/tutoriel pour construire un tel système en Java?
- Existe-t-il des bibliothèques Java open source stables? Je n'a pu trouver
jlibsvm
etsvmlearn
mais le premier semble être dans un État beta pur et le second semble ne supporter que des décisions binaires (comme mon vieux dichotomiseur linéaire). Je sais qu'il y a Mahout mais c'est au-dessus de Hadoop, et je ne pense pas avoir assez de données pour justifier le temps et l'énergie mentale pour mettre en place mon propre cluster Hadoop.
Merci d'avance!
4 réponses
un "Smart monitor" que vous décrivez est exactement une classification temporelle.
Il existe de nombreux algorithmes de classification. Ils prennent tous essentiellement une matrice, où les lignes sont des observations et les colonnes sont des "traits" qui décrivent d'une manière ou d'une autre l'observation, et un vecteur d'étiquette des lignes de longueur qui est évalué soit 0 ou 1. Dans votre problème, une observation peut être un échantillon de minute, et votre vecteur d'étiquette sera évalué 1 pour les périodes qui connaissent des problèmes de performance et 0 autrement.
implicite dans cette définition est la nécessité de rééchantillonner vos données(en utilisant le mode/médiane/moyenne si nécessaire) de sorte que chaque observation est définie uniformément, comme secondes ou minutes ou heures.
la génération de fonctionnalités est la partie cruciale. Je commencerais probablement avec 2 traits, le valeurs brutes et l' (une fois) différenciées valeurs entre l'observation x_i et x_i-1. Nous définirons ceci pour un décalage de 2. Techniquement faire de ce 4 caractéristique. Chaque caractéristique ne peut pas regarder dans l'avenir. Chaque fonction doit représenter la même chose pour chaque observation.
par exemple, considérons la série temporelle de la longueur 10:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
si nous voulons produire un ensemble de caractéristiques en utilisant le décalage de deux intervalles dans le passé, alors les deux premiers éléments de la série temporelle sont considérés comme un échantillon brûlé. Nous ne pouvons pas utiliser les observations sont associés pour former algorithme.
valeurs brutes, de 8 lignes 2 colonnes seraient
[[ 1., 0.]
[ 2., 1.],
[ 3., 2.],
[ 4., 3.],
[ 5., 4.],
[ 6., 5.],
[ 7., 6.],
[ 8., 7.]]
différenciées valeurs
[[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])
Ces colonnes empilées. Il y a de nombreuses fonctionnalités supplémentaires que vous pouvez explorer. moyenne mobile serait mon prochain choix.
si vous voulez prédire plus loin dans l'avenir, alors vos données de formation devraient être plus loin de votre vecteur d'étiquette.
si la performance n'est pas satisfaisante alors essayez d'ajouter plus de fonctionnalités en choisissant un roulement moyen sur une plus grande fenêtre, ou plus loin dans le futur. Une astuce pour améliorer la performance des algorithmes de séries chronologiques est d'inclure la valeur de la prédiction pour l'intervalle de temps précédent.
Ajustez votre Classificateur sur une partie antérieure des données, puis observez leur précision sur une partie ultérieure des données. Il existe de nombreux paramètres pour les classificateurs que vous pouvez utiliser. Si vous choisissez d'utiliser un classificateur qui produit des probabilités au lieu de hard 1/0, alors vos options s'élargissent même. (Tout comme les utilisations de votre Classificateur.)
précision et rappel sont des mesures intuitives du rendement des classificateurs.
entraînez-vous sur la première moitié (au début) de vos données et testez sur la seconde moitié (plus tard).
en ce qui concerne les algorithmes, je me pencherais sur la régression logistique. Je ne chercherais ailleurs que si la performance n'est pas satisfaisante et que vous avez épuisé les options d'extraction.
Maillet semble être une bonne bibliothèque de la tâche. voir ce passage des docs.
j'ai récemment découvert JSAT, ce qui semble prometteur.
il existe des méthodes plus spécifiques de classification des séries chronologiques qui tiennent explicitement compte de la nature séquentielle des observations et des étiquettes. Il s'agit d'une adaptation générale de la classification aux séries chronologiques.
si vous êtes intéressé à utiliser des machines vectorielles de soutien, il y a un guide qui est très orienté pour les débutants et vous pourriez trouver utile (http://www.csie.ntu.edu.tw / ~ cjlin / papers / guide / guide.pdf)
ce guide vient des mêmes gars de libsvm qui est une bibliothèque très mature pour les machines vectorielles de support (http://www.csie.ntu.edu.tw / ~cjlin/libsvm/) et ils ont une liaison pour Java (http://www.csie.ntu.edu.tw / ~ cjlin/libsvm / # java)
Weka est un progiciel populaire d'apprentissage et d'exploration de données en Java. Ce livre http://guidetodatamining.com/ pourrait être utile. Il ne traite pas vraiment des SVM, mais il a certainement de bons algorithmes de classification, et il n'est certainement pas du tout ésotérique.
peut-être Apache Spark MLlib va vous aider:
la méthode linéaire SVM est une méthode standard pour la classification à grande échelle tâche. Il s'agit d'une méthode linéaire telle que décrite ci-dessus dans l'équation (1), avec la fonction de perte dans la formulation donnée par la perte de la charnière:
L (w;x,y):=max{0,1-ywTx}.
par défaut, les SVM linéaires sont entraînés avec une régularisation L2. Nous avons également soutenir la régularisation alternative L1. Dans ce cas, l' problème devient un programme linéaire.
l'algorithme linéaire SVMs produit un modèle SVM. Compte tenu de nouvelles données à l' point, dénoté par x, le modèle fait des prédictions basées sur la valeur de wTx. Par défaut, si wTx≥0 alors le résultat est positif, et négatif sinon.