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] })
其他验证要点
- 标签一致性检查:确认训练时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复用错误;如果验证集也出现反转,可能是标签标注逻辑颠倒。
预处理一致性:确保预测时的文本处理(如HTML转义)和训练时完全一致。如果训练数据是纯文本,而预测数据额外做了转义,会引入不必要的分布差异。
阈值合理性:默认0.5是sigmoid输出的标准二分类阈值,你设置的0.4可能导致误判率上升,建议先回归0.5,再根据验证集的精确率/召回率调整。
内容的提问来源于stack exchange,提问作者Chibuike S. Eze
相关产品推荐
相关产品推荐

