垃圾邮件分类测试异常:输入均被判定为垃圾邮件的解决办法
解决垃圾邮件分类全识别为垃圾邮件的问题
核心代码错误修正
你的测试代码存在几个关键问题,直接导致无论输入什么都被判定为垃圾邮件:
未正确处理用户输入
当前测试代码完全没用到输入的user_input,反而直接复用了测试集的X_test_padded,相当于每次都在对整个测试集做预测,而非用户输入的内容。必须将用户输入经过和训练数据一致的预处理流程:# 替换原有测试代码 user_input = input("请输入邮件内容: ") # 按训练时的流程处理输入:分词编码、填充 user_encoded = tokenizer.texts_to_sequences([user_input]) user_padded = pad_sequences(user_encoded, maxlen=max_len)预测结果判断逻辑错误
使用.all() > 0.5会检查所有预测结果是否都大于0.5,而用户输入是单个样本,应该针对单个预测值做判断:# 修正判断逻辑 prediction = model.predict(user_padded)[0][0] if prediction > 0.5: print(f"[{user_input}] is spam") else: print(f"[{user_input}] is non-spam")注:
model.predict返回二维数组,单个样本需通过[0][0]提取对应概率值。移除冗余代码
user_data = [[]]属于无用变量,直接删除即可。
其他排查方向
如果修正后问题仍存在,需检查以下内容:
- 训练数据平衡性:若训练集中垃圾邮件占比过高,模型会偏向预测垃圾邮件。检查
y_train中正负样本比例,必要时采用过采样/欠采样,或调整损失函数权重。 - 模型训练效果:查看训练时的
val_acc和测试集准确率,若准确率极低,说明模型未学到有效特征。可尝试增加训练轮数、调整模型结构(如换成LSTM、提升Embedding维度)、优化文本预处理流程(如更细致的文本清洗)。 - Tokenizer一致性:确保测试时使用的
tokenizer与训练时完全相同(比如训练后保存tokenizer,测试时加载),否则编码规则不一致会导致输入特征无效。
内容的提问来源于stack exchange,提问作者hstuk
相关产品推荐
相关产品推荐

