我是机器学习领域的新成员&我正在(试图)实现异常检测算法,一种算法是借助tensorflow库的keras实现的自动编码器,另一种是借助sklearn库实现的IsolationForest,我想将这些算法与roc_auc_score ( 函数来自Python)进行比较,但我不确定是否正确。
在roc_auc_score函数的文档中,我可以看到,对于输入,应该如下所示:
sklearn.metrics.roc_auc_score(y_true,y_score,average=‘宏’,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/1For 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的两个实现返回的IsolationForest是否具有可比性(我的意思是,如果我以正确的方式计算它们)?特别是在AE模型中,我要把最小均方输入到roc_auc_score中(如果不是,作为y_score输入到这个函数中应该是什么?)
发布于 2020-01-31 17:02:53
比较了AE和IsolationForest在异常衰减情况下的sklearn.metrics.roc_auc_score值,分别基于AE、MSE损失的分数和decision_function()是否合适。当切换分类器时,y_score的变化范围并不是一个问题,因为在计算AUC时,每个分类器都会考虑到这个范围。
要理解AUC不依赖于范围,请记住,您沿着决策函数值来获得ROC点。重新标度决策函数值只会相应地改变决策函数阈值,定义ROC的相似点,因为新的阈值将导致与重新标度前相同的TPR和FPR。
在sklearn.metrics.roc_auc_score的实现中找不到令人信服的代码行,但您可以很容易地在与研究论文相关的已发表代码中观察到这种比较。例如,在深层一级分类论文的代码中(我不是作者,我知道论文的代码,因为我正在复制它们的结果)、AE MSE丢失以及如果decision_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 roc_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())注释:,这两个脚本来自两个不同的存储库,但实际上是一篇论文的结果的来源。作者只选择为需要神经网络的AD方法的PyTorch实现创建额外的存储库。
https://stackoverflow.com/questions/58894137
复制相似问题