如何解决计算分类模型预测的概率
我有一个分类任务。训练数据有 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 稍微领先,因此我们知道预测效果很好。但是,我们不确定这些数字表示或代表什么。
解决方法
BertForSequenceClassification
返回 logits,即归一化前的分类分数。您可以通过调用 F.softmax(output,dim=-1)
来标准化分数,其中 torch.nn.functional
被导入为 F
。
由于有数千个标签,归一化可能代价高昂,而且当您只对 argmax 感兴趣时不需要它。这可能就是模型只返回原始分数的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。