为什么 Scikit-Learn 中 IsolationForest 算法的 score_samples-function 给出相同的分数?

Why is the score_samples-function of the IsolationForest algorithm in Scikit-Learn giving identical scores?

我正在尝试在 scikit-learn 中使用 IsolationForest 算法,我对计算出的分数很感兴趣。但是当调用 score_samples() 我没有得到我期望的分数。

这是我的数据图:

下面是调用 score_samples() 时 IsolationForest 算法的相应分数图:

如您所见,这两个系列在右侧最后 100 个值中几乎每个值的得分都相同。为什么?我希望它们是不同的。

此外,还有几个分数低于最后 100 个分数,这表明它们更有可能是异常。但在系列图中,它们更接近拟合数据。这是为什么?

终于在最后100分的时候,两个比分系列出现了差异。好像有一个他们不能超过的最低分数值(即使以前的一些分数超过了?)

我查看了 Scikit-Learn 文档中引用的 scores formula and in the paper,但这并没有让我更接近答案。

分数出现这种行为的原因是什么?是否有任何解决方法来获得更“合理”的分数指标?理想情况下,我希望得分在 (0, 1) 范围内。

这是用于生成两个数据系列的代码:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = [16, 6]

### simulating data
np.random.seed(0)
X1 = np.concatenate((np.random.normal(loc=2.75, scale=0.1, size=335),
                     np.random.normal(loc=3.2, scale=0.1, size=100)))
X1_train = X1[:200]

np.random.seed(0)
X2 = np.concatenate((np.random.normal(loc=2.75, scale=0.1, size=335),
                     np.random.normal(loc=3.0, scale=0.1, size=100)))
X2_train = X2[:200]

### plotting simulated data
plt.plot(X1, 'x', label='values of series 1')
plt.plot(X2, '.', markersize=3, label='values of series 2')
plt.axvline(200, c='k', linestyle=(0, (5, 10)), linewidth=0.5) ### visualizing the end of the training data.
plt.legend(loc='upper left')

这是用于生成 IsolationForest 算法分数的代码:

from sklearn.ensemble import IsolationForest    

### fitting isolation forests and computing scores
iso1 = IsolationForest(random_state=0).fit(X1_train.reshape(-1, 1))
score1 = iso1.score_samples(X1.reshape(-1, 1))

iso2 = IsolationForest(random_state=0).fit(X2_train.reshape(-1, 1))
score2 = iso2.score_samples(X2.reshape(-1, 1))

### plotting scores
plt.plot(score1, 'x', label='IForest score of series 1')
plt.plot(score2, '.', markersize=3, label='IForest score of series 2')
plt.axvline(200, c='k', linestyle=(0, (5, 10)), linewidth=0.5)
plt.legend(loc='lower left')

我认为这个问题是由于您的异常样本在训练数据的数据分布之外造成的。在这个区域中,树不会分裂,所以你最终会得到“最大异常”。

一般来说,这种数据(连续的正则单变量 normal-distributed time-series)不是 IsolationForest 非常适合的数据。它在许多变量、稀疏数据、混合分类数据、non-typical 分布方面表现更好。

其他模型,如 z-score 或中值绝对偏差转换在这种情况下将更加连续,随着数据点距离的增加分数增加。他们的得分可以解释为概率。