Python
scikit-learn IsolationForest 異常分數
根據 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
,因此請評估以後版本的文檔,看看你必須做什麼才能從模型中恢復原始分數!希望這有幫助!