Comment identifier les valeurs aberrantes dans les données de performances de disponibilité du serveur?

8

J'ai un script python qui crée une liste de listes de disponibilité du serveur et de données de performance, où chaque sous-liste (ou «ligne») contient les statistiques d'un cluster particulier. Par exemple, bien formaté, il ressemble à ceci:

-------  -------------  ------------  ----------  -------------------
Cluster  %Availability  Requests/Sec  Errors/Sec  %Memory_Utilization
-------  -------------  ------------  ----------  -------------------
ams-a    98.099          1012         678          91
bos-a    98.099          1111         12           91
bos-b    55.123          1513         576          22
lax-a    99.110          988          10           89
pdx-a    98.123          1121         11           90
ord-b    75.005          1301         123          100
sjc-a    99.020          1000         10           88
...(so on)...

Donc, sous forme de liste, cela pourrait ressembler à:

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]

Ma question:

  • Quelle est la meilleure façon de déterminer les valeurs aberrantes dans chaque colonne? Ou les valeurs aberrantes ne sont-elles pas nécessairement le meilleur moyen d'attaquer le problème de la découverte de la «méchanceté»?

Dans les données ci-dessus, je voudrais certainement en savoir plus sur bos-b et ord-b, ainsi que sur ams-a car son taux d'erreur est si élevé, mais les autres peuvent être ignorés. Selon la colonne, puisque plus haut n'est pas nécessairement pire, ni plus bas, j'essaie de trouver le moyen le plus efficace de le faire. On dirait que numpy est souvent mentionné pour ce genre de choses, mais je ne sais pas par où commencer même (malheureusement, je suis plus administrateur système que statisticien ...). Lorsque j'ai demandé à Stack Overflow, quelqu'un a mentionné l'utilisation de la fonction scoreatpercentile de numpy et a jeté quoi que ce soit au-dessus du 99e centile - cela semble-t-il une bonne idée?

(Transféré par stackoverflow, ici: /programming/4606288 )

septagram
la source

Réponses:

13

Basé sur la façon dont vous formulez la question

les valeurs aberrantes ne sont-elles pas nécessairement le meilleur moyen d'attaquer le problème de la découverte de la «méchanceté»?

Il n'est pas clair que vous recherchiez des valeurs aberrantes. Par exemple, il semble que vous soyez intéressé par des machines fonctionnant au-dessus / en dessous d'un certain seuil.

Par exemple, si tous vos serveurs étaient à 98 0,1% de disponibilité, un serveur à 100% de disponibilité serait une valeur aberrante, tout comme un serveur à 97,6% de disponibilité. Mais ceux-ci peuvent être dans les limites souhaitées.±

D'un autre côté, il peut y avoir de bonnes raisons a priori de vouloir être informé de tout serveur avec une disponibilité inférieure à 95%, qu'il y ait ou non un ou plusieurs serveurs en dessous de ce seuil.

Pour cette raison, une recherche de valeurs aberrantes peut ne pas fournir les informations qui vous intéressent. Les seuils peuvent être déterminés statistiquement sur la base de données historiques, par exemple en modélisant le taux d'erreur en poisson ou le pourcentage de disponibilité en variables bêta. Dans un cadre appliqué, ces seuils pourraient probablement être déterminés en fonction des exigences de performance.

David LeBauer
la source
2
+1 pour répondre à la question apparente (plutôt qu'à la question posée), qui est beaucoup plus pertinente.
whuber
4

Un moyen simple de trouver des serveurs anormaux serait de supposer qu'ils sont distribués de manière identique, d'estimer les paramètres de la population et de les trier selon leurs probabilités, en ordre croissant. Les probabilités de colonne seraient combinées soit avec leur produit, soit avec leur minimum (ou une autre norme T). Cela fonctionne assez bien tant que les valeurs aberrantes sont rares. Pour la détection des valeurs aberrantes elle-même, les paramètres de population stables sont généralement estimés de manière itérative en supprimant les valeurs aberrantes découvertes, mais ce n'est pas vital tant que vous inspectez manuellement la liste et évitez ainsi le seuillage.

Pour les probabilités, vous pouvez essayer Beta pour les proportions et Poisson pour les taux.

Comme l'a souligné David, la détection des valeurs aberrantes n'est pas tout à fait la même chose que l'analyse de fiabilité, qui signalerait tous les serveurs dépassant un certain seuil. De plus, certaines personnes aborderaient le problème à travers les fonctions de perte - définissant la douleur que vous ressentez lorsqu'un serveur est à 50% de disponibilité ou à un taux d'erreur de 500, puis les classent en fonction de cette douleur.

sesqu
la source
2

L'identification d'un point de données donné en tant que valeur aberrante implique qu'il existe un processus ou modèle de génération de données dont les données devraient provenir. Il semble que vous ne soyez pas sûr de savoir quels sont ces modèles pour les métriques et les clusters donnés qui vous préoccupent. Voici donc ce que j'envisagerais d'explorer: les cartes de contrôle des processus statistiques .

L'idée ici serait de collecter le
-% Disponibilité
- Demandes / Sec
- Erreurs / Sec
-% Memory_Utilization

des métriques pour chacun de vos clusters. Pour chaque métrique, créez un sous-ensemble des données qui inclut uniquement des valeurs "raisonnables" ou contrôlées. Créez les graphiques pour chaque mesure en fonction de ces données sous contrôle. Ensuite, vous pouvez commencer à fournir des données en direct à votre code graphique et évaluer visuellement si les métriques sont en contrôle ou non.

Bien sûr, faire cela visuellement pour plusieurs métriques dans de nombreux clusters peut ne pas être possible, mais cela pourrait être un bon moyen de commencer à en apprendre davantage sur la dynamique à laquelle vous êtes confronté. Vous pouvez ensuite créer un service de notification pour les clusters avec des mesures qui deviennent incontrôlables. Dans ce sens, j'ai joué avec l'utilisation de réseaux de neurones pour classer automatiquement les modèles de tableau de contrôle comme étant OK par rapport à une certaine saveur hors de contrôle (par exemple,% de tendance à la baisse ou comportement cyclique en erreurs / s). Cela vous donne les avantages des graphiques de contrôle des processus statistiques (utilisés depuis longtemps dans les paramètres de fabrication), mais allège le fardeau d'avoir à passer beaucoup de temps à regarder les graphiques, car vous pouvez former un réseau de neurones à classer les modèles en fonction de votre interprétation experte.

Quant au code, il y a le paquet spc sur pypi mais je n'ai aucune expérience en l'utilisant. Mon exemple jouet d'utilisation de réseaux de neurones (Bayes naïfs aussi) peut être trouvé ici .

Josh Hemann
la source
Merci pour un pointeur vers un exemple de code, je vais le vérifier!
septembre 2011