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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:27:41