0

我有一个隔离林实现,我在其中获取功能(都是数字的);将它们缩放到 0 到 1 之间

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data = scaler.fit_transform(df)
x = pd.DataFrame(data)

然后调用预测:

import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
clf = IsolationForest(max_samples=100, random_state=42).fit(x)
clf.predict(x)

在这种情况下,我有 23 个数字特征。

当我运行脚本时,它绝对为每个结果返回 1。

当我将功能集限制为 2 列时,它会返回 1 和 -1 的混合值。

我怎样才能解决这个问题?

谢谢

4

1 回答 1

1

总而言之,隔离森林所做的就是计算隔离一个样本所需的分裂次数。为了生成树,它随机选择一个特征,然后在所选特征的最大值和最小值之间随机选择一个分割值。

这个想法是,较短的路径可能是异常的。

您可能遇到的问题是您有几个对区分异常无用的功能。因此,重要的特征,因为大量的“非重要”特征而被隐藏起来。因此,您在第二个模型中选择的两个特征可能非常具有解释性。

如果您训练IsolationForest具有最重要特征的模型,则在正常样本和异常样本之间隔离一个样本所需的分裂次数差异会更大。所以分类会更容易。每个问题都会在不同数量的特征下表现得更好。

因此,要解决您的问题,请尝试通过了解您的实际问题来选择最佳功能。此外,尝试仅使用正常样本来拟合模型,或者至少大多数样本(90%)是正常的。如果不是,您的模型将了解到某些异常情况很常见,并将其归类为正常情况。但是,如果您知道数据训练中哪些值是异常的,请调整超参数contamination

于 2021-02-10T11:07:58.237 回答