我有一个相当不平衡的违约风险信用评分数据集 (2:98)。两种成本都相当重要,即假阴性意味着违约损失,而假阳性是失去收入的机会。
我尝试在不平衡集上训练一些模型,并尝试过采样/欠采样方法以及基于类的权重平衡。所有这些方法都导致了体面的 ROCAUC。然而,精确召回曲线总体上看起来很糟糕。
但如果我要平衡测试集,精确召回曲线看起来要好得多。为什么会这样?在不平衡的数据分布下,我应该进行一些调整来提高精确召回率吗?
我有一个相当不平衡的违约风险信用评分数据集 (2:98)。两种成本都相当重要,即假阴性意味着违约损失,而假阳性是失去收入的机会。
我尝试在不平衡集上训练一些模型,并尝试过采样/欠采样方法以及基于类的权重平衡。所有这些方法都导致了体面的 ROCAUC。然而,精确召回曲线总体上看起来很糟糕。
但如果我要平衡测试集,精确召回曲线看起来要好得多。为什么会这样?在不平衡的数据分布下,我应该进行一些调整来提高精确召回率吗?
在处理类不平衡时,ROC 不是一个好的标准。在Kaggle上有一篇关于信用卡欺诈检测的帖子,其中包含针对类别不平衡的实验、减轻不平衡的可能方法、更好的指标和 Python 中的代码。
由于这是一篇很长的文章(实际上是关于类不平衡和 roc 的笔记本),但在这里我引用作者在比较 PR 曲线与 ROC 时的结论:
对于 PR 曲线,一个好的分类器针对图表的右上角,但针对 ROC 曲线的左上角。
虽然 PR 和 ROC 曲线使用相同的数据,即类别标签的真实类别标签和预测概率,但您可以看到这两个图表讲述了非常不同的故事,ROC 中的某些权重似乎比 PR 曲线中的表现更好。
蓝色 w=1 线在两个图表中表现不佳,黑色 w=10000 线在 ROC 中表现“良好”,但在 PR 曲线中表现不佳。这是由于我们数据中的高度不平衡。ROC 曲线对于高度不平衡的数据并不是一个很好的直观说明,因为当总真实负数很大时,误报率(误报率 / 总真实负数)不会急剧下降。
而精度(真阳性/(真阳性+假阳性))对假阳性高度敏感,并且不受大的总真实阴性分母的影响。
模型之间最大的区别是召回率约为 0.8。似乎较低的权重,即 5 和 10,在 0.8 召回时明显优于其他权重。这意味着通过这些特定的权重,我们的模型可以很好地检测欺诈(捕获 80% 的欺诈),同时不会以同样高的 80% 的准确率来惹恼一群误报的客户。
如果不进一步调整我们的模型,当然我们应该对任何真实的模型调整/验证进行交叉验证,看起来普通的逻辑回归似乎停留在 0.8 左右的精度和召回率。
那么我们怎么知道我们是否应该为了更多的召回而牺牲我们的精度,即捕捉欺诈?这就是数据科学满足您的核心业务参数的地方。如果错过欺诈的成本大大超过了取消一堆合法客户交易(即误报)的成本,那么也许我们可以选择一个能够给我们更高召回率的权重。或者,如果您可以通过保持高精度来最大限度地减少“用户摩擦”或信用卡中断,那么捕获 80% 的欺诈对您的业务来说已经足够了。
即使您的 PR 曲线看起来很糟糕,但考虑到类别不平衡,这是最好的指标,您应该尝试改进,以便您的模型最适合您的应用程序
您有一个包含 100 个样本的数据集,其中只有 2 个来自 ,收集到现在?
现在假设从这两个中,一个是其一个类的完全异常值 ,他对你的模型拟合弊大于利,因为他占了你的 50% 他将使您的模型表现出色的样本。
这确实是预期的行为。
(注意你不应该平衡测试集,因为它们应该告诉你关于看不见的原始分布数据的性能
。https://stats.stackexchange.com/a/258974/232706
在二进制分类中,测试数据集应该平衡吗?
)
一个简单的例子可能比笼统的更清楚。让我们确定一个预测阈值,从而确定 PR 曲线上的一个点。假设您的测试集有 100 个正例和 1000 个负例,并且您的模型(具有给定阈值)具有 80% 的召回率和 40% 的精度。然后是 80 TP、20 FN、160 FP 和 840 TP。现在你对平衡数据进行下采样*,丢弃随机的 900 个负样本(很激烈,但要说明这一点)。模型的预测没有改变,只是我们丢失了一些样本。我们预计损失 144 个 FP,保留 16 个;并损失 756 TN,保留 84。 现在我们的召回率是一样的,但准确率从 40% 跃升至 83.3%! 在 PR 图表上,我们已经将曲线上的点向上移动了!当然,这在每一点都独立发生;因此 AU(PR)C 将大幅增加。
*如果重采样均匀分布在您的预测中,其他重采样平衡方法也会发生类似的情况。
一个潜在的原因是您的数据集太小并且您的算法没有足够的样本来“学习”。
如果你“平衡”你的数据集,算法就有足够的数据来“学习”,因此你的准确率/召回率会增加。