我又回来了,这次进行英文垃圾短信分类任务。下面将分别用机器学习深度学习的方法进行操作,此外深度学习的方法又分别用RNNCNN的方法进行展示,Let’s go!!!

充满活力的冲啊!!!

一、英文垃圾短信分类

这次的任务很简单,就是一个二分类的任务。不过属于nlp的二分类的任务。给出短信内容,判别该短信是否是垃圾短信。

那么,那么,那么,重点来了!既然要做本次实验,怎么能没有数据集呢?

数据集才是驱动力呀!

数据集是kaggle下载的,来判别短信内容是否为垃圾短信。

二、机器学习方法进行英文垃圾短信分类

1.数据集

首先先读取数据集,我们先看一下数据集的模样。

不对,应该是这样的。

之后,统计一下,数据的分布情况。从图中我们看到短信的类别存在不平衡的情况。

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

既然存在样本不平衡的情况,那么下面对数据预处理的时候,我们就需要对这情况进行处理,这里的处理在深度学习的部分。

2.数据预处理

a.分割数据

为了评估效果,我们需要对数据集进行分割,来划出一部分,用来测试。

b.文本特征提取

这里将短信的内容,将文本数据转为特征向量。

比较常用的文本特征表示法为词袋法

词袋法:

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

主要有两个api来实现CounterVectorizerTfidfVectorizer

CountVectorizer:

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

TfidfVectorizer:

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

这里给出TfidfVectorizer的部分代码,

3.机器学习大杂烩

a.模型满汉全席

将常见的模型,拿出来,进行评估,废话不多讲,直接上代码

models = {"SVC":SVC(kernel="linear"),"MultinomialNB":MultinomialNB(),"LogisticRegression":LogisticRegression(),"KNeighborsClassifier":KNeighborsClassifier(),"DecisionTreeClassifier":DecisionTreeClassifier(),"RandomForestClassifier":RandomForestClassifier(),"AdaBoostClassifier":AdaBoostClassifier(),"BaggingClassifier":BaggingClassifier(),"ExtraTreesClassifier":ExtraTreesClassifier()
}prediction = dict()
score_map = {}for model_name in models:model = models[model_name]model.fit(x_train_df,y_train)prediction[model_name]=model.predict(x_test_df)score=accuracy_score(y_test,prediction[model_name])score_map[model_name]=scoreresult = pd.DataFrame()
result["model"] = score_map.keys()
result["score" ]=score_map.values()
result["score"]=result["score"].apply(lambda x : x*100)

最后让我们看一下结果,可以看到支持向量机的效果很好,而且这只是默认参数的情况下,下面调一下参,在看一下。

def plot_model_performace(result):sns.set_style("ticks")figsize=(22,6)ticksize=12titlesize=ticksize+8labelsize=ticksize+5xlabel="Model"ylabel="Score"title="Model Performance"params={"figure.figsize":figsize,"axes.labelsize":labelsize,"axes.titlesize":titlesize,"xtick.labelsize":ticksize,"ytick.labelsize":ticksize}plt.rcParams.update(params)col1="model"col2="score"sns.barplot(x=col1,y=col2,data=result)plt.title(title.title())plt.xlabel(xlabel)plt.ylabel(ylabel)plt.xticks(rotation=90)plt.grid()plt.plot()plt.show()print(result)

b.超参数调参

现在就由最伟大的炼丹师出场了。

from sklearn.model_selection import GridSearchCVparam_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_))

并用混淆矩阵来评价一下

# 混淆矩阵
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)

终于终于终于才写了一半,好想拆开,这样就能水两篇了。(其实这篇也是来水的)

三、深度学习英文垃圾短信分类

在本节,将分别用CNN和RNN模型进行操作,准备好了么,让我们出发!

1.数据集

数据集可参照上部分,并没有多大变化,都是驱动力。

2.数据预处理

a.样本不均衡

我们在上述数据集的观察下,发现样本数据存在不均衡的情况,这里处理一下。

使用sklearn.utils.class_weight样本均衡操作。当我们的数据,有多个类别,每个类别的数据量有很大差距时,这时需要对每个类别的样本做一次均衡,这样会让每个类别的特征都在一定程度上被模型学习。

# 计算各个类别的weights
def get_weight(y):class_weight_current = cw.compute_class_weight("balanced",np.unique(y),y)return class_weight_currentclass_weight = get_weight(y_train.flatten())

b.文本数据处理

使用分词器Tokenier进行文本数据处理。分词器Tokenizer Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类方法

