Machine learning 自动编码器和IsolationForest的ROC AUC分数

Machine learning 自动编码器和IsolationForest的ROC AUC分数,machine-learning,scikit-learn,metrics,autoencoder,anomaly-detection,Machine Learning,Scikit Learn,Metrics,Autoencoder,Anomaly Detection,我是机器学习领域的新手&我正在(尝试)实现异常检测算法,一个算法是在tensorflow库的keras的帮助下实现的自动编码器,第二个是在sklearn库的帮助下实现的IsolationForest,我想将这些算法与roc_auc_score()的帮助下进行比较,但我不确定我做的是否正确 在roc_auc_得分函数的文档中,我可以看到,对于输入,它应该如下所示: sklearn.metrics.roc\u auc\u分数(y\u真,y\u分数,平均值='macro',样本权重=无,最大fpr=无

我是机器学习领域的新手&我正在(尝试)实现异常检测算法,一个算法是在tensorflow库的keras的帮助下实现的自动编码器,第二个是在sklearn库的帮助下实现的IsolationForest,我想将这些算法与roc_auc_score()的帮助下进行比较,但我不确定我做的是否正确

在roc_auc_得分函数的文档中,我可以看到,对于输入,它应该如下所示:

sklearn.metrics.roc\u auc\u分数(y\u真,y\u分数,平均值='macro',样本权重=无,最大fpr=无

y\u正确: 真正的二进制标签或二进制标签指示器

y\u得分: 目标分数可以是正类的概率估计、置信值或决策的非阈值度量(由某些分类器上的“决策函数”返回)。对于二进制y_true,y_分数应该是具有更大标签的类的分数

对于AE,我计算roc\u auc\u分数如下:

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
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
对于IsolationForest,我计算roc\u auc\u分数如下:

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
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_分数是否具有可比性(我的意思是,如果我以正确的方式计算它们)?特别是在AE模型中,我将MSE放入roc_auc_分数中(如果没有,这个函数的y_分数应该是什么?)

使用
sklearn.metrics.roc_auc_分数
在异常检测的背景下比较AE和IsolationForest,该分数基于AE MSE损失和IF
决策函数()
分别可以。切换分类器时改变y_分数的范围不是问题,因为在计算AUC时,每个分类器都会考虑这个范围

要理解AUC不依赖于范围,请记住,您沿着决策函数值移动以获得ROC点。重新缩放决策函数值只会相应地更改决策函数阈值,定义ROC的类似点,因为新阈值将导致每个点的TPR和FPR与b相同在重新缩放之前

sklearn.metrics.roc_auc_score
中找不到令人信服的代码行,但您可以在与研究论文相关的已发布代码中轻松观察到这种比较。例如,在论文的代码中(我不是作者,我知道论文的代码,因为我在复制它们的结果)、AE MSE损失和IF
决策函数()
roc\u auc\u得分
输入(论文正在比较其输出):

AE roc_auc_分数计算 在github上找到

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)
from sklearn.metrics import roc_auc_score

(...)

scores = (-1.0) * self.isoForest.decision_function(X.astype(np.float32))  # compute anomaly score
y_pred = (self.isoForest.predict(X.astype(np.float32)) == -1) * 1  # get prediction

(...)

auc = roc_auc_score(y, scores.flatten())
隔离森林roc_auc_得分计算 在github上找到

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)
from sklearn.metrics import roc_auc_score

(...)

scores = (-1.0) * self.isoForest.decision_function(X.astype(np.float32))  # compute anomaly score
y_pred = (self.isoForest.predict(X.astype(np.float32)) == -1) * 1  # get prediction

(...)

auc = roc_auc_score(y, scores.flatten())
注意:这两个脚本来自两个不同的存储库,但实际上是一篇论文结果的来源。作者只选择创建一个额外的存储库来实现需要神经网络的AD方法