【问题标题】:Determine the best classification threshold value for deep learning model确定深度学习模型的最佳分类阈值
【发布时间】:2020-10-04 00:59:04
【问题描述】:

如何确定深度学习模型的最佳阈值。我正在使用 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])

【问题讨论】:

  • 什么阈值?
  • @Proko 分类阈值或决策阈值,例如,高于该阈值的值表示“垃圾邮件”;下面的值表示“不是垃圾邮件”。

标签: python deep-learning conv-neural-network threshold image-thresholding


【解决方案1】:

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

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

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

更多示例请查看When is precision more important over recall?

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

【讨论】:

    【解决方案2】:

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

    1 级 = 预测 ; 0 级 = 预测 => 0.5

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

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

    请参阅,ML 阈值是针对特定问题的,必须进行微调Read a short article about it here

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-07
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2020-03-18
      • 2017-10-22
      • 2021-07-16
      相关资源
      最近更新 更多