文章目录

  • 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阿明),一起加油、一起学习进步!

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

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

    文章目录 1. 数据处理 2. 下载预训练模型 3. 加载数据 4. 定义模型 5. 训练 6. 提交测试结果 练习地址:https://www.kaggle.com/c/ds100fa19 相关博文 ...

  2. [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(RNN/GRU/LSTM)

    文章目录 1. 读入数据 2. 文本处理 3. 建模 4. 训练 5. 测试 练习地址:https://www.kaggle.com/c/ds100fa19 相关博文 [Kaggle] Spam/Ha ...

  3. 垃圾邮件分类 python_在python中创建SMS垃圾邮件分类器

    垃圾邮件分类 python 介绍 (Introduction) I have always been fascinated with Google's gmail spam detection sys ...

  4. 垃圾邮件分类-朴素贝叶斯算法

    目录 一.贝叶斯公式原理 二.使用朴素贝叶斯进行文档分类 三.Python代码实现 一.贝叶斯公式原理 在基础的概率学中,经典的有求独立事件的概率以及求关联时间的概率,贝叶斯所要解决的问题就是在有条件 ...

  5. 朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现

    朴素贝叶斯(西瓜数据集分类,社区恶意留言分类,垃圾邮件分类,新浪新闻分类),AODE分类器 代码实现 以下代码为本人学习后,修改或补充后的代码实现,数据集和原代码请参考:https://github. ...

  6. 基于朴素贝叶斯+Python实现垃圾邮件分类和结果分析

    基于朴素贝叶斯+Python实现垃圾邮件分类 朴素贝叶斯原理 请参考: 贝叶斯推断及其互联网应用(二):过滤垃圾邮件 Python实现 源代码主干来自: python实现贝叶斯推断--垃圾邮件分类 我 ...

  7. python训练opencb分类器_垃圾邮件分类.ipynb

    { "cells": [ { "cell_type": "markdown", "metadata": {}, &quo ...

  8. 垃圾邮件分类(trec06c数据集)数据处理-特征提取

    目录 目标:我要提取 发件人(From).收件人(To).邮件主题(Subject).邮件正文(zhengwen) 作为邮件特征,然后输入到线性分类模型中进行训练 首先是这四个特征提取的部分 发件人 ...

  9. python垃圾邮件识别_Python贝叶斯推理垃圾邮件分类

    针对贝叶斯垃圾邮件分类,阮一峰大神在多年前曾经写过一篇博客文章,他写的有些观点看起来很简单明了,不过我有点不是很理解其推导过程,虽然最后的结果等价,但是我还是觉得他的那套简单推导,感觉不太容易理解,可 ...

最新文章

  1. 将博客搬至51CTO
  2. 数据结构与算法:01 绪论
  3. Struts 2框架结构图
  4. JMeter性能测试的基础知识和个人理解
  5. 【题解】Luogu P3674 小清新人渣的本愿
  6. nodejs操作mongodb增删改查
  7. Ant Design Pro在使用TreeSelect树选择组件时,报错未注册
  8. 第一章节 ASP.NET Web应用程序基础(一)
  9. java tcp通信需要学吗_从c#通过tcp与java服务器通信
  10. Centos7 Zabbix3.2安装(yum)
  11. 构建一个pool来管理无刷新页面的xmlhttp对象
  12. 斐讯K2路由器刷潘多拉(解决固件非法问题)(连接校园网锐捷)
  13. async function
  14. CRT、CER、PEM、DER编码、JKS、KeyStore等格式证书说明及转换
  15. 北京建筑大学计算机学院岑孝鹏,北京建筑大学
  16. php形状特征提取方法,LowB沙箱-PHP动态特征提取
  17. redis cluster master failover问题
  18. 生活,令人满意的生活,丰富的生活包括了起起落落,包括了痛苦和再次振作,包括了失败和再次奋
  19. 企业级运维——Mysql主从复制(异步、半同步、全同步)
  20. WINDWOS XP应用大全

热门文章

  1. 【零散积累】传输文件(sz/rz/scp命令)
  2. ubuntu进入桌面自动启动脚本_在 Ubuntu 下开机自启动自己的 QT 程序而不启动 Ubuntu 的桌面...
  3. mac电脑如何与手机同步复制粘贴_如何将电脑里的文件同步到手机里?
  4. insert mysql后加where,如何在MySQL Insert語句中添加where子句?
  5. linux内核的I2C子系统详解5——i2c_driver的注册、i2c_client的来源
  6. easyexcel 填充模板 格式变了_Qamp;A | 如何制作规范的电子合同模板?
  7. Javascript实现合并单元格
  8. vs2010 rdlc 报表及报表控件
  9. 【转载】三极管,场效应管 工作原理小结
  10. VBA之六--EXCEL VBA两则