在使用 sklearn.metrics..roc_curve 评估异常检测模型时设置 model_pred_proba

问题描述 投票:0回答:1

我想使用 sklearn.metrics.roc_curve 评估异常检测的模型性能由于类 0 是异常数据,我将 pos_label 参数设置为 0.

但是画roc_curve的时候就奇怪了。 enter image description here

所以我认为有问题的一件事是 sklearn.metrics.roc_curve() 的阈值返回,从 2 开始。我认为这是问题所在。当阈值为 1 时,我的模型仅将 61 个数据中的 3 个估计为概率 1,但它表示 tpr 是 0.049 而不是 0.951(0.951 是正确的,因为 TP = 58,FN = 3)。

使用原点概率数据输出roc曲线。

from sklearn.metrics import roc_curve
a = np.ones(y.shape[0])
y_pred_probaa = a - y_pred_proba
# fprs, tprs, thresholds = roc_curve(y, y_pred_probaa, pos_label=0)
fprs, tprs, thresholds = roc_curve(y, y_pred_proba, pos_label=0)


print(fprs)
print(tprs)
print(thresholds)
[0.         0.99756296 0.9983753  0.99918765 1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.        ]
[0.         0.04918033 0.08196721 0.3442623  0.52459016 0.55737705
 0.60655738 0.63934426 0.73770492 0.78688525 0.83606557 0.90163934
 0.93442623 1.        ]
[2.        1.        0.9921875 0.984375  0.9765625 0.9609375 0.953125
 0.9375    0.9140625 0.8828125 0.8515625 0.7421875 0.71875   0.6328125]

总结我的问题,我认为阈值应该从0开始,因为pos_label = 0但sklearn没有。我的解决方案是将概率重新计算为 1 - y_pred。这是正确的解决方案吗?

当尝试这个 roc_curve 如下图所示。 roc_curve_renew

我的源代码 1 - y_pred.

from sklearn.metrics import roc_curve
a = np.ones(y.shape[0])
y_pred_probaa = a - y_pred_proba
fprs, tprs, thresholds = roc_curve(y, y_pred_probaa, pos_label=0)
# fprs, tprs, thresholds = roc_curve(y, y_pred_proba, pos_label=0)


print(fprs)
print(tprs)
print(thresholds)
[0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.12347685e-04
 1.62469537e-03 2.43704305e-03 1.00000000e+00]
[0.         0.01639344 0.06557377 0.09836066 0.16393443 0.21311475
 0.26229508 0.36065574 0.39344262 0.44262295 0.47540984 0.6557377
 0.91803279 0.95081967 1.        ]
[1.3671875 0.3671875 0.2890625 0.28125   0.1875    0.1484375 0.09375
 0.0859375 0.0546875 0.046875  0.03125   0.0234375 0.015625  0.0078125
 0.       ]
python matplotlib scikit-learn roc
1个回答
0
投票

也许这些信息可以提供帮助。

数据的实际概率是重构比率。

这意味着,当概率为 0.9 时,90% 的标记被正确重构。我希望正常数据的比率高,异常数据的比率低。

© www.soinside.com 2019 - 2024. All rights reserved.