# 分词器Tokenizer   Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类方法# fit_on_texts(texts) :texts用于训练的文本列表# texts_to_sequences(texts):texts待转为序列的文本列表 返回值:序列的列表,列表中的每个序列对应于一段输入文本# 填充序列pad_sequences  将长为nb_smaples的序列转换为(nb_samples,nb_timesteps)2Dnumpy attay.如果提供maxlen,nb_timesteps=maxlen,否则其值为最长序列的长度。
# 其它短于该长度的序列都会在后部填充0以达到该长度。长与nb_timesteps的序列会被阶段,以使其匹配该目标长度。#max_words = 1000
#max_len = 150
max_words = len(set(" ".join(x_train).split()))
max_len = x_train.apply(lambda x:len(x)).max()tok = Tokenizer(num_words=max_words)tok.fit_on_texts(x_train)sequences = tok.texts_to_sequences(x_train)
sequences_matrix = sequence.pad_sequences(sequences,maxlen=max_len)

c.超参数的设置

  • ModelCheckpoint:

    • 作用:该回调函数将在每个epoch后保存模型到filepath
    • 参数:
      • filename:字符串,保存模型的路径,filepath可以是格式化的字符串,里面的
      • monitor:需要监视的值,通常为:val_acc或val_loss或acc或loss
      • verbose:信息展示模型,0或1。默认为0表示不输出该信息,为1表示输出epoch模型保存信息。
      • save_best_only:当设置为Trur时,将只保存在验证集上性能最好的模型
      • mode:“auto”,“min”,"max"之一,在save_best_only=True时决定性能最佳模型的评判准则。
      • save_weights_only:若设置为True时,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
      • period:CheckPoint之间的间隔的epoch数
  • EarlyStopping:

    • 作用:当监测值不再改善时,该回调函数将中止训练
    • 参数:
      • monitor:需要监视的量,通常为val_acc或val_loss或acc或loss
      • patience:当early stop被激活(如发现loss相比上patience个epoch训练没有下降),则经过patience个epoch后停止训练。
      • verbose:信息展示模型
      • mode:“auto”,“min”,"max"之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练。
  • ReduceLROnPlateau:

    • 作用:当评价指标不再提升时,减少学习率。当学习停滞时,减少2倍或10倍的学习率通常能够获得较好的效果。该回调函数检测指标的情况,如果在patience个epoch中看不到模型性能提升,则减少学习率。
    • 参数:
      • monitor:被监测的量
      • factor:每次减少学习率的因子,学习率将以lr=lr*factor的形式被技术那好
      • patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发
      • mode:“auto”,“min”,"max"之一,在min模式下,如果检测值触发学习率减少。在max模式下,当检测值不再上升则触发学习率减少
      • epsilon:阈值,用来确定是否进入检测值的“平原区”
      • cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作
      • min_lr:学习率的下限。
print("Setting Callbacks")checkpoint = ModelCheckpoint("model.hdf5",monitor="val_acc",save_best_only=True,mode="max")early_stopping = EarlyStopping(monitor="val_loss",patience=2,verbose=1,restore_best_weights=True,mode="min")reduce_lr = ReduceLROnPlateau(monitor="val_loss",factor=0.6,patience=1,verbose=1,mode="min")callbacks=[checkpoint,early_stopping,reduce_lr]
print("Set Callbacks at",date_time(1))

3.深度学习模型

下面,分别定义一个CNN模型和RNN模型,然后进行训练和测试。

a.定义RNN模型

# 定义RNN模型
def RNN():model = Sequential()model.add(Embedding(max_words,50,input_length=max_len))model.add(LSTM(64))model.add(Dropout(0.5))model.add(BatchNormalization())model.add(Dropout(0.5))model.add(Dense(256,activation="relu"))model.add(Dropout(0.5))model.add(BatchNormalization())model.add(Dropout(0.5))model.add(Dense(1,activation="sigmoid"))model.summary()return model

给出最后的曲线结果图。

b.定义CNN模型

# 定义CNN模型
def CNN():model=Sequential()model.add(Embedding(max_words,50,input_length=max_len))model.add(Conv1D(64,3,padding="valid",activation="relu",strides=1))model.add(GlobalMaxPooling1D())model.add(Dropout(0.5))model.add(BatchNormalization())model.add(Dropout(0.5))model.add(Dense(256,activation="relu"))model.add(Dropout(0.5))model.add(BatchNormalization())model.add(Dropout(0.5))model.add(Dense(1,activation="sigmoid"))model.summary()return model

效果的话,还是RNN更好一些。

好了,终于写完了,过一阵,再写一个关于音频分类的,最近找音频分类的代码,发现这类代码好少,不过我也不是做这方向,就随意水一水,好不好。

