[Kaggle] Spam/Ham Email Classification 垃圾邮件分类(spacy)

文章目录

    • 1. 导入包
    • 2. 数据预览
    • 2. 特征组合
    • 3. 建模
    • 4. 训练
    • 5. 预测

练习地址:https://www.kaggle.com/c/ds100fa19
相关博文:
[Kaggle] Spam/Ham Email Classification 垃圾邮件分类(RNN/GRU/LSTM)
[Kaggle] Spam/Ham Email Classification 垃圾邮件分类(BERT)

1. 导入包

import pandas as pd
import spacy
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

2. 数据预览

train.head(10)
train = train.fillna(" ")
test = test.fillna(" ")

注意处理下 NaN , 否则后续会报错,见链接:
spacy 报错 gold.pyx in spacy.gold.GoldParse.init() 解决方案https://michael.blog.csdn.net/article/details/109106806

2. 特征组合

  • 对邮件的主题和内容进行组合 + 处理标签
train['all'] = train['subject']+train['email']
train['label'] = [{"spam": bool(y), "ham": not bool(y)}for y in train.spam.values]
train.head(10)

标签不是很懂为什么这样,可能spacy要求这种格式的标签

  • 训练集、验证集切分,采用分层抽样
from sklearn.model_selection import StratifiedShuffleSplit
# help(StratifiedShuffleSplit)
splt = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=1)
for train_idx, valid_idx in splt.split(train, train['spam']): # 按照后者分层抽样train_set = train.iloc[train_idx]valid_set = train.iloc[valid_idx]# 查看分布
print(train_set['spam'].value_counts()/len(train_set))
print(valid_set['spam'].value_counts()/len(valid_set))

输出:显示两种数据集的标签分布是几乎相同的

0    0.743636
1    0.256364
Name: spam, dtype: float64
0    0.743713
1    0.256287
Name: spam, dtype: float64
  • 文本、标签分离
train_text = train_set['all'].values
train_label = train_set['label']
valid_text = valid_set['all'].values
valid_label = valid_set['label']# 标签还要做以下处理,添加一个 'cats' key,'cats' 也是内置的关键字
train_label = [{"cats": label} for label in train_label]
valid_label = [{"cats": label} for label in valid_label]# 训练数据打包,再转为list
train_data = list(zip(train_text, train_label)) test_text = (test['subject']+test['email']).values
print(train_label[0])

输出:

{'cats': {'spam': False, 'ham': True}}

3. 建模

  • 创建模型,管道
