AI开发:逻辑回归 - 实战演练- 垃圾邮件的识别(二)

接上一篇AI开发:逻辑回归 - 实战演练- 垃圾邮件的识别(一)

new_email 无论为什么文本,识别结果几乎都是垃圾邮件,因此我们需要对源码的逻辑进行梳理一下:

在代码中,new_email 无论赋值为何内容都被识别为垃圾邮件(spam),很可能是以下原因之一导致的:

1. 模型训练数据偏差

  • 如果训练数据中垃圾邮件的数量占绝大多数,模型可能会倾向于将所有输入都分类为垃圾邮件。这种问题叫 类别不平衡
  • 解决方法:
    • 平衡数据集:增加非垃圾邮件的样本数量或减少垃圾邮件的样本数量。
    • 使用加权损失函数:在模型训练中对少数类赋予更高的权重。
    • 使用过采样(如 SMOTE)或欠采样技术调整数据分布。

2. 决策边界问题

  • 如果模型的决策边界定义不明确(比如分类器的阈值设置过低或过高),可能会导致模型将所有样本错误分类为某一类别。
  • 解决方法:
    • 检查分类器的阈值(例如,对于逻辑回归,默认阈值为 0.5),并调整为更合理的值。
    • 可视化模型的概率分布,分析垃圾邮件和非垃圾邮件的分类结果。

3. 特征处理问题

  • 如果 new_email 的输入特征没有正确提取(例如特征全为零或异常值),分类器可能会默认分类为垃圾邮件。
  • 解决方法:
    • 检查 new_email 的特征提取过程,确保提取后的特征与训练集特征保持一致。
    • 验证输入数据是否经过与训练数据相同的预处理步骤(如分词、TF-IDF 向量化等)。

4. 过拟合问题

  • 如果模型在训练过程中过拟合,它可能会将所有未知输入归类为训练集中出现频率较高的类别。
  • 解决方法:
    • 重新训练模型,使用正则化技术(如 L1 或 L2)。
    • 增加训练数据的多样性,避免模型记住训练集中的特定模式。

5. 代码逻辑问题

  • 检查预测逻辑是否正确,比如是否意外硬编码了返回值。
  • 示例问题:
    if predicted_label == 1:return "Spam"
    else:return "Spam"  # 错误逻辑,导致所有都被识别为垃圾邮件
    

6. 模型性能问题

  • 如果模型本身性能很差,可能是因为特征不足或算法选择不当,导致分类效果失败。
  • 解决方法:
    • 评估模型性能(如查看混淆矩阵、F1 分数)。
    • 尝试使用更强的分类器(如随机森林、SVM 或深度学习模型)。

对代码的检查建议

  1. 打印输入特征: 打印出 new_email 的特征向量,检查特征是否异常。

  2. 验证模型输出: 检查模型的概率预测输出(如 predict_proba 方法),确认阈值是否设置合理。

  3. 调试代码: 确认是否存在逻辑错误,特别是在预处理和分类阶段。

因此我们调试一个单独的测试单元:

基于之前的代码,结合分析问题的原因,进行修改以确保模型能够正常工作并准确分类新邮件。以下是一些改进:


修改代码的核心点

  1. 处理类别不平衡
    使用 class_weight='balanced' 或对数据进行平衡处理。

  2. 检查输入特征
    确保 new_email 的特征提取与训练数据一致。

  3. 调整决策阈值
    添加概率输出,并允许用户调整分类阈值。

  4. 增加性能调试信息
    输出模型的预测概率和特征向量,方便检查。


修订后的代码测试单元

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix# 示例数据
data = {'email': ["Win a free iPhone", "Your account is locked, click here", "Meeting tomorrow at 10 AM", "How are you doing today?"],'label': [1, 1, 0, 0]
}
data_df = pd.DataFrame(data)# 特征提取
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(data_df['email'])
y = data_df['label']# 训练测试集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 处理类别不平衡
model = LogisticRegression(class_weight='balanced')  # 添加 class_weight
model.fit(X_train, y_train)# 测试模型
y_pred = model.predict(X_test)
print("分类报告:\n", classification_report(y_test, y_pred))# 测试混淆矩阵
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))# 新邮件分类
new_email = "Meeting schedule confirmed"  # 替换为任何测试字符串
new_email_features = vectorizer.transform([new_email])
predicted_prob = model.predict_proba(new_email_features)[0]  # 获取概率
predicted_label = (predicted_prob[1] > 0.5).astype(int)  # 自定义阈值,默认 0.5print(f"预测概率:{predicted_prob}")
print(f"预测结果:{'Spam' if predicted_label == 1 else 'Not Spam'}")

