模型推理时如何选择合适的决策阈值?说话人识别未知类判定场景
说话人识别开放集阈值设置方案
先修复现有代码逻辑问题
你当前写的for循环存在两个问题:
- 无论判断结果如何都会执行
break,循环仅会执行一次,逻辑等价于直接判断两个概率是否都小于等于0.6,完全不需要循环结构 - 当
k=1时sample_prob[k+1]会触发数组索引越界错误
可以直接简化为对概率特征的直接判断。
可选阈值方案
1. 固定最大概率阈值(最易落地)
思路是判断两个概率的最大值是否达到置信要求,未达到则判定为未知说话人。
阈值校准方法:
- 准备专属校准集,包含你业务场景下的已知说话人测试样本和常见未知说话人样本
- 遍历阈值区间(建议0.5~0.9,步长0.05),分别统计两个指标:
- 漏识率:已知说话人被判定为未知的比例
- 误识率:未知说话人被判定为已知的比例
- 根据你能接受的业务平衡选择阈值,90%精度的二分类说话人模型通常推荐先尝试0.7~0.75的阈值。
修复后代码示例:
import pandas as pd # 阈值可根据校准结果调整 MAX_PROB_THRESHOLD = 0.75 sample_df = pd.DataFrame(list_).transpose() sample_pred = model.predict(sample_df)[0] sample_prob = model.predict_proba(sample_df)[0] if max(sample_prob) < MAX_PROB_THRESHOLD: sample_pred = "unknown speaker"
2. 自适应概率差阈值(抗干扰性更强)
未知说话人输入时,模型对两个已知类的输出概率通常会非常接近(你给出的示例[0.46, 0.54]差值仅为0.08),而已知说话人输入时两个概率差值会明显更大。你可以用两个概率的差值作为动态判断依据。
校准方法和固定阈值一致,通常差值阈值可选0.15~0.3区间。
代码示例:
import pandas as pd # 差值阈值可根据校准结果调整 PROB_DIFF_THRESHOLD = 0.2 sample_df = pd.DataFrame(list_).transpose() sample_pred = model.predict(sample_df)[0] sample_prob = model.predict_proba(sample_df)[0] prob_diff = abs(sample_prob[0] - sample_prob[1]) if prob_diff < PROB_DIFF_THRESHOLD: sample_pred = "unknown speaker"
3. 组合阈值(高精度场景适用)
如果需要同时降低漏识和误识率,可以组合上述两个判断条件,满足任意一个就判定为未知:
import pandas as pd MAX_PROB_THRESHOLD = 0.7 PROB_DIFF_THRESHOLD = 0.15 sample_df = pd.DataFrame(list_).transpose() sample_pred = model.predict(sample_df)[0] sample_prob = model.predict_proba(sample_df)[0] max_prob = max(sample_prob) prob_diff = abs(sample_prob[0] - sample_prob[1]) if max_prob < MAX_PROB_THRESHOLD or prob_diff < PROB_DIFF_THRESHOLD: sample_pred = "unknown speaker"
注意:所有阈值都没有通用最优值,必须结合你的业务场景校准。如果不能接受把已知说话人判为未知,就适当降低阈值;如果不能接受把未知说话人判为已知,就适当提高阈值。
内容的提问来源于stack exchange,提问作者lmarenast
相关产品推荐
相关产品推荐