nlp = spacy.blank('en') # 建立空白的英语模型
email_cat = nlp.create_pipe('textcat', 
#                             config=
#                             {
#     "exclusive_classes": True, # 排他的,二分类
#     "architecture": "bow"
#                             })
# 参数 'textcat' 不能随便写,是接口内置的 字符串
# 上面的 config 不要也可以,没找到文档说明,该怎么配置
help(nlp.create_pipe)
  • 添加管道
nlp.add_pipe(email_cat)
  • 添加标签
# 注意顺序,ham是 0, spam 是 1
email_cat.add_label('ham')
email_cat.add_label('spam')
  • 训练
from spacy.util import minibatch
import random
def train(model, train, optimizer, batch_size=8):loss = {}random.seed(1)random.shuffle(train) # 随机打乱batches = minibatch(train, size=batch_size) # 数据分批for batch in batches:text, label = zip(*batch)model.update(text, label, sgd=optimizer, losses=loss)return loss
  • 预测
def predict(model, text):docs = [model.tokenizer(txt) for txt in text] # 先把文本令牌化emailpred = model.get_pipe('textcat')score, _ = emailpred.predict(docs)pred_label = score.argmax(axis=1)return pred_label
  • 评估
def evaluate(model, text, label):pred = predict(model, text)true_class = [int(lab['cats']['spam']) for lab in label]correct = (pred == true_class)acc = sum(correct)/len(correct) # 准确率return acc

4. 训练

n = 20
opt = nlp.begin_training() # 定义优化器
for i in range(n):loss = train(nlp, train_data, opt)acc = evaluate(nlp, valid_text, valid_label)print(f"Loss: {loss['textcat']:.3f} \t Accuracy: {acc:.3f}")

输出:

Loss: 1.132 	 Accuracy: 0.941
Loss: 0.283 	 Accuracy: 0.988
Loss: 0.121 	 Accuracy: 0.993
Loss: 0.137 	 Accuracy: 0.993
Loss: 0.094 	 Accuracy: 0.982
Loss: 0.069 	 Accuracy: 0.995
Loss: 0.060 	 Accuracy: 0.990
Loss: 0.010 	 Accuracy: 0.992
Loss: 0.004 	 Accuracy: 0.992
Loss: 0.004 	 Accuracy: 0.992
Loss: 0.004 	 Accuracy: 0.992
Loss: 0.004 	 Accuracy: 0.992
Loss: 0.004 	 Accuracy: 0.992
Loss: 0.004 	 Accuracy: 0.991
Loss: 0.004 	 Accuracy: 0.991
Loss: 0.308 	 Accuracy: 0.981
Loss: 0.158 	 Accuracy: 0.987
Loss: 0.014 	 Accuracy: 0.990
Loss: 0.007 	 Accuracy: 0.990
Loss: 0.043 	 Accuracy: 0.990

5. 预测

pred = predict(nlp, test_text)

  • 写入提交文件
id = test['id']
output = pd.DataFrame({'id':id, 'Class':pred})
output.to_csv("submission.csv",  index=False)

模型在测试集的准确率是99%以上!


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

电商网站(Django框架)—— 大纲内容与基本功能分析

1. 项目架构 2. 数据库表结构 3. 数据库读写分离 4. Django读写分离配置 新建utils/db_router.py 课后阅读资料 http://python.usyiyi.cn/documents/django_182/topics/db/multi-db.html 5. 用户认证模型 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之…

Python基础(五)--函数

目录 Python基础(五)--函数 1 函数的作用 1.1 函数定义与调用 1.2 函数的作用 1.3 空语句 2 参数与返回值 2.1 函数的参数 2.2 函数的返回值 2.3 返回多个值 3 参数的默认值 3.1 可选参数 3.2 参数的默认值 4 位置参数与关键字参数 4.1 关键…

LeetCode 1024. 视频拼接(动态规划/贪心)

文章目录1. 题目2. 解题2.1 动态规划2.2 贪心1. 题目 你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。 视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clip…

电商网站(Django框架)—— 思维导图

1.用户模块:注册、登录、激活、退出、个人中心、地址 2.商品模块:首页、详情、列表、搜索 3.购物车: 增加、删除、修改、查询 4. 订单模块:确认订单页面、提交订单(下单)、请求支付、查询支付结果、评论 5.…

Python基础(六)--类与对象

目录 Python基础(六)--类与对象 1 类与对象的基本概念 1.1 什么是对象 1.2 什么是类 1.3 类与对象的关系 2 定义与初始化 2.1 类的定义 2.2 对象的初始化 2.3 动态增加属性方法 3 类成员 3.1 类属性与实例属性 3.2 类方法与实例方法 3.3 静态…

HTTP和HTTPS的请求和响应

HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入…

LeetCode 794. 有效的井字游戏(分类讨论)

文章目录1. 题目2. 解题1. 题目 用字符串数组作为井字游戏的游戏板 board。当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true。 该游戏板是一个 3 x 3 数组,由字符 " ","X&quo…

Requests: 让 HTTP 服务人类

Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。 Requests的文档非常完备,中文文档也相当不错。Requests能完全满足当前…

Python基础(七)--模块和包

目录 Python基础(七)--模块和包 1 模块 1.1 什么是模块 1.2 模块的使用 1.3 模块的搜索路径 1.4 模块的缓存 2 包 2.1 什么是包 2.2 包的使用 3 常用模块 3.1 math 3.2 random 3.3 time 3.4 datetime 3.5 sys Python基础(七&am…

LeetCode 909. 蛇梯棋(BFS)

文章目录1. 题目2. 解题1. 题目 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向。 例如,一块 6 x 6 大小的棋盘,编号如下: r 行 c 列的棋盘,按前…

爬虫必须学会的正则表达式

为什么要学正则表达式 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网站去搜索)爬 (将所有的网站的内容全部爬下来)取 (去掉对我们没用处的数据)处理数据(按照我们想要的方式存储和使用) 我们在昨天的案例里实际上…

Python基础(八)--迭代,生成器,装饰器与元类

目录 Python基础(八)--迭代,生成器,装饰器与元类 1 迭代 1.1 可迭代对象与迭代器 1.2 自定义迭代类型 1.3 迭代合体 2 生成器 2.1 什么是生成器 2.2 生成器表达式 2.3 生成器函数 3 装饰器 3.1 闭包 3.2 什么是装饰器 …

XPath和lxml类库

XPath,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素。 什么是XML XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输数据&#xf…

Python基础(九)--异常

Python基础(九)--异常 1 异常相关概念 1.1 什么是异常 异常是程序运行过程中产生的一种事件,该事件会打乱程序的正常流程。可以说,异常就是一种意外,指程序没有按照正常或期望的方式执行。 当异常产生时&#xff0…

爬虫工具:虚拟机Selenium和PhantomJS,ChromeDriver 镜像安装教程

虚拟机Ubuntu 16.04中安装: 1.安装Selenium命令:pip install Selenium 2.安装PhantomJS命令:sudo apt install PhantomJS 3.找到Ubuntu中谷歌所对应的的版本号: 看到网上基本没有最新的chromedriver与chrome的对应关系表&#xff…

Python基础(十)--文件相关

目录 Python基础(十)--文件相关 1 读写文件 1.1 获取文件对象 1.2 文件读取 1.3 文件写入 1.4 文件定位 2 文件与路径的操作 2.1 os模块 2.2 os.path模块 2.3 shutil模块 2.4 glob模块 3 序列化 3.1 csv 3.2 json 3.3 pickle 4 上下文管理…

memcache 原理 监测 查看状态 stats 结构

Mencache内存存储方式:slab/LRU,采用预先申请固定大小的内存页(slab/page),然后再把内存分成多个块(chunk) 先放一张从网上找到的memcache内存结构图,觉得非常的赞: 再来一张memcach…

爬虫——多线程糗事百科案例

Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 对于资源,加锁是个重要的环节。因为python原生的list,dict等,都是not thread safe的…

LeetCode 1625. 执行操作后字典序最小的字符串(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s 以及两个整数 a 和 b 。其中,字符串 s 的长度为偶数,且仅由数字 0 到 9 组成。 你可以在 s 上按任意顺序多次执行下面两个操作之一: 累加:将 a 加到 s 中所有下标为奇数的元素…

C++ 0x 使用可变参数模板类 实现 C# 的委托机制

1 #ifndef _ZTC_DELEGATE_H_2 #define _ZTC_DELEGATE_H_3 4 #include <vector>5 #include <functional>6 7 ///8 // C 使用 可变参数模板类, 来实现9 // C#中的 委托 10 // Anchor: ztc 11 // Date : 2014-01-10 12 /// 13 14 template<typename R, typename …