修改内容说明

  1. 类别不平衡处理:

    • LogisticRegression 中增加 class_weight='balanced',让模型在训练时对垃圾邮件和非垃圾邮件赋予相同权重。
  2. 可调阈值:

    • 默认设置阈值为 0.5,但可以修改为更低或更高以优化精度和召回率。
  3. 模型输出可视化:

    • 添加 predict_proba 输出,显示垃圾邮件和非垃圾邮件的概率,便于调试。
  4. 新增输入检查:

    • 确保 new_email 特征提取与训练数据一致。

测试案例

试试将 new_email 替换为以下字符串,观察输出:

  • "Win a free vacation now!"(垃圾邮件)
  • "Lunch meeting tomorrow at noon"(非垃圾邮件)
  • "Click here to reset your password"(垃圾邮件)

如果模型仍然总是输出垃圾邮件,请注意以下的关键点:

  1. 数据集是否过于不平衡。
  2. classification_report 的输出。
  3. predict_proba 的详细概率分布。

这样不断调试,我们可以进一步优化代码。

以下是改进了处理流程、模型平衡和调试信息的展示:


改进内容

  1. 处理类别不平衡

    • 使用 class_weight='balanced' 或直接进行数据采样平衡,避免模型倾向于输出多数类。
    • 打印垃圾邮件和正常邮件的分布以确保平衡性。
  2. 特征优化

    • 增加 TfidfVectorizer 的参数调整,如 max_featuresngram_range,以优化特征表达。
  3. 可调阈值

    • 使用概率预测,支持调整垃圾邮件分类的阈值。
  4. 增加调试信息

    • 输出分类报告和混淆矩阵,用于评估模型性能。
  5. 文件路径和异常处理

    • 添加对文件夹路径检查的提示和文件读取异常的处理。

在第一篇文章基础上改进后的全部代码

import os
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import numpy as np# 步骤 1:读取文件内容
def read_files(folder_path):if not os.path.exists(folder_path):raise FileNotFoundError(f"文件夹 {folder_path} 不存在,请检查路径!")texts = []for filename in os.listdir(folder_path):file_path = os.path.join(folder_path, filename)if os.path.isfile(file_path):try:with open(file_path, 'r', encoding='utf-8') as file:texts.append(file.read())except Exception as e:print(f"无法读取文件 {filename}:{e}")return texts# 假设 A 文件夹为垃圾邮件文件夹,B 文件夹为正常邮件文件夹
folder_A = "path_to_folder_A"  # 垃圾邮件文件夹路径
folder_B = "path_to_folder_B"  # 正常邮件文件夹路径# 读取文件内容
spam_texts = read_files(folder_A)
ham_texts = read_files(folder_B)# 数据和标签
texts = spam_texts + ham_texts
labels = [1] * len(spam_texts) + [0] * len(ham_texts)print(f"垃圾邮件数量: {len(spam_texts)}, 正常邮件数量: {len(ham_texts)}")# 特征提取
vectorizer = TfidfVectorizer(stop_words='english', max_features=1000, ngram_range=(1, 2))
X = vectorizer.fit_transform(texts)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42)# 步骤 2:处理类别不平衡
model = LogisticRegression(class_weight='balanced', random_state=42)
model.fit(X_train, y_train)# 步骤 3:评估模型
y_pred = model.predict(X_test)
print("分类报告:\n", classification_report(y_test, y_pred))
print("混淆矩阵:\n", confusion_matrix(y_test, y_pred))# 步骤 4:判定新的邮件是否是垃圾邮件
def predict_spam_or_ham(new_email_text, threshold=0.5):new_email_vec = vectorizer.transform([new_email_text])predicted_prob = model.predict_proba(new_email_vec)[0]print(f"预测概率:{predicted_prob}")return "垃圾邮件" if predicted_prob[1] > threshold else "正常邮件"# 示例:输入一个新的邮件文本进行预测
new_email = "Congratulations! You've won a free vacation. Claim now!"
result = predict_spam_or_ham(new_email)
print(f"新邮件预测结果: {result}")# 可尝试调整分类阈值
adjusted_threshold = 0.6
result_adjusted = predict_spam_or_ham(new_email, threshold=adjusted_threshold)
print(f"新邮件预测结果 (调整阈值 {adjusted_threshold}): {result_adjusted}")

