我有一個不包含異常訓練數據集:sklearn:採用異常檢測隔離森林
train_vectors.shape
(588649, 896)
而且,我有另一組測試向量(test_vectors
),以及所有的人都異常值。
這是我在做異常檢測嘗試:
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
所以,這裏的異常比例爲10%左右是用於sklearn隔離森林默認參數的污染。請注意,訓練集中沒有任何異常值。
測試代碼和結果:
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
因此,它只能檢測17異常出100的有人可以告訴我如何提高性能。我完全不知道爲什麼該算法要求用戶指定污染參數。我很清楚它被用作閾值,但我怎麼事先知道污染程度。謝謝!
我明白了。但是,我怎麼事先知道異常值百分比呢? – user1274878
@ user1274878我知道我知道......你無法真正瞭解,但是,無論你有估計,例如由於某種假設,您的離羣值很少見,或者您擁有各種數據集,並且或多或少地知道期望的結果。在任何情況下,運行實驗來評估和調整您的參數[更多信息](https://stackoverflow.com/a/43271326/3433323) 順便說一句,隔離森林的工作假設你的異常值很小,並且可以很容易地分離(「少而不同」)。 – mkaran
根據您的建議嘗試了oneClassSVM,並且此數據集需要數小時。僅使用一個內核和大約90%的內存。你能指點我一個有效的實施? – user1274878