如何获取Keras-LSTM模型对Quora问答对的二分类预测结果?
解决Quora问答对重复检测的二分类输出问题
嘿,刚好碰到过类似的场景,我来给你捋清楚怎么把模型输出的概率转成0/1的二分类结果!
首先,你现在用sigmoid激活函数输出的是0到1之间的概率值(代表属于“重复”类别1的概率),这完全没问题——训练阶段就该用这个概率来计算损失(比如BinaryCrossentropy),因为梯度需要连续值才能正常传播。要得到0或1的分类结果,只需要在预测阶段加一步简单的阈值判断就行,具体操作如下:
一、核心思路:设置分类阈值
最常用的阈值是0.5:
- 如果预测概率 >= 0.5,判定为重复(类别1)
- 如果预测概率 < 0.5,判定为不重复(类别0)
当然你也可以根据业务需求调整阈值(比如想减少误判就调高阈值),但0.5是二分类任务的默认选择。
二、代码实现
结合你给出的LSTM模型片段,我给你补全关键部分的处理:
1. 模型训练阶段(保持不变)
你的现有逻辑没问题,训练时还是要输出概率用于损失计算,注意二分类的输出维度应该是1:
merged = RNN(EMBED_HIDDEN_SIZE)(merged) merged = layers.Dropout(dropoutp)(merged) # 二分类任务的Dense层输出维度设为1,sigmoid输出0-1的概率 preds = layers.Dense(1, activation='sigmoid')(merged) model = Model([questiona, questionb], preds) # 假设输入是两个待对比的问句 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
⚠️ 这里提醒下:如果你的answer_size之前设的不是1,记得改成1,因为二分类只需要单个输出节点对应概率值。
2. 预测阶段(转换为0/1标签)
当你用训练好的模型做预测时,把输出的概率转成整数标签:
import numpy as np # 假设你有测试数据test_questiona, test_questionb pred_probs = model.predict([test_questiona, test_questionb]) # 方法1:用round直接四舍五入(等价于0.5阈值) pred_labels = np.round(pred_probs).astype(int) # 方法2:手动设置阈值,更灵活(比如想降低误判率可以调到0.6) threshold = 0.5 pred_labels = (pred_probs >= threshold).astype(int)
这样pred_labels就是你要的0或1的二分类结果了,直接和真实标签y对比就能计算准确率、召回率这些指标。
三、额外提醒
- 不要在模型内部直接加硬转换(比如用
tf.cast(preds >=0.5, int)作为输出),这样训练时会丢失梯度,模型根本学不起来! - 如果需要在训练过程中查看分类效果,可以在每个epoch结束后,对验证集的预测概率做同样的转换,再计算准确率。
内容的提问来源于stack exchange,提问作者Feby Inka
相关产品推荐
相关产品推荐

