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!
Ich sehe. Aber wie soll ich den Ausreißeranteil vorher wissen? – user1274878
@ 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
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