我在这里阅读了决策函数和 score_samples 的文档,但无法弄清楚这两种方法之间有什么区别,以及我应该将哪一种用于异常值检测算法。
任何帮助,将不胜感激。
我在这里阅读了决策函数和 score_samples 的文档,但无法弄清楚这两种方法之间有什么区别,以及我应该将哪一种用于异常值检测算法。
任何帮助,将不胜感激。
请参阅属性的文档offset_
:
用于从原始分数定义决策函数的偏移量。我们有关系:
decision_function = score_samples - offset_
。offset_
定义如下。当 contamination 参数设置为“auto”时,偏移量等于 -0.5,因为 inliers 的得分接近 0,outliers 的得分接近 -1。当提供不同于“auto”的污染参数时,偏移量的定义方式是我们在训练中获得预期的异常值(决策函数 < 0 的样本)数量。
用户指南参考了Fei Tony、Kai Ming 和 Zhi-Hua 撰写的论文Isolation forest 。
我没有阅读论文,但我认为您可以使用任一输出来检测异常值。文档说score_samples
是相反的decision_function
,所以我认为它们是负相关的,但两个输出似乎与目标具有完全相同的关系。唯一的区别是它们在不同的范围内。事实上,它们甚至具有相同的方差。
为了看到这一点,我将模型拟合到 sklearn 中可用的乳腺癌数据集,并可视化按每个输出的十分位数分组的目标变量的平均值。如您所见,它们具有完全相同的关系。
# Import libraries
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import IsolationForest
# Load data
X = load_breast_cancer()['data']
y = load_breast_cancer()['target']
# Fit model
clf = IsolationForest()
clf.fit(X, y)
# Split the outputs into deciles to see their relationship with target
t = pd.DataFrame({'target':y,
'decision_function':clf.decision_function(X),
'score_samples':clf.score_samples(X)})
t['bins_decision_function'] = pd.qcut(t['decision_function'], 10)
t['bins_score_samples'] = pd.qcut(t['score_samples'], 10)
# Visualize relationship
plt.plot(t.groupby('bins_decision_function')['target'].mean().values, lw=3, label='Decision Function')
plt.plot(t.groupby('bins_score_samples')['target'].mean().values, ls='--', label='Score Samples')
plt.legend()
plt.show()
就像我说的,它们甚至有相同的差异:
t[['decision_function','score_samples']].var()
> decision_function 0.003039
> score_samples 0.003039
> dtype: float64
总之,您可以互换使用它们,因为它们都与目标共享相同的关系。