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

w51jfk4q  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(84)

我想用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.       ]
l7wslrjt

l7wslrjt1#

也许这个信息可以帮助。
数据的实际概率是重建比。
这意味着,当概率为0时。9,90%的令牌被正确地重建。我希望正常数据的比例高,异常数据的比例低。

相关问题