0

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

这是我的数据图: 情节系列

这是调用时 IsolationForest 算法的相应分数图score_samples()情节分数

如您所见,这两个系列对于右边最后 100 个值的几乎每个值都有相同的分数。为什么?我希望他们是不同的。

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

最后,在最后 100 分的两个分数系列中存在差异。就好像有一个他们不能超过的最低分值(尽管之前的一些分数做到了?)

我查看了分数公式和 Scikit-Learn 文档中引用的论文,但这并没有让我更接近答案。

得分这种行为的原因是什么?是否有任何变通方法来获得更“合理”的分数指标?理想情况下,我想要一个在 (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')
4

1 回答 1

0

我相信这个问题是由于您的异常样本超出了训练数据的数据分布造成的。在这个区域里,树上不会有分裂,所以你只会得到“最大异常”。

一般来说,这种数据(连续规则单变量正态分布时间序列)不是 IsolationForest 非常适合的数据。它更擅长于许多变量、稀疏数据、混合分类数据、非典型分布。

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

于 2022-01-21T10:16:49.327 回答