AutoEncoder和IsolationForest

时间:2019-11-16 18:56:51

标签: machine-learning scikit-learn metrics autoencoder anomaly-detection

我是机器学习领域的新手,并且(正在尝试)实施异常检测算法,一种算法是通过Tensorflow库中的keras帮助实现Autoencoder,第二种方法是在sklearn库的帮助下实现IsolationForest在roc_auc_score(function from Python)的帮助下比较这些算法,但是我不确定自己是否正确。

在roc_auc_score函数的文档中,我可以看到,输入应该像这样:

sklearn.metrics.roc_auc_score(y_true,y_score,平均值=“宏”,sample_weight =无,max_fpr =无

y_true: 真正的二进制标签或二进制标签指示符。

y_score: 目标分数可以是肯定类别的概率估计值,置信度值或决策的非阈值度量(如某些分类器上的“ decision_function”所返回)。对于二进制y_true,应将y_score视为具有更大标签的类的分数。

对于AE,我正在这样计算roc_auc_score:

model.fit(...) # model from https://www.tensorflow.org/api_docs/python/tf/keras/Sequential
pred = model.predict(x_test) # predict function from https://www.tensorflow.org/api_docs/python/tf/keras/Sequential#predict
metric = np.mean(np.power(x_test - pred, 2), axis=1) #MSE
print(roc_auc_score(y_test, metric) # where y_test is true binary labels 0/1

对于IsolationForest,我正在这样计算roc_auc_score:

model.fit(...) # model from https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html
metric = -(model.score_samples(x_test)) # https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest.score_samples
print(roc_auc_score(y_test, metric) #where y_test is true binary labels 0/1

我很好奇,是否从AE和IsolationForest的两个实现返回的roc_auc_score是可比较的(我是说,如果我以正确的方式计算它们)?尤其是在AE模型中,我将MSE放到roc_auc_score中(如果不是,那么此函数的y_score输入应为什么?)

1 个答案:

答案 0 :(得分:0)

在异常检测的情况下,分别基于来自AE MSE损失和IF sklearn.metrics.roc_auc_score的得分,使用decision_function()比较AE和IsolationForest是可以的。切换分类器时y_score的变化范围不是问题,因为在计算AUC时每个分类器都会考虑该范围。

要了解AUC与范围无关,请记住,您沿决策函数值行进以获取ROC点。重新缩放决策函数值只会相应地更改决策函数阈值,从而定义了ROC的相似点,因为新阈值将导致每个TPR和FPR与重新缩放之前相同。

sklearn.metrics.roc_auc_score的{​​{3}}中找不到令人信服的代码行,但是您可以轻松地在与研究论文相关的已发布代码中观察到这种比较。例如,在implementation论文的代码中(我不是作者,我知道该论文的代码,因为我正在再现他们的结果),AE MSE损失和IF decision_function()是{{1} }输入(正在比较其输出的纸张):

AE roc_auc_score计算

在github上的Deep One-Class Classification中找到。

roc_auc_score

IsolationForest roc_auc_score计算

在github上的this script中找到。

from sklearn.metrics import roc_auc_score

(...)

scores = torch.sum((outputs - inputs) ** 2, dim=tuple(range(1, outputs.dim())))

(...)

auc = roc_auc_score(labels, scores)

注意::这两个脚本来自两个不同的存储库,但实际上是单篇论文结果的来源。作者仅选择为需要神经网络的AD方法的PyTorch实现创建额外的存储库。