Python

scikit-learn IsolationForest 異常分數

  • March 18, 2018

根據 IsolationForest 論文(參考文獻在文檔中給出),Isolation Forest 產生的分數應該在 0 到 1 之間。

scikit-learn 中的實現否定了分數(因此高分更多地位於內部)並且似乎也將其移動了一些。我試圖弄清楚如何扭轉它,但到目前為止還沒有成功。該代碼有一些方法和屬性,如 score_samples() 和 self.offset_ 無法從擬合對象訪問。代碼中關於 self.contamination 用法的文檔和註釋似乎相互矛盾……

我有 scikit-learn 的 19.1 版(不知道從那時起 IsolationForest 實現是否有重大變化)

任何想法/建議將不勝感激!

所以0.19.1中對應的代碼IsolationForest可以在這裡找到。這使您的問題更易於管理並且更少混亂,因為當前存在於 sklearn 的 master 分支上的內容與 0.19.1 版本完全不同。

在這個版本中,我們可以直接恢復基礎分數,因為decision_function它們是這樣給我們的:

/// do the work for calculating the path lengths across the ensemble ///
scores = 2 ** (-depths.mean(axis=1) / _average_path_length(self.max_samples_))
return 0.5 - scores

scores完全按照您對原始論文的期望進行計算。要恢復我們想要的,我們只需執行以下操作:

model = sklearn.ensemble.IsolationForest()
model.fit(data)
sklearn_score_anomalies = model.decision_function(data_to_predict)
original_paper_score = [-1*s + 0.5 for s in sklearn_score_anomalies]

非常重要的注意事項:這將不是scikit-learn 未來版本的默認行為decision_function,因此請評估以後版本的文檔,看看你必須做什麼才能從模型中恢復原始分數!

希望這有幫助!

引用自:https://stats.stackexchange.com/questions/335274

comments powered by Disqus