改进点详细说明

  1. 类别平衡

    • class_weight='balanced' 用于在数据分布不均衡时平衡类别权重。
    • 打印垃圾邮件和正常邮件数量,及时发现数据分布问题。
  2. 特征优化

    • max_features=1000 限制特征数量,避免高维稀疏特征对模型性能的影响。
    • ngram_range=(1, 2) 增加特征的上下文表达能力。
  3. 分类阈值调整

    • 提供 threshold 参数以灵活调整垃圾邮件判定的概率阈值,适应不同应用场景。
  4. 调试信息

    • classification_reportconfusion_matrix 帮助评估模型的准确率、召回率和精确率。
  5. 文件路径检查和异常处理

    • 在读取文件时检查路径合法性,并捕获异常,防止单个文件导致整个流程中断。

测试步骤

  1. 将垃圾邮件放入 folder_A,正常邮件放入 folder_B
  2. 调整特征提取参数,如 max_featuresngram_range
  3. 替换 new_email 测试不同邮件内容,并观察概率和分类结果。

需要注意的是,这时候还是需要再微调,因为运行程序后你会发现识别还是不准确,在不断调整后,

将 adjusted_threshold = 0.6 改成 adjusted_threshold = 0.555,最后用如下文本分别测试:

# 示例:输入一个新的邮件文本进行预测
#new_email = "Congratulations! You've won a free vacation. Claim now!"
#new_email = "hi Dad , Will you go to China?"
new_email = "Congratulations! You won a chance to travel for free. Claim now!"
new_email = "This is a notice of school opening"
result = predict_spam_or_ham(new_email)
print(f"新邮件预测结果: {result}")# 可尝试调整分类阈值
adjusted_threshold = 0.555
result_adjusted = predict_spam_or_ham(new_email, threshold=adjusted_threshold)
print(f"新邮件预测结果 (调整阈值 {adjusted_threshold}): {result_adjusted}")

 以下结果清晰展示了成功识别了不同的文本。

当然,因为样本数据量很少,整个模型的识别率还是很低,因此需要不断累计足够的样本,才能更精准地识别出垃圾邮件。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九、Spring Boot集成Spring Security之授权概述

文章目录 往期回顾:Spring Boot集成Spring Security专栏及各章节快捷入口前言一、授权概述二、用户权限三、用户授权流程三、Spring Security授权方式1、请求级别授权2、方法级别授权 往期回顾:Spring Boot集成Spring Security专栏及各章节快捷入口 Spr…

diff算法

vue的diff算法详解 vue: diff 算法是一种通过同层的树节点进行比较的高效算法 其有两个特点: 比较只会在同层级进行, 不会跨层级比较 在diff比较的过程中,循环从两边向中间比较 diff 算法在很多场景下都有应用,在 vue 中&…

Git命令大全(超详细)

Git 是一个分布式版本控制系统,用于跟踪计算机文件的更改,并协调多个用户之间的工作。下面是一份较为详细的 Git 命令大全,涵盖了从初始化仓库到日常使用中常见的操作。 1. 初始化与配置 设置用户信息: git config --global user.name &quo…

【Vue3】main.js

【Vue3】main.js 创建Vue应用实例引入并配置路由配置状态管理挂载应用全局属性与方法使用其他插件 在Vue 3项目中,main.js 文件是整个应用的入口点。 它负责初始化Vue实例、配置全局选项、注册全局组件、引入插件以及挂载Vue实例到DOM上。 通过 main.js,…

Scratch游戏推荐 | 星际前线:帝国逆袭——揭开帝国野心,挑战星际极限!

今天推荐一款充满科幻与冒险元素的Scratch作品——《星际前线:帝国逆袭》!由theChAOTiC制作,这款游戏让你踏入危险的星际前线,与暴虐的Terran帝国展开激烈对抗。在这里,你将探索未知的星域,击败强大的Boss&…

【语音识别】Zipformer

Zipformer 是kaldi 团队于2024研发的序列建模模型。相比较于 Conformer、Squeezeformer、E-Branchformer等主流 ASR 模型,Zipformer 具有效果更好、计算更快、更省内存等优点。并在 LibriSpeech、Aishell-1 和 WenetSpeech 等常用数据集上取得了当时最好的 ASR 结果…

《Vue零基础入门教程》第十五课:样式绑定

往期内容 《Vue零基础入门教程》第六课:基本选项 《Vue零基础入门教程》第八课:模板语法 《Vue零基础入门教程》第九课:插值语法细节 《Vue零基础入门教程》第十课:属性绑定指令 《Vue零基础入门教程》第十一课:事…

Docker的常用的容器隔离机制简介

一、Namespace Linux Namespace是Linux内核提供的一种机制,它用于隔离不同进程的资源视图,使得每个进程都拥有独立的资源空间,从而实现进程之间的隔离和资源管理。通过使用Namespace,可以在一个物理主机上创建多个独立的虚拟环境,每个环境都有自己的进程、文件系统、网络…

buuctf-[SUCTF 2019]EasySQL 1解题记录

把你的旗帜给我,我会告诉你这面旗帜是对的。 堆叠注入查询数据库 1; show databases; ​ 查询表名 1; show tables; 获取flag 1;set sql_modepipes_as_concat;select 1

云原生周刊:Kubernetes 和 Docker 的对比

开源项目推荐 Dokploy Dokploy 是一个功能强大的开源平台,为开发者提供与 Vercel、Netlify 和 Heroku 类似的全栈部署与托管体验。它支持现代化的开发工作流,提供快速、可靠的部署服务,涵盖前端、后端和全栈应用。 Dokploy 的开源特性让开…

整数benders分解算法

整数Benders分解算法是一种用于解决混合整数规划问题的算法,由Jacques F. Benders在1962年首次提出。这种算法特别适用于那些包含连续变量和整数变量的极值问题,即混合整数规划问题(MIP)。在实际应用中,它不仅局限于MI…

Git的基本使用操作

文章目录 Git 全局配置基本操作Git 常用命令版本回退根据版本号回滚分支远端分支 🏡作者主页:点击! 🤖Git专栏:点击! ⏰️创作时间:2024年12月1日12点50分 Git 全局配置 虽然说是全局配置&am…

飞凌嵌入式受邀亮相OpenHarmony人才生态大会2024

2024年11月27日,OpenHarmony人才生态大会2024在武汉洲际酒店举行。在这场汇聚了行业精英、技术大咖及生态伙伴的年度盛会上,飞凌嵌入式作为OpenHarmony社区的重要成员受邀出席,并展示了其在OpenHarmony 4.1系统适配方面的最新成果。 在大会的…

45 基于单片机的信号选择与温度变化

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DS18B20检测温度,通过三种LED灯代表不同状态。 采用DAC0832显示信号脉冲,通过8位数码管显示温度。 信号脉冲可以根据两个按键分别调整为正弦…

Java int[]与ArrayList<>数组 转换 详解

在 Java 中&#xff0c;int[] 与 ArrayList<Integer> 是两种常用的数据结构。由于 int[] 是基本数据类型数组&#xff0c;而 ArrayList<Integer> 是对象集合类型&#xff0c;两者的转换需要注意类型转换的细节。以下是完整的讲解和实现方法。 1. int[] 转换为 Arra…

大数据新视界 -- Hive 基于 MapReduce 的执行原理(上)(23 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…

React-状态管理详解

1、传统MVC框架的缺陷 什么是MVC&#xff1f; MVC的全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;是一种软件设计典范。 V即View视图是指用户看到并与之交互的界面。 M即Model模型是管理数…

AI潮汐日报1128期:Sora泄露引发争议、百度早期研究对AI领域Scaling Law的贡献、Meta发布系列AI开源项目

AI 潮汐日报&#xff0c;旨在提供最新潮、最核心、最有意思的AI速递。四大专栏&#xff1a;今日热点、应用速递、研究进展、思维碰撞。 今日热点 OpenAI文本转视频模型Sora泄露引发争议 OpenAI的文本转视频AI模型Sora在Hugging Face上遭遇泄露&#xff0c;泄露者为参与测试的…

PH热榜 | 2024-12-02

1. Muku.ai 标语&#xff1a;AI网红广告代理公司 介绍&#xff1a;木库AI是家AI网红营销机构&#xff0c;利用AI虚拟形象创作用户原创视频广告。只需提供产品链接&#xff0c;就能生成吸引人的内容&#xff0c;从而提升各大平台的销售额。 产品网站&#xff1a; 立即访问 P…