2017-07-12 8 views
-1

Ich habe einen Trainingsdatenmenge, die keine Ausreißer enthält:sklearn: Anomaly Detektion Isolation Wälder

train_vectors.shape 
(588649, 896) 

Und ich habe einen anderen Satz von Testvektoren (test_vectors), und alle von ihnen sind Ausreißer.

Hier ist mein Versuch, die Erkennung von Ausreißern zu tun:

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 

So, hier der Ausreißer Prozentsatz liegt bei etwa 10%, was die Standard-Verschmutzungsparameter für Isolation Wälder in sklearn verwendet wird. Bitte beachten Sie, dass im Trainings-Set keine Ausreißer enthalten sind.

Testing-Code und die Ergebnisse:

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 

So erkennt es nur 17 Anomalien aus dem 100. Kann mir bitte jemand sagen, wie die Leistung zu verbessern. Ich bin mir überhaupt nicht sicher, warum der Algorithmus verlangt, dass der Benutzer den Verunreinigungsparameter spezifiziert. Es ist für mich klar, dass es als Schwelle verwendet wird, aber wie soll ich vorher über den Grad der Kontamination wissen. Vielen Dank!

Antwort

1

IsolationForest funktioniert ein bisschen anders als das, was Sie beschrieben :). Die contamination ist:

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

was bedeutet, dass Ihr Zugverband etwa 10% der Ausreißer enthalten sollte. Idealerweise sollte Ihr Testset ungefähr die gleiche Menge an Ausreißern enthalten - und es sollte nicht nur Ausreißer enthalten.

Versuchen Sie, Ihre Dataset-Proportionen wie beschrieben zu ändern, und versuchen Sie es erneut mit dem von Ihnen geposteten Code!

Hoffe, das hilft, viel Glück!

P.S. Sie können auch versuchen OneClassSVM, die nur mit den normalen Instanzen trainiert wird - das Testset sollte auch ziemlich wie oben und nicht nur Ausreißer obwohl.

+0

Ich sehe. Aber wie soll ich den Ausreißeranteil vorher wissen? – user1274878

+0

@ user1274878 Ich weiß, ich weiß ... Sie können nicht wirklich wissen, aber entweder haben Sie eine Schätzung, z. Ihre Ausreißer sind selten, weil Sie davon ausgehen, dass Sie verschiedene Datensätze haben und mehr oder weniger wissen, was Sie erwarten können. In beiden Fällen führen Sie Experimente durch, um Ihre Parameter zu bewerten und zu optimieren [mehr Infos] (https://stackoverflow.com/a/43271326/3433323) Btw, Isolation Forest geht davon aus, dass Ihre Ausreißer selten sind und leicht getrennt werden können ("wenige und anders"). – mkaran

+0

versuchte oneClassSVM gemäß Ihrem Vorschlag, und es dauert Stunden für diesen Datensatz. Nutzt nur einen einzigen Kern und etwa 90% des Speichers. Können Sie mich bitte auf eine effiziente Umsetzung hinweisen? – user1274878