AutoEncoder和IsolationForest的ROC AUC评分



我是机器学习领域的新手;我正在(尝试(实现异常检测算法,其中一个算法是在tensorflow库的keras的帮助下实现的Autoencoder,第二个是在sklearn库的帮助下实施的IsolationForest,我想在roc_auc_score(Python中的函数(的帮助下比较这些算法,但我不确定我做得是否正确。

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

sklearn.metrics.roc_auc_score(y_true,y_score,average='macro',sample_weight=None,max_fpr=None(

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输入应该是什么?(

在异常判断的背景下,分别根据AE MSE损失和IFdecision_function()的得分,使用sklearn.metrics.roc_auc_score比较AE和IsolationForest是可以的。切换分类器时y_score的变化范围不是问题,因为在计算AUC时,每个分类器都会考虑这个范围。

要理解AUC不是范围依赖性的,请记住,您沿着决策函数值行进以获得ROC点。重新缩放决策函数值只会相应地改变决策函数阈值,从而定义ROC的相似点,因为新的阈值将导致与重新缩放之前相同的TPR和FPR。

sklearn.metrics.roc_auc_score的实现中找不到令人信服的代码行,但您可以很容易地在与研究论文相关的已发布代码中观察到这种比较。例如,在Deep One Class Classification论文的代码中(我不是作者,我知道论文的代码,因为我正在复制他们的结果(,AE MSE损失和IFdecision_function()roc_auc_score的输入(论文正在比较其输出(:

AE roc_auc_score计算

在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)

IsolationForest proc_auc_score计算

在github上的此脚本中找到。

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())

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

最新更新