AUC计算
参考:https://blog.****.net/u013385925/article/details/80385873
AUC是ROC曲线下的面积
首先,介绍一下ROC曲线的绘制
ROC曲线
ROC曲线的横轴表示真正例率FPR
,纵轴表示假正例率FPR
可以简化为如下形式:
P表示所有样本中正例总数
N表示所有样本中负例总数
TP判断为正例的样本中判断正确的总数
FP判断为正例的样本中判断错误的总数
ROC曲线
根据不同阈值下的TPR和FPR绘制,每个阈值对应一组TPR和FPR,即对应ROC曲线上的一点
阈值如何选取呢?
阈值依次取每个样本的score,即依次将每个样本判断为正例,计算TPR和FPR,绘制ROC曲线(具体步骤在下面)
AUC
AUC:随机选取一个正例和一个负例,正样本的预测值大于负样本的概率。
AUC是ROC曲线下的面积,可以通过计算曲线下面积估算,但算法麻烦,不可取。
AUC计算
在有限样本中我们常用的得到概率的办法就是通过频率来估计之。
取m个正例和n个负例,可以组成m * n个正负例对
。考虑每一对正负例,若正例的预测值大于
负例,加1;若相等
,加0.5。
其他变形可参考:AUC计算方法
实现
def roc_auc_score(true, scores):
count = 0
data = list(zip(true, scores))
positives = list(filter(lambda x: x[0] == 1, data))
negatives = list(filter(lambda x: x[0] == 0, data))
for positive in positives:
for negative in negatives:
if positive[1] > negative[1]:
count += 1
elif positive[1] == negative[1]:
count += 0.5
return count / (len(positives) * len(negatives))
# for test
import numpy as np
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print(roc_auc_score(y_true, y_scores))
sklearn
库中提供了计算工具,只需提供真实值和预测值即可
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print(roc_auc_score(y_true, y_scores))