我想使用 sklearn.metrics.roc_curve 评估异常检测的模型性能由于类 0 是异常数据,我将 pos_label 参数设置为 0.
所以我认为有问题的一件事是 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。这是正确的解决方案吗?
我的源代码 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. ]
也许这些信息可以提供帮助。
数据的实际概率是重构比率。
这意味着,当概率为 0.9 时,90% 的标记被正确重构。我希望正常数据的比率高,异常数据的比率低。