我注意到sklearn有以下功能:
sklearn.metrics.roc_auc_score()
其将ground_ truth和预测作为输入。
例如,
ground_truth = [1,1,0,0,0]
prediction = [1,1,0,0,0]
sklearn.metrics.roc_auc_score(ground_truth, prediction)
返回1
我的问题是,我不知道sklearn是如何用两个二进制输入计算ROC曲线下的面积的。ROC曲线不是通过移动类分配阈值并计算每个阈值的虚警和命中率得出的吗?有了两个二进制输入,难道你不应该只有一个(误报、命中率)测量吗?
非常感谢!
使用二进制预测,曲线只有一个阈值/测量值,这是正确的。我自己也不理解,所以我在sklearn教程中运行了大量的print语句,然后又运行了一个纯二进制示例。所有的魔法都发生在sklearn.metrics._binary_clf_curve
中
"阈值"是不同的预测分数。对于任何输出纯1和0的二进制分类器,你都会得到两个阈值——1和0(它们在内部从最高到最低排序)。在1阈值处,>=1的预测分数为真,低于该分数的任何分数(在这种情况下仅为0)都被视为假,并且根据该分数计算TP和FP率。在所有情况下,最后一个阈值将所有情况分类为真,因此TP和FP率都将为1。
这样看来,要为sklearn分类器生成正确的ROC曲线,您应该使用clf.predict_proba()
而不是predict()
。或者,也许是predict_log_proba()
?我不确定这是否会有任何不同