【实战】英文垃圾短信分类相关推荐

  1. 实战:垃圾短信分类检测

    上次我们讲到朴素贝叶斯分类,忘记的同学参考一文搞懂朴素贝叶斯分类,今天就通过朴素贝叶斯分来来实现一个简单的垃圾短信分类器. 数据预处理 实现这个分类器我们使用的数据集来自伦敦大学学院的机器学习数据集( ...

  2. 【机器学习】贝叶斯分类原理+实战垃圾短信分类-SMSSpamCollection下载数据集

    贝叶斯分类 1高斯贝叶斯.多项式贝叶斯.伯努利贝叶斯的比较 GaussianNB解决连续型数据的模型,期望样本特征取值都是符合正太分布  MultinomialNB 大文本集的分类处理(文章影评)适合 ...

  3. 机器学习—— SVM分类垃圾短信

    机器学习-- SVM分类算法 垃圾短信分类问题 Python语言凭借其强大的特性,其众多的外部库支持下,在机器学习和数据挖掘等领域发挥着强大的作用.本文基于python的机器学习库scikit-lea ...

  4. 垃圾短信识别python步骤详细_python数据挖掘第三篇-垃圾短信文本分类

    文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重要python库包括num ...

  5. 毕业设计 - 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

    文章目录 1 前言 2 垃圾短信/邮件 分类算法 原理 2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍 4 数据预处理 5 特征提取 6 训练分类器 7 综合测试结果 8 其他模型方法 9 最 ...

  6. 朴素贝叶斯分类实验(垃圾邮件分类以及垃圾短信过滤数据集)

    文章目录 贝叶斯公式 先验概率 后验概率 贝叶斯定理 朴素贝叶斯分类器 拉普拉斯修正 防溢出策略 实现垃圾邮件分类 实现垃圾短信过滤(SMS数据集) 实验总结 贝叶斯公式 先验概率 P(cj)P(c_ ...

  7. 【毕业设计】垃圾邮件(短信)分类算法研究与实现 - 机器学习

    文章目录 1 前言 2 垃圾短信/邮件 分类算法 原理 2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍 4 数据预处理 5 特征提取 6 训练分类器 7 综合测试结果 8 其他模型方法 9 最 ...

  8. 【数据科学项目02】:NLP应用之垃圾短信/邮件检测(端到端的项目)

    垃圾短信检测(端到端的项目) 我们都听说过一个流行词--"数据科学".我们大多数人都对"它是什么?我可以成为数据分析师或数据科学家吗?我需要什么技能?并不是很了解.例如: ...

  9. python垃圾短信识别_Scikit-Learn机器学习实践:垃圾短信识别

    机器学习与垃圾短信识别 前不久,我们使用NLTK的贝叶斯分类模型垃圾对短信数据进行机器学习的垃圾短信识别. 其实除了使用NLTK,我们还可以使用Scikit-Learn这个集成了诸多机器学习算法的模块 ...

最新文章

  1. leetcode-155 最小栈
  2. Transformer详细解读与预测实例记录
  3. asterisk 互联
  4. 中国首枚芯片邮票问世:搭载NFC芯片 可APP读取
  5. 小米盒子4用u盘导入html文件格式,最新图文教程:小米盒子怎么用U盘安装第三方应用...
  6. 使用java进行图像处理_使用Java进行图像处理
  7. OpenCV单目视觉定位(测量)系统
  8. P2326 AKN’s PPAP
  9. 【软考】系统集成项目管理工程师(八)项目进度管理
  10. ArcMap打不开.jpg .bmp
  11. 金三银四跳槽季,教你这几招提高面试成功率
  12. 弱网条件下基于阻抗小扰动稳定性分析,小信号模型,阻抗扫描(电容电流反馈有源阻尼),单逆变器SRF-PLL
  13. Unity 检测手机性能,区分高中低端机型(URP)
  14. 2021-2027全球与中国USB智能电源板市场现状及未来发展趋势
  15. 自己编程实现抖音特效(Python)
  16. 基于微信小程序电子产品商城系统(springboot+ mybatis-plus+mysql+原生微信小程序)
  17. 计算机配置高低怎么看,电脑配置的高低怎么查看
  18. 《中国垒球》:棍网球委员会·垒球联盟
  19. 龙——中华民族象征的
  20. Python是什么?一篇文章带你全面了解Python

热门文章

  1. @Pointcut 的 12 种用法,你知道几种?
  2. linux中的硬件抽象层
  3. 精神分裂症的早期发病症状
  4. 突破B站番剧港澳台地区限制
  5. 有趣的闲话:2019年总结
  6. 同义词替换,停词去除
  7. 幼儿园带括号算式口诀_幼儿园大班数学《括号题型》PPT课件
  8. 炫舞浪漫爱有没有修改服务器,炫舞浪漫爱新手指南 轻轻松松做大神
  9. docker部署jar包的几种方式
  10. 在Visual Studio Code中使用快捷键自动补充html代码