【问题标题】:ROC AUC score for AutoEncoder and IsolationForestAutoEncoder 和 IsolationForest 的 ROC AUC 分数
【发布时间】:2020-03-12 14:48:27
【问题描述】:

我是机器学习领域的新手,我正在(尝试)实现异常检测算法,一种算法是自动编码器,借助 tensorflow 库中的 keras 实现,第二种算法是 IsolationForest,借助 sklearn 库实现,我想要在 roc_auc_score (function from 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 应该是什么输入?)

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    IsolationForest roc_auc_score 计算

    在 github 上的this script 中找到。

    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 方法创建一个额外的存储库。

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 2020-11-27
      • 2020-02-23
      • 2020-10-01
      • 2016-06-19
      • 1970-01-01
      • 2021-10-06
      • 2019-06-09
      • 2021-03-12
      相关资源
      最近更新 更多