1. ROC曲线简介
首先,我们先来了解一下ROC曲线是什么。ROC(Receiver Operating Characteristic)曲线的作用是评价在二分类问题中,模型的重分类分类阈值对性能的影响。ROC曲线是横轴为伪阳性率,纵轴为真阳性率的折线图,其中每个点对应于一个分类阈值。ROC曲线上的一个点代表着该阈值下的真正例率(TPR,又称为敏感度)和假正例率(FPR)的对应。这里需要注意的是,TPR的定义为:TPR = TP / (TP + FN),FPR的定义为:FPR = FP / (FP + TN),其中,TP表示真正例,FP表示假正例,TN表示真反例,FN表示假反例。
2. 最佳阈值如何确定
2.1 直接利用ROC曲线
最简单直接的方法就是,从ROC曲线上选择最靠近左上(即真正例率越高,假正例率越低)的点作为最佳阈值。可以使用Python中的numpy和matplotlib库来绘制ROC曲线,并找到最佳阈值。代码如下:
import numpy as np
import matplotlib.pyplot as plt
def plot_roc_curve(fpr, tpr):
plt.plot(fpr, tpr, color='orange', label='ROC')
plt.plot([0, 1], [0, 1], color='darkblue', linestyle='--', label='Guessing')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend()
plt.show()
def find_best_threshold(thresholds, fpr, tpr):
gmeans = np.sqrt(tpr * (1-fpr))
ix = np.argmax(gmeans)
print("Best Threshold = {:.3f}, G-Mean = {:.3f}".format(thresholds[ix], gmeans[ix]))
fpr, tpr, thresholds = roc_curve(y_test, probs)
plot_roc_curve(fpr, tpr)
find_best_threshold(thresholds, fpr, tpr)
2.2 利用代价函数
除了使用ROC曲线确定最佳阈值之外,代价函数也是一个常用的选择最佳阈值的方法。代价函数的作用是建立混淆矩阵,对模型的不同预测情境进行惩罚,进而得到最优的分类阈值。代价函数的选择需要结合具体应用需求,例如,在银行金融领域,将误判成非恶意(即审核通过)和误判为恶意(审核拒绝)都会带来一定的代价,因此需要设计一个综合考虑这两种代价的代价函数。注意,代价函数的选择需要考虑到模型的质量,否则,代价函数的优化将带来意义不大的结果。
2.3 针对不同正负样本比例的最佳阈值选择
在一些实际应用中,正负样本不均衡的问题比较突出。这种情况下,优化分类阈值选择就显得更为重要。在一些学术研究中,利用PR曲线而非ROC曲线来表现分类器真实性能的方法较为常见。PR曲线横轴为召回率,纵轴为精确率,其中召回率的定义为:TPR = TP / (TP + FN),精确率的定义为:Precision = TP / (TP + FP),其中,TP表示真正例,FP表示假正例,FN表示假反例。
由于PR曲线更注重在召回率高的情况下,精确率的表现。因此,PR曲线比ROC曲线更适用于正负样本比例不均衡的情况。确定最佳阈值的方法和ROC曲线类似,可以选择最靠近右上方(即精确率和召回率都较高)的点作为最佳阈值。
3. 常见的错误理解
在使用ROC曲线选择最佳阈值时,之所以常常出现错误理解,一方面是因为ROC曲线常常被错误解读,另一方面则是因为其应用范围的限制。这里,我们列举几个比较常见的错误理解:
3.1 只关注ROC曲线下面积的大小
尽管ROC曲线上的面积可以直观反映分类器的性能,但我们并不能根据面积的大小就认为一个分类器优于另一个分类器。原因在于,ROC曲线的面积大小受样本分布的影响较大。另外,当正负样本数量不平衡时,ROC曲线的面积大小也可能受到影响。因此,我们在确定最佳阈值时不应只关注ROC曲线的AUC值,而应看其具体的曲线走向。
3.2 ROC曲线上任意一个点都可以用来确定最佳阈值
实际上,ROC曲线上每个点都对应着一个分类阈值,但这并不意味着每个点都适用于最佳阈值的选择。因为对随意选择的阈值而言,除了TPR和FPR的值,我们很难从中推导出更多的信息。因此,我们在选择最佳阈值时,仍要对ROC曲线的数据进行深入的分析。
3.3 ROC曲线适用于所有的二分类模型
由于ROC曲线的设计初衷是考虑在不同阈值下的分类器性能差异,因此,其比较适合用于二元分类器。对于多元分类问题而言,我们可以使用one-vs-all或one-vs-one方法将其转化为二分类问题,进而使用ROC曲线评价分类器性能。但这样的方法还存在一定的局限性,因为不同类别之间的兼容性(如对于某一个样本,多个类别均可以作为其标注)可能会影响模型的性能评价。