2

我在这里阅读了决策函数和 score_samples 的文档,但无法弄清楚这两种方法之间有什么区别,以及我应该将哪一种用于异常值检测算法。

任何帮助,将不胜感激。

4

2 回答 2

3

请参阅属性的文档offset_

用于从原始分数定义决策函数的偏移量。我们有关系:decision_function = score_samples - offset_offset_定义如下。当 contamination 参数设置为“auto”时,偏移量等于 -0.5,因为 inliers 的得分接近 0,outliers 的得分接近 -1。当提供不同于“auto”的污染参数时,偏移量的定义方式是我们在训练中获得预期的异常值(决策函数 < 0 的样本)数量。

于 2021-06-21T14:10:47.127 回答
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

总之,您可以互换使用它们,因为它们都与目标共享相同的关系。

于 2021-06-21T04:24:02.300 回答