想知道sklearn的roc曲线和auc是怎么计算的。所以专门阅读了sklearn的源码。
/scikit-learn-master/sklearn/metrics/ranking.py
其中有两个函数值得注意:_binary_clf_curve 和 roc_curve。所以特此举个例子将源码review一遍。
#init y_true and y_score
y_true = np.array([1, 1, 2, 2])
y_score = np.array([0.1, 0.4, 0.35, 0.8])
# output the number of classes
classes = np.unique(y_true)
classes #array([1, 2])
#判断classes是否符合条件,例如:
np.array_equal(classes, [1]) # False
pos_label = 1 #默认值,如果不是1,0 不设置的话会报错,报错内容为:"Data is not binary and pos_label is not specified"
y_true = (y_true == pos_label) #将y_true 和pos_label比较,输出为:array([ True, True, False, False], dtype=bool)
#y_score 最大值对应的索引 + reverse
desc_score_indices = np.argsort(y_score, kind="mergesort")[::-1] #输出为:[3 1 2 0]
y_score = y_score[desc_score_indices]
print(y_score) #[ 0.8 0.4 0.35 0.1 ]
y_true = y_true[desc_score_indices]
print(y_true) #[False True False True]
distinct_value_indices = np.where(np.diff(y_score))[0]
print(distinct_value_indices) #[0 1 2]
threshold_idxs = np.r_[distinct_value_indices, y_true.size - 1]
print(threshold_idxs) #[0 1 2 3]
tps = np.cumsum(y_true)[threshold_idxs] #array([0, 1, 1, 2], dtype=int32)
fps = 1 + threshold_idxs - tps #array([1, 1, 2, 2], dtype=int64)
fpr = fps / fps[-1] #array([ 0. , 0.5, 0.5, 1. , 1. ])
tpr = tps / tps[-1] #array([ 0. , 0. , 0.5, 0.5, 1. ])
最后终于知道了sklearn怎么将fpr和tpr算出来,然后在画roc曲线以及auc图。 ROC曲线的行坐标为FPR,纵坐标为TPR。
但是计算方法好像与下面的TPR和FPR计算方法不一样?
混淆矩阵如下:
True Positive Rate(TPR) = TP / (TP + FN)
False Positive Rate(FPR) = FP / (FP + TN)
False Reject Rate(FRR) = 1-TPR = FN / (TP + FN)
False Accept Rate(FAR) = FPR = FP / (FP + TN)
F1 Score = 2 * TP / (2 * TP + FP + FN)
参考资料:
1. sklearn.metrics.roc_curve
2. github 上的源码