我想用sklearn评估异常检测的模型性能。metrics.roc_curve由于class 0是异常数据,我将pos_label参数设置为0。
但在绘制ROC曲线时,却出现了奇怪的现象。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]
总结一下我问题,我认为threshold应该从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. ]
1条答案
按热度按时间l7wslrjt1#
也许这个信息可以帮助。
数据的实际概率是重建比。
这意味着,当概率为0时。9,90%的令牌被正确地重建。我希望正常数据的比例高,异常数据的比例低。