确定深度学习模型的最佳分类阈值

Determine the best classification threshold value for deep learning model

如何确定深度学习模型的最佳阈值。我正在使用 CNN 预测癫痫发作。我想确定我的深度学习模型的最佳阈值以获得最佳结果。

我尝试了 2 周多的时间来寻找我能做到的。

如有任何帮助,我们将不胜感激。

代码

history=model.fit_generator(generate_arrays_for_training(indexPat, filesPath, end=75), #end=75),
                                validation_data=generate_arrays_for_training(indexPat, filesPath, start=75),#start=75),
                                steps_per_epoch=int((len(filesPath)-int(len(filesPath)/100*25))),#*25), 
                                validation_steps=int((len(filesPath)-int(len(filesPath)/100*75))),#*75),
                                verbose=2,
                                epochs=50, max_queue_size=2, shuffle=True, callbacks=[callback,call])

一般来说,选择正确的分类阈值取决于用例。您应该记住,选择阈值不是超参数调整的一部分。分类阈值的值极大地影响了模型 训练后的行为。

如果增加它,您希望模型对预测非常确定,这意味着您将过滤掉误报 - 您将以 精度 为目标。当您的模型是关键任务管道的一部分时,可能会出现这种情况,其中基于模型的积极输出做出的决策代价高昂(在金钱、时间、人力资源、计算资源等方面......)

如果你减少它,你的模型会说更多的例子是积极的,这将使你能够探索更多可能积极的例子(你的目标是 recall。这很重要假阴性是灾难性的,例如在医疗案例中(你宁愿检查低概率患者是否患有癌症,而不是忽视他,然后发现他确实生病了)

更多示例请参见When is precision more important over recall?

现在,在召回率和准确率之间做出选择是一种权衡,您必须根据自己的情况进行选择。帮助您实现这一目标的两个工具是 ROC 和召回精度曲线 How to Use ROC Curves and Precision-Recall Curves for Classification in Python,它们指示模型如何根据分类阈值处理误报和漏报

许多 ML 算法能够预测 class 成员的分数,在将其绘制到 class 标签之前需要对其进行解释。您可以通过使用阈值(例如 0.5)来实现这一点,其中大于等于阈值的值映射到一个 class,其余值映射到另一个 class.

Class 1 = 预测 < 0.5; Class 0 = 预测 => 0.5

为您遇到的问题找到最佳阈值至关重要,而不仅仅是假设一个 class化阈值,例如0.5;

为什么?对于具有严重 class 不平衡的 class 化问题,默认阈值通常会导致性能很差。

请参阅,ML 阈值是 problem-specific,并且必须是 fine-tunedRead a short article about it here

为您的深度学习模型确定最佳阈值以获得最佳结果的最佳方法之一是调整用于将概率映射到 class 的阈值。

CNN 的最佳阈值可以直接使用 ROC 曲线和 Precision-Recall 曲线计算。在某些情况下,您可以使用网格搜索来 fine-tune 阈值并找到最佳值。

下面的代码将帮助您选中能提供最佳结果的选项。 GitHub link:

from deepchecks.checks.performance import PerformanceReport
check = PerformanceReport()
check.run(ds, clf)