2017-07-12 2 views
-1

je un ensemble de données de formation qui ne contient pas des valeurs aberrantes:sklearn: Détection des anomalies en utilisant les forêts d'isolement

train_vectors.shape 
(588649, 896) 

Et, j'ai un autre ensemble de vecteurs de test (test_vectors), et tous sont des valeurs aberrantes.

Voici ma tentative de faire la détection des valeurs aberrantes:

from sklearn.ensemble import IsolationForest 
clf = IsolationForest(max_samples=0.01) 
clf.fit(train_vectors) 
y_pred_train = clf.predict(train_vectors) 
print(len(y_pred_train)) 
print(np.count_nonzero(y_pred_train == 1)) 
print(np.count_nonzero(y_pred_train == -1)) 

Output: 
588649 
529771 
58878 

Donc, voici le pourcentage des valeurs aberrantes est d'environ 10%, ce qui est le paramètre de contamination par défaut utilisé pour les forêts d'isolement dans sklearn. Veuillez noter qu'il n'y a pas de valeurs aberrantes dans l'ensemble d'apprentissage.

Code d'essai et résultats:

y_pred_test = clf.predict(test_vectors) 
print(len(y_pred_test)) 
print(np.count_nonzero(y_pred_test == 1)) 
print(np.count_nonzero(y_pred_test == -1)) 

Output: 
100 
83 
17 

Ainsi, il ne détecte que 17 anomalies sur la 100. Quelqu'un peut-il s'il vous plaît me dire comment améliorer les performances. Je ne suis pas du tout sûr pourquoi l'algorithme exige que l'utilisateur spécifie le paramètre de contamination. Il est clair pour moi qu'il est utilisé comme seuil, mais comment dois-je savoir à l'avance sur le niveau de contamination. Je vous remercie! IsolationForest fonctionne un peu différemment de ce que vous avez décrit :) :)

Répondre

1

Le contamination est:

The amount of contamination of the data set, i.e. the proportion of outliers in the data set. Used when fitting to define the threshold on the decision function.link

Ce qui signifie que votre jeu de train devrait contenir environ 10% des valeurs aberrantes. Idéalement, votre ensemble de test devrait contenir à peu près la même quantité de valeurs aberrantes - et il ne devrait pas s'agir uniquement de valeurs aberrantes et non de. Essayez de changer les proportions de votre jeu de données comme décrit et réessayez avec le code que vous avez posté!

Espérons que cela aide, bonne chance!

P.S. Vous pouvez également essayer OneClassSVM qui est formé avec les instances normales seulement - le jeu de test devrait également être à peu près comme ci-dessus et non seulement les valeurs aberrantes.

+0

Je vois. Mais, comment puis-je connaître le pourcentage aberrant à l'avance? – user1274878

+0

@ user1274878 Je sais que je sais ... vous ne pouvez pas vraiment savoir, mais, soit vous avez une estimation, par exemple. vos valeurs aberrantes sont rares à cause de certaines hypothèses, ou vous avez différents ensembles de données et vous savez plus ou moins à quoi vous attendre. Dans les deux cas, exécutez des expériences pour évaluer et régler vos paramètres [plus d'infos] (https://stackoverflow.com/a/43271326/3433323) Btw, Isolation Forest fonctionne sur l'hypothèse que vos valeurs aberrantes sont peu nombreuses et peuvent être facilement séparées ("peu et différent"). – mkaran

+0

a testé oneClassSVM selon votre suggestion, et cela prend des heures pour cet ensemble de données. Utilise seulement un seul noyau et environ 90% de la mémoire. Pouvez-vous s'il vous plaît me diriger vers une implémentation efficace? – user1274878