pytorch “最佳策略:在模型中设置分类阈值与在预测期间设置分类阈值”

a5g8bdjr  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(169)

我正在处理一个二进制分类任务,想了解将类别阈值纳入模型的最佳实践。具体来说,我想确保模型不仅进行二进制预测,而且还提供对每个预测的置信水平的度量。我正在考虑两种方法:
1.模型中的阈值:将类阈值直接纳入模型架构中,因此它会根据概率是高于还是低于阈值进行二进制预测。

import torch.nn as nn

class CustomBinaryClassifier(nn.Module):
    def __init__(self, in_features, threshold=0.5):
        super(CustomBinaryClassifier, self).__init()
        self.linear = nn.Linear(in_features, 1)
        self.sigmoid = nn.Sigmoid()
        self.threshold = threshold

    def forward(self, x):
        logits = self.linear(x)
        probabilities = self.sigmoid(logits)
        # Apply threshold for class assignment
        classes = (probabilities >= self.threshold).float()
        return classes

# Create an instance of the model with a specified threshold
threshold = 0.5
model = CustomBinaryClassifier(in_features=X.shape[1], threshold=threshold)

字符串
1.作为后处理步骤的阈值:根据模型的原始logits计算类别概率,并应用阈值作为后处理步骤,以确定二元类别分配。

import torch

# Assuming you have a trained model 'model' and input data 'X_test'
untrained_preds = model(X_test)
untrained_preds_probs = torch.sigmoid(untrained_preds)

threshold = 0.5
predicted_classes = (untrained_preds_probs >= threshold).float()


1.每种方法的优点和缺点是什么,我应该在什么时候使用一种方法?另外,如果我在模型中使用阈值,它是否会影响模型的学习过程及其对预测的信心?
1.还有一件事,如果我在模型中包括置信度计算(如概率)(如方法1,即sigmoid),它是否会改变我在训练时计算损失的方式?它是否会使模型更好地估计其预测的置信度并提高其准确性?
我正在寻找关于如何以及何时在二进制分类模型中设置类阈值的实用建议。

2vuwiymt

2vuwiymt1#

你不能在模型中使用阈值,因为它会影响训练。你的损失函数需要一个软输出(来自logits或logits的sigmoid),给出一个硬输出会破坏梯度信号。你应该阅读更多关于二进制交叉熵的工作原理。
在设置阈值方面,这通常是在基于所需指标进行训练后完成的。您的阈值使您能够调整模型的精度/召回率。想象一下将阈值从0扫到1。在0时,您的精度很差(有很多误报),但召回率很好(没有误报)。在1时,情况正好相反。
你应该首先确定什么指标对你的应用程序最重要(精确度、召回率、F1等)。然后,在训练模型之后,扫描验证集上的阈值范围,看看什么值给出了最好的指标。你也可以查看ROC曲线等。

相关问题