【问题标题】:Calculating Probability of a Classification Model Prediction计算分类模型预测的概率
【发布时间】:2021-05-31 22:40:29
【问题描述】:

我有一个分类任务。训练数据有 50 个不同的标签。客户想要区分低概率预测,这意味着我必须根据模型的概率(确定性?)将一些测试数据分类为Unclassified / Other

当我测试我的代码时,预测结果是一个 numpy 数组(我使用不同的模型,这是一个预训练的 BertTransformer)。预测数组不包含 Keras predict_proba() 方法中的概率。这些是预训练的BertTransformer模型的预测方法生成的数字。

[[-1.7862008  -0.7037363   0.09885322  1.5318055   2.1137428  -0.2216074
   0.18905772 -0.32575375  1.0748093  -0.06001111  0.01083148  0.47495762
   0.27160102  0.13852511 -0.68440574  0.6773654  -2.2712054  -0.2864312
  -0.8428862  -2.1132915  -1.0157436  -1.0340284  -0.35126117 -1.0333195
   9.149789   -0.21288703  0.11455813 -0.32903734  0.10503325 -0.3004114
  -1.3854568  -0.01692022 -0.4388664  -0.42163098 -0.09182278 -0.28269592
  -0.33082992 -1.147654   -0.6703184   0.33038092 -0.50087476  1.1643585
   0.96983343  1.3400391   1.0692116  -0.7623776  -0.6083422  -0.91371405
   0.10002492]]

我使用numpy.argmax() 来识别正确的标签。预测工作得很好。但是,由于这些不是概率,因此我无法将最佳结果与阈值进行比较。

我的问题是,如何定义阈值(例如 0.6),然后比较 BertTransformer 预测数组的 argmax() 元素的概率,以便我可以将预测分类为“其他”,如果概率是小于阈值?

编辑 1:

我们使用了 2 种不同的模型。一个是 Keras,另一个是 BertTransformer。我们在 Keras 中没有问题,因为它给出了概率,所以我跳过了 Keras 模型。

Bert 模型经过预训练。以下是它的生成方式:

def model(self, data):
        number_of_categories = len(data['encoded_categories'].unique())
        model = BertForSequenceClassification.from_pretrained(
            "dbmdz/bert-base-turkish-128k-uncased",
            num_labels=number_of_categories,
            output_attentions=False,
            output_hidden_states=False,
        )

        # model.cuda()

        return model

上面给出的输出是model.predict() 方法的结果。我们比较了两个模型,Bert 稍微领先,因此我们知道预测效果很好。但是,我们不确定这些数字代表什么。

这里是Bert documentation

【问题讨论】:

  • 您实际上是在问它是否可能,或者它是否是一个有效/好主意?如果是前者,那么简单的数字操作not怎么可能呢?您可能会在Tensorflow & Keras prediction threshold 中找到自己答案的最后一部分。
  • @desertnaut 谢谢。您提供的示例是关于 Keras 的。我有两个模型:一个是 Keras,另一个是 Bert。我已经在使用相同的方法(predmax
  • 这在您的问题中并不明显 - 请相应地编辑和更新以澄清这些重要细节;这些数字是如何产生的也是必要的。如果您没有概率输出,我们如何谈论任何阈值?
  • @desertnaut 已编辑。这就是我想问的,实际上。我不知道这些数字代表什么,也许它们是另一种概率。然后,问题可能会变成“是否可能”而不是“有效/好主意”。
  • 我的意思是 - 你的 BertTransformer 模型到底是什么?你确定它是用来分类的吗?请至少发布一些指向其文档或其他内容的链接。

标签: machine-learning deep-learning classification bert-language-model multiclass-classification


【解决方案1】:

BertForSequenceClassification 返回 logits,即归一化前的分类分数。您可以通过调用F.softmax(output, dim=-1) 来标准化分数,其中torch.nn.functional 被导入为F

由于有数千个标签,标准化的成本可能很高,而且当您只对 argmax 感兴趣时就不需要它。这可能就是模型只返回原始分数的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2019-09-16
    • 2018-10-12
    • 2020-06-09
    • 2011-02-15
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多