2017-07-12 41 views
-1

我有一個不包含異常訓練數據集: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的有人可以告訴我如何提高性能。我完全不知道爲什麼該算法要求用戶指定污染參數。我很清楚它被用作閾值,但我怎麼事先知道污染程度。謝謝!

回答

1

IsolationForest的工作原理與您所描述的不同:)。 的contamination是:

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

這意味着你的車組應該包含異常值的10%左右。理想情況下,您的測試集應該包含大約相同數量的異常值 - 並且它應該是而不是僅包含異常值。

train set and test set proportions 
------------------------------------------------ 
| normal ~ 90%     | outliers 10%| 
------------------------------------------------ 

嘗試按照描述更改數據集比例,然後使用您發佈的代碼重試!

希望這會有所幫助,祝你好運!

P.S.你也可以嘗試OneClassSVM,它只用正常實例訓練 - 測試集也應該與上面非常相似,不僅僅是異常值。

+0

我明白了。但是,我怎麼事先知道異常值百分比呢? – user1274878

+0

@ user1274878我知道我知道......你無法真正瞭解,但是,無論你有估計,例如由於某種假設,您的離羣值很少見,或者您擁有各種數據集,並且或多或少地知道期望的結果。在任何情況下,運行實驗來評估和調整您的參數[更多信息](https://stackoverflow.com/a/43271326/3433323) 順便說一句,隔離森林的工作假設你的異常值很小,並且可以很容易地分離(「少而不同」)。 – mkaran

+0

根據您的建議嘗試了oneClassSVM,並且此數據集需要數小時。僅使用一個內核和大約90%的內存。你能指點我一個有效的實施? – user1274878