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

TensorFlow二元分类准确率近100%,但邮件AI/人类撰写预测完全失准

问题分析与解决方案

核心问题:Tokenizer复用错误

你的模型训练和预测阶段使用了完全不同的Tokenizer,这是导致预测结果完全反转的根本原因:

  • 训练时,Tokenizer基于1400封邮件的完整数据集构建词汇表,模型学习到的是这套词汇表对应的语义映射关系。
  • 预测时,你重新初始化Tokenizer并仅在单条输入邮件上调用fit_on_texts,生成的全新词汇表和训练时的完全不匹配。模型接收到的序列编码毫无意义,自然输出错误结果。

修复步骤

1. 训练时保存Tokenizer

在训练函数中,将训练好的Tokenizer用pickle保存,确保预测时复用同一套词汇表:

import pickle

def train_aiVShuman_email():
    # ... 原有训练代码 ...
    
    # 保存Tokenizer
    with open('Keras Models/tokenizer.pkl', 'wb') as f:
        pickle.dump(tokenizer, f)
    
    model.save('Keras Models/aiVShuman.keras')
    print("aiVShuman model and tokenizer saved Successfully")
    return model, tokenizer

2. 预测时加载训练好的Tokenizer

替换predict函数中重新创建Tokenizer的代码,加载保存好的Tokenizer:

import pickle

# 加载模型和Tokenizer
model = load_model('Keras Models/aiVShuman.keras')
with open('Keras Models/tokenizer.pkl', 'rb') as f:
    tokenizer = pickle.load(f)

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json
    message = data['message']
    
    # 处理HTML转义
    message = html.unescape(message)
    message = [message]
    
    # 使用训练好的Tokenizer编码,禁止重新fit
    sequence = tokenizer.texts_to_sequences(message)
    # 复用训练时的序列长度,避免硬编码
    max_len = model.layers[0].input_length
    padded_sequence = pad_sequences(sequence, maxlen=max_len, padding='post')
    
    # 执行预测
    prediction = model.predict(padded_sequence)
    is_ai_message = prediction[0][0] > 0.5  # 回归二分类默认阈值0.5,后续可按需调整
    
    if is_ai_message:
        return jsonify({
            "status": "success", 
            "result": "AI生成邮件",
            "prediction_score": float(prediction[0][0]),
            "email_content": message[0]
        })
    else:
        return jsonify({
            "status": "success", 
            "result": "人类撰写邮件",
            "prediction_score": float(prediction[0][0]),
            "email_content": message[0]
        })

其他验证要点

  1. 标签一致性检查:确认训练时AI邮件标注为1、人类邮件标注为0的规则是否正确。可以在训练后打印验证集混淆矩阵,验证模型在训练阶段的分类逻辑:
from sklearn.metrics import confusion_matrix

y_pred = model.predict(X_test) > 0.5
print(confusion_matrix(y_test, y_pred))

如果混淆矩阵显示验证集分类正确,问题完全源于Tokenizer复用错误;如果验证集也出现反转,可能是标签标注逻辑颠倒。

  1. 预处理一致性:确保预测时的文本处理(如HTML转义)和训练时完全一致。如果训练数据是纯文本,而预测数据额外做了转义,会引入不必要的分布差异。

  2. 阈值合理性:默认0.5是sigmoid输出的标准二分类阈值,你设置的0.4可能导致误判率上升,建议先回归0.5,再根据验证集的精确率/召回率调整。

内容的提问来源于stack exchange,提问作者Chibuike S. Eze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:05:04