You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Keras的ConvLSTM多分类模型中为各类别设置单独阈值?

解决ConvLSTM多分类模型仅预测少数类别的阈值调整方案

核心思路

softmax输出的是各类别概率分布,默认用argmax()取概率最高的类别作为预测结果,但如果模型对多数类的概率输出始终低于某一阈值,就会导致这些类别无法被选中。手动设置类别阈值的关键是:放弃单一的argmax逻辑,针对每个类别单独设定概率阈值,再根据业务场景(单/多标签)判断样本归属。

具体实现步骤

1. 获取模型的概率输出

不要用已弃用的model.predict_classes(),直接用model.predict()拿到每个样本在9个类别上的完整概率分布:

# test_data为测试集输入数据
probabilities = model.predict(test_data)  # 输出形状:(样本数量, 9)

2. 为每个类别设定阈值

先在验证集上统计每个类别正确样本的概率范围,再针对性设置阈值。比如通过分析验证集数据,得到9个类别的阈值列表:

# 示例阈值,需根据你的验证集实际分布调整
class_thresholds = [0.3, 0.25, 0.4, 0.15, 0.2, 0.35, 0.28, 0.32, 0.22]

如果某类正确样本的概率大多集中在0.3以上,就可以把该类阈值设为0.3;若某类模型学习效果差,可适当降低阈值提升召回率。

3. 基于阈值的预测逻辑

单标签多分类(每个样本仅属于一个类别)

若要求每个样本只能归为一类,即使多个类别满足阈值,也选概率最高且达标的类别;若所有类别都不达标,可选择概率最高的类或标记为未知:

import numpy as np

predictions = []
for prob in probabilities:
    # 筛选出概率≥对应阈值的类别
    valid_classes = np.where(prob >= class_thresholds)[0]
    if len(valid_classes) > 0:
        # 在有效类别里选概率最高的
        best_class = valid_classes[np.argmax(prob[valid_classes])]
    else:
        # 无达标类别时,可选概率最高类或标记为-1(未知)
        best_class = np.argmax(prob)
        # best_class = -1
    predictions.append(best_class)
predictions = np.array(predictions)

多标签多分类(每个样本可属于多个类别)

若允许样本同时属于多个类别,直接输出所有满足阈值的类别即可:

predictions = []
for prob in probabilities:
    pred = np.where(prob >= class_thresholds)[0]
    predictions.append(pred)

4. 验证与调优

用验证集测试调整后的预测逻辑,根据精确率、召回率的变化微调阈值:

  • 某类召回率太低:适当降低该类阈值
  • 某类精确率太低:适当提高该类阈值

额外建议

  • 先排查类别不平衡:如果训练集中某6类样本量极少,仅调阈值效果有限,需先处理类别不平衡(过采样、欠采样、设置类别权重)。
  • 查看混淆矩阵:明确哪些类别被错误分类,分析这些类的概率输出特征,再针对性调参。
  • 尝试温度缩放:如果模型概率输出过于极端(过于自信或不自信),可通过温度缩放调整分布后再设阈值:
temperature = 0.8  # 小于1让概率分布更平缓,大于1更陡峭
scaled_prob = np.exp(np.log(probabilities) / temperature)
scaled_prob = scaled_prob / np.sum(scaled_prob, axis=1, keepdims=True)

内容的提问来源于stack exchange,提问作者Nayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:18:27