如何在LSTM模型中获取邮件垃圾/非垃圾分类的预测结果?
邮件垃圾分类模型:新文本预测与结果解析
Hey there! Let's tackle your two main questions about using your trained LSTM model for spam/ham classification, step by step.
1. 理解model.predict()输出的二维数组含义
你看到的array([[9.9973804e-01, 2.6198191e-04], ...], dtype=float32)是模型对每个输入样本输出的类别概率分布:
- 每个子数组的两个元素,分别对应模型预测该样本属于类别0、类别1的概率(两个值的总和接近1)
- 结合你提供的评估结果来看:
support: [980 135]说明测试集中类别0有980个样本,类别1有135个样本- 这类任务里通常数量多的是正常邮件(ham),数量少的是垃圾邮件(spam),所以这里类别0对应ham,类别1对应spam
2. 把预测结果转换为"spam"/"ham"标识
有两种常用方法将概率数组转为明确的类别标识,和你评估代码的逻辑匹配:
方法一:用round()取整(和评估代码一致)
当类别0的概率>0.5时,round()会得到0;类别1概率>0.5时得到1,再映射为文字:
import numpy as np # 假设predicted是model.predict()的输出 predicted = model.predict(test_data) # 把概率转成0/1类别标签 predicted_labels = predicted.round().astype(int) # 映射为spam/ham label_map = {0: "ham", 1: "spam"} predicted_text = [label_map[label[0]] for label in predicted_labels]
方法二:用argmax取概率最大的类别
如果需要更灵活的阈值逻辑,直接取概率最高的类别索引即可:
# 取每个样本概率最大的类别索引 predicted_labels = np.argmax(predicted, axis=1) # 映射为文字 label_map = {0: "ham", 1: "spam"} predicted_text = [label_map[label] for label in predicted_labels]
从你的模型输出来看,两种方法结果一致——因为模型对两类的概率区分度很高(比如第一个样本99.97%是ham,仅0.03%是spam)。
3. 输入新邮件文本并得到分类结果
新邮件必须和训练数据做完全一致的预处理,具体步骤如下:
步骤1:复用训练时的预处理流程
假设你训练时用了Tokenizer和序列补全,注意必须用训练时保存的tokenizer,不能重新创建:
from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences # 如果之前没保存tokenizer,训练时要执行:tokenizer.save('tokenizer.json') # 加载tokenizer的方法: # import json # from tensorflow.keras.preprocessing.text import tokenizer_from_json # with open('tokenizer.json') as f: # tokenizer_data = json.load(f) # tokenizer = tokenizer_from_json(tokenizer_data) # 预处理函数:和训练逻辑对齐 def preprocess_new_email(text, tokenizer, max_seq_length): # 转换为序列 seq = tokenizer.texts_to_sequences([text]) # 补全到训练时的序列长度(和test_data的长度一致) padded_seq = pad_sequences(seq, maxlen=max_seq_length) return padded_seq # 获取训练时的序列长度 max_seq_length = test_data.shape[1]
步骤2:预测并输出结果
# 新邮件示例 new_email = "Win a free iPhone now! Click the link below to claim your prize." # 预处理新邮件 processed_email = preprocess_new_email(new_email, tokenizer, max_seq_length) # 预测概率 predicted_prob = model.predict(processed_email) # 转换为spam/ham标识 predicted_label = np.argmax(predicted_prob, axis=1)[0] label_map = {0: "ham", 1: "spam"} result = label_map[predicted_label] print(f"This email is: {result}") print(f"Probability breakdown - ham: {predicted_prob[0][0]:.4f}, spam: {predicted_prob[0][1]:.4f}")
附:你提供的模型评估代码与结果
评估代码
import sklearn from sklearn.metrics import precision_recall_fscore_support as score # prediction on test data predicted_blstm=model.predict(test_data) predicted_blstm # model evaluation precision, recall, fscore, support = score(labels_test, predicted_blstm.round()) print('precision: {}'.format(precision)) print('recall: {}'.format(recall)) print('fscore: {}'.format(fscore)) print('support: {}'.format(support)) print("############################") print(sklearn.metrics.classification_report(labels_test, predicted_blstm.round()))
运行结果
precision: [0.98782961 0.95348837] recall: [0.99387755 0.91111111] fscore: [0.99084435 0.93181818] support: [980 135] ############################ precision recall f1-score support 0 0.99 0.99 0.99 980 1 0.95 0.91 0.93 135 micro avg 0.98 0.98 0.98 1115 macro avg 0.97 0.95 0.96 1115 weighted avg 0.98 0.98 0.98 1115 samples avg 0.98 0.98 0.98 1115
内容的提问来源于stack exchange,提问作者Aster Lin
相关产品推荐
相关产品推荐

