用于新颖性检测的一类 SVM 和隔离森林

sub*_*kar 6 machine-learning one-class-classification

我的问题是关于新奇检测算法 - 隔离森林和一类 SVM。我有一个训练数据集(具有 4-5 个特征),其中所有样本点都是内点,我需要将任何新数据分类为内点或离群点,并相应地在另一个数据帧中摄取。

在尝试使用隔离森林或一类 SVM 时,我必须在训练阶段输入污染百分比(nu)。但是,由于训练数据集没有任何污染,我是否需要将异常值添加到训练数据框中并将该异常值分数作为 nu.

此外,在使用隔离森林时,我注意到每次预测时异常值百分比都会发生变化,即使我没有更改模型。除了进入扩展隔离森林算法之外,有没有办法解决这个问题。

提前致谢。

M. *_*PhD 6

关于隔离林的污染问题,

如果您正在训练正常实例(所有内点),则应该将污染设置为零。如果您不指定此项,污染度将为 0.1(对于版本 0.2)。

下面是一个简单的代码来展示这一点,

1-导入库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest
rng = np.random.RandomState(42)
Run Code Online (Sandbox Code Playgroud)

2- 生成 2D 数据集

X = 0.3 * rng.randn(1000, 2)
Run Code Online (Sandbox Code Playgroud)

3-训练 iForest 模型并预测异常值

clf = IsolationForest(random_state=rng, contamination=0)
clf.fit(X)
y_pred_train = clf.predict(X)  
Run Code Online (Sandbox Code Playgroud)

4-打印异常数量

print(sum(y_pred_train==-1))
Run Code Online (Sandbox Code Playgroud)

这会给你0 个异常。现在,如果您将污染更改为 0.15,则程序会从您已有的同一数据集中指定150 个异常(由于RandomState(42) 也是如此)。

[参考]:

1 刘费托尼、丁凯明和周志华。“隔离森林。” 数据挖掘,2008。ICDM'08。第八届 IEEE 国际会议

2 刘费托尼、丁凯明和周志华。“基于隔离的异常检测。” ACM 数据知识发现汇刊 (TKDD),(2012)

  • 感谢回复。我确实理解,在设置污染因子 = 0 时,将对模型进行训练,以便在训练数据集上不会检测到异常,这正是事实真相。然而,我的目标是,当我在另一个新数据集上使用这个模型时,它应该能够找出这个新数据集中关于我的训练数据的异常值和内部值。由于训练模型是在污染 = 0 的情况下进行训练的,因此得出的结论是新数据集中的每个样本也是内点,并且异常检测算法失败。我该如何解决这个问题? (2认同)