【人工智能项目】机器学习中文垃圾邮件分类任务


本次采用机器学习模型对中文邮件是否为垃圾邮件进行判别。那么工友们,学起来吧!!!

任务说明

0,商业秘密的秘密性那是维系其商业价值和垄断地位的前提条件之一

1,南口阿玛施新春第一批限量春装到店啦   春暖花开淑女裙、冰蓝色公主衫 气质粉小西装、冰丝女王长半裙、 皇

0,带给我们大常州一场壮观的视觉盛宴

0,有原因不明的泌尿系统结石等

0,23年从盐城拉回来的麻麻的嫁妆

0,感到自减肥、跳减肥健美操、

1,感谢致电杭州萧山全金釜韩国烧烤店,本店位于金城路xxx号。韩式烧烤等,价格实惠、欢迎惠顾【全金釜韩国烧烤店】

0,这款UVe智能杀菌机器人是扫地机的最佳伴侣

最前面表示标签,0代表是正常短信,1代表垃圾短信。

可以看出邮件分类的最大问题在于语意的理解。对中英文数字夹杂的语句进行分词,去除无意义的词汇,生成语意明确的等长词向量显得尤为重要。在词向量的特征提取过程中也可以采用TF-IDF等方式,来权衡每个词的相对重要性。

导包

import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import warnings
warnings.filterwarnings("ignore")

数据初步处理

数据集读取

原始数据短信数据共有7w多条数据,在这一步需要读取txt文档,并分割出label和text。

import os
import pandas as pdsms_data_path = "."
sms_data = pd.read_csv(os.path.join(sms_data_path,"message.txt"),encoding="utf-8",header=None,sep = '\t',names=["label","text"])
sms_data.head()

sms_data.shape

(754843, 2)

统计垃圾邮件和非垃圾邮件的数量

# 统计垃圾和非垃圾邮件的数量
sms_data["label"].value_counts()

# 以图方式表示
sns.countplot(sms_data["label"])
plt.xlabel("Label")
plt.title("Number of ham of spam messages")

数据集划分

在模型训练前首先需要将数据集进行分割,这里将数据取出后进行一定比例的随机分割,分成训练集数据和测试集数据。

from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test = train_test_split(sms_data["text"][:6000],sms_data["label"][:6000],test_size=0.2,random_state=2019)
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

(4800,)
(4800,)
(1200,)
(1200,)

文本特征读取

文本特征介绍

文本特征提取

  • 将文本数据转换成特征向量的过程
  • 比较常用的文本特征表示法为词袋法

词袋法:

  • 不考虑词语出现的顺序,每个出现过的词汇单独作为一列特征
  • 这些不重复的特征词汇集合为词表
  • 每一个文本都可以在很长的词表上统计出一个很多列的特征向量
  • 如果每个文本都出现的词汇,一般被标记为停用词 不计入特征向量

主要有两个api来实现CounterVectorizerTfidfVectorizer

CountVectorizer:

  • 只考虑词汇在文本中出现的频率

TfidfVectorizer:

  • 除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量
  • 能够消减高频没有意义的词汇出现带来的影响,挖掘更有意义的特征。

TFIDF

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import pickle# tfidf向量保存# tfidf = TfidfVectorizer()
tfidftransformer_path = './tfidftransformer.pkl'
tfidf = pickle.load(open(tfidftransformer_path,"rb"))
# x_train_df = tfidf.fit_transform(x_train)
x_train_df = tfidf.transform(x_train)# tfidf向量保存
# tfidftransformer_path = './tfidftransformer.pkl'
# with open(tfidftransformer_path, 'wb') as fw:
#     pickle.dump(tfidf, fw)x_test_df = tfidf.transform(x_test)
print(type(x_train_df))
print(x_train_df.shape)
print(tfidf.get_feature_names()[:1000])

朴素贝叶斯模型

寻参

from sklearn.model_selection import GridSearchCV
from sklearn.naive_bayes import MultinomialNBparam_grid = {"alpha":np.concatenate([np.arange(0.0001,0.001,0.0001),np.arange(0.001,0.01,0.001),np.arange(0.01,0.1,0.01),np.arange(0.1,1,0.1),np.arange(1,10,1),np.arange(10,100,5)])
}
model = MultinomialNB()
grid_cv_model = GridSearchCV(model,param_grid,n_jobs=-1,verbose=3,cv=3)
grid_cv_model.fit(x_train_df,y_train)

#对指标评价
print("{}{}".format("Best Estimator: ",grid_cv_model.best_estimator_))
print("{}{}".format("Besr Params: ",grid_cv_model.best_params_))
print("{}{}".format("Bset Scores: ",grid_cv_model.best_score_))

贝叶斯模型建立以及训练

建立贝叶斯模型

NB_model = MultinomialNB(alpha=0.1, class_prior=None, fit_prior=True)

贝叶斯模型训练

NB_model.fit(x_train_df,y_train)

贝叶斯模型保存

from sklearn.externals import joblib
joblib.dump(NB_model, "nb_model.m")

贝叶斯模型预测

prediction = dict()prediction["MultinomialNB"] = NB_model.predict(x_test_df)

贝叶斯模型评估

from sklearn.metrics import accuracy_score,f1_score,confusion_matrix,classification_reportprint(classification_report(y_test,prediction["MultinomialNB"],target_names=["Ham","Spam"]))

  • TP(True Positive):被正确分类的正样本

  • FP(False Positive):被错误分类的正样本

  • TN(True Negative):被正确分类的负样本

  • FN(False Negative):被错误分类的负样本

  • Precision精度;Recall召回率

  • Precision = TP/(TP+FP)即分类器认为是正类且确实是正类的部分占分类器认为是正类的比例

  • Recall = TP/(TP+FN)即分类器认为是正类且确实是正类站所有确实是正类的比例。

# 混淆矩阵
def plot_confusion_matrix(y_test,y_pred,title=""):conf_mat=confusion_matrix(y_test,y_pred)conf_mat_normalized=conf_mat.astype("float")/conf_mat.sum(axis=1)[:,np.newaxis]figsize=(22,5)ticksize=18titlesize=ticksize+8labelsize=ticksize+5xlabel="Predicted label"ylabel="True label"params={"figure.figsize":figsize,"axes.labelsize":labelsize,"axes.titlesize":titlesize,"xtick.labelsize":ticksize,"ytick.labelsize":ticksize}plt.rcParams.update(params)plt.subplot(121)sns.heatmap(conf_mat,annot=True)plt.title(title)plt.xlabel(xlabel)plt.ylabel(ylabel)plt.subplot(122)sns.heatmap(conf_mat_normalized,annot=True)plt.title(title)plt.xlabel(xlabel)plt.ylabel(ylabel)plt.show()print("Confusion  Matrix:\n")print(conf_mat)print("\n\nConfusion Matrix Normalized:\n")print(conf_mat_normalized)
plot_confusion_matrix(y_test,prediction["MultinomialNB"],title="MultinomialNB")

x_test[y_test<prediction["MultinomialNB"]]

x_test[y_test>prediction["MultinomialNB"]]

其它的机器学习算法

from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import AdaBoostClassifier,RandomForestClassifier,BaggingClassifier,ExtraTreesClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score,f1_score,confusion_matrix,classification_report
from sklearn.externals import joblib
models = {"KNeighborsClassifier":KNeighborsClassifier(),"LogisticRegression":LogisticRegression(),"DecisionTreeClassifier":DecisionTreeClassifier(),"RandomForestClassifier":RandomForestClassifier(),"ExtraTreesClassifier":ExtraTreesClassifier()
}prediction = dict()
score_map = {}for model_name in models:print(model_name)model = models[model_name]print("training..")model.fit(x_train_df,y_train)print("saving...")joblib.dump(model,model_name+".m")print("predicting...")prediction[model_name]=model.predict(x_test_df)score=accuracy_score(y_test,prediction[model_name])score_map[model_name]=scoreprint(score)

预测

# 带预测的文本
predict_text = "商业秘密的秘密性那是维系其商业价值和垄断地位的前提条件之一"
predict_text = [predict_text]
# 加载tfidf向量
import pickletfidftransformer_path = './tfidftransformer.pkl'
tfidf = pickle.load(open(tfidftransformer_path,"rb"))
# 文本特征提取
predict_vector = tfidf.transform(predict_text)
# 加载贝叶斯算法
from sklearn.externals import joblib
model = joblib.load("nb_model.m")
# 预测
predict_score = model.predict(predict_vector)
predict_proba = model.predict_proba(predict_vector)
predict_proba

array([[0.97234983, 0.02765017]])

predict_proba[0][predict_score]

array([0.97234983])

predict_score

array([0], dtype=int64)

if predict_score == 0:print("这条短信是正常短信!")
elif predict_score == 1:print("这条短信是垃圾短信!")
这条短信是正常短信!

小结

那么本次任务就到此结束了,回头见!!!

【人工智能项目】机器学习中文垃圾邮件分类任务相关推荐

  1. CNN中文垃圾邮件分类(二)

    本文整理自唐宇迪老师视频,谢谢他! 1.思路 在上一篇博客CNN中文垃圾邮件分类(一)中介绍了两种预处理方式,现在来介绍第二种,先用分好词的数据作为训练语料,选择前n个词作为词表(或者去掉出现频率较低 ...

  2. 4.4 机器学习系统设计--垃圾邮件分类-机器学习笔记-斯坦福吴恩达教授

    机器学习系统设计–垃圾邮件分类 假定我们现有一封邮件,其内容如下: From: cheapsales@buystufffromme.com To: ang@cs.stanford.edu Subjec ...

  3. Spark机器学习之垃圾邮件分类

    Spark机器学习之垃圾邮件分类 步骤概述 通过HashingTF构建文本的特征向量,然后使用随机梯度下降算法实现逻辑回归,进而对邮件进行分类 垃圾邮件分类代码 导入相关的包 import org.a ...

  4. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制

    封面图片:<Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社 图书详情(京东): ================= 关于朴素贝叶斯算法中文垃圾邮件分 ...

  5. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  6. 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)

    贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来.因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口. 其实 ...

  7. 机器学习--使用朴素贝叶斯进行垃圾邮件分类

    一.学习背景 垃圾邮件的问题一直困扰着人们,传统的垃圾邮件分类的方法主要有"关键词法"和"校验码法"等,然而这两种方法效果并不理想.其中,如果使用的是" ...

  8. 机器学习——朴素贝叶斯算法(垃圾邮件分类)

    朴素贝叶斯算法介绍以及垃圾邮件分类实现 1.一些数学知识 2.贝叶斯公式 3.朴素贝叶斯算法 (1)介绍 (2)核心思想 (3)朴素贝叶斯算法 (4)拉普拉斯修正 (5)防溢出策略 (6)一般过程 ( ...

  9. 基于朴素贝叶斯的垃圾邮件分类-着重理解拉普拉斯变换

    1. 引言 在正式学习朴素贝叶斯之前,需要明确的是机器学习所要实现的是基于有限的训练样本集尽可能准确地估计出后验概率P(c|x),即根据特征得到所属类别的概率,首先引入两个概念. 判别式模型(disc ...

最新文章

  1. ORACLE设置用户密码不过期
  2. java类加载器、双亲委派、沙箱安全机制全都让你整明白(三万字,收藏慢慢啃)
  3. mdkstc系列器件支持包下载_WPS Office 2019 For Linux(2020/10/21)更新-支持PDF编辑
  4. oracle 数据库字段名与实体类字段名称不匹配的处理方法
  5. 虚拟软驱影像文件制作程序下载路径:http://download.csdn.net/source/738137
  6. 文件的写操作 c# 1614527940
  7. linux主机与路由器建立隧道的方法
  8. Java二叉搜索树转循环链表,关于java:二叉搜索树转换为单向链表interview1712
  9. JupterNoteBook
  10. 文件比较与同步工具——FreeFileSync
  11. 目前web渗透的思路
  12. 游戏开发中的基本数学与物理
  13. 技术交底书(一)-----一种移动终端无需充电及移动终端
  14. 白盒测试——静态白盒测试
  15. python体重转换_Python第十二课 计算体脂率2.0
  16. 海马体启发的记忆模型
  17. Node 的 cross-env 模块
  18. 建服务器数据中心,如何构建一个服务器数据中心
  19. 从Ajax聊一聊Jsonp hijacking
  20. 《拆掉思维里的墙》—— 读后总结

热门文章

  1. 创业者面对困难-不轻言放弃
  2. java毕业设计——基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码)——银行帐目管理系统
  3. Win10 固定IP地址方法
  4. php连接mysql错误:Call to undefined function mysql_connect()
  5. 服务器系统迁移工具,Win2008 R2迁移实战之迁移工具使用
  6. 实现类似Twitter的启动动画
  7. 取得高等学校教师资格证应当具备什么学历要求
  8. 自己写的wow菜鸟指南
  9. 高博应诺培训班学习一个月总结
  10. X79主板win10启动卡住问题修复处理