zoukankan      html  css  js  c++  java
  • 13-垃圾邮件分类2

    1.读取

    2.数据预处理

    前两步请见:https://www.cnblogs.com/cyxxixi/p/12892357.html

    3.数据划分—训练集和测试集数据划分

    # new_data是要划分的样本特征集--邮件内容,sms_label是划分的样本结果集--垃圾邮件还是普通邮件
    # test_size是样本占比,选20%来测试,random_state是随机参数,stratify是平衡比例的

    1 emails=pd.read_csv("new_email.csv") #要import pandas as pd
    2 data=emails.iloc[:,1] #邮箱文本样本
    3 labels=emails.iloc[:,0]  #邮箱标签,垃圾邮件还是普通邮件
    4 
    5 from sklearn.model_selection import train_test_split
    6 
    7 x_train,x_test,y_train,y_test=train_test_split(data,labels,test_size=0.2,random_state=0,stratify=labels)
    8 print('训练样本个数:',len(x_train),'测试样本个数:',len(x_test),'训练标签个数:',len(y_train),'测试标签个数:',len(y_test))

    运行结果:

    4.文本特征提取

    sklearn.feature_extraction.text.CountVectorizer

    https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html?highlight=sklearn%20feature_extraction%20text%20tfidfvectorizer

    sklearn.feature_extraction.text.TfidfVectorizer

    https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html?highlight=sklearn%20feature_extraction%20text%20tfidfvectorizer#sklearn.feature_extraction.text.TfidfVectorizer

     1 # 4、文本特征提取---词袋模型
     2 # TfidfVectorizer除了考虑词汇在本文中出现的频率,还考虑在别的文本中出现的频率
     3 from sklearn.feature_extraction.text import TfidfVectorizer
     4 
     5 tfdvect=TfidfVectorizer()
     6 X_train=tfdvect.fit_transform(x_train) #向量化
     7 X_test=tfdvect.transform(x_test) #向量化
     8 
     9 X_train.toarray().shape  #(4457, 6719)  6719是词汇表个数
    10 X_test.toarray().shape
    11 tfdvect.vocabulary_ #词汇表

    运行结果:

    观察邮件与向量的关系

    词汇表出来以后,每个邮件的shape变成了(1,len(tfdvect.vocabulary_)),所以变成了[0,0,0.....0,0]这样的形式,如果邮件中的单词在词汇表里有的话,就不为0。

    向量还原为邮件

    5.模型选择

    from sklearn.naive_bayes import GaussianNB

    from sklearn.naive_bayes import MultinomialNB

    说明为什么选择这个模型?

    1 from sklearn.naive_bayes import MultinomialNB
    2 
    3 mnb=MultinomialNB() #构造模型
    4 mnb.fit(X_train,y_train) #训练模型
    5 y_pre=mnb.predict(X_test) #预测
    6 print('预测值',y_pre,'
    ',"真实值",y_test)
    7 print('不符合预测值的个数:',(y_pre!=y_test).sum(),"符合预测的个数",(y_pre==y_test).sum())

    运行结果:

    根据分类的特征来选模型

    高斯朴素贝叶斯是呈正态分布的,更多的是当样本中数据特征相似时处于一个区间,而其他的特征出现的较少

    垃圾邮件分类是单词对与文本的重要性,是单词变量出现次数在其文本中所占比例,以及在其他文本中所占比例,是n次独立重复实验中随机事件出现的次数分别为n1,n2,....,nk的概率符合多项式分布概率。

    6.模型评价:混淆矩阵,分类报告

    from sklearn.metrics import confusion_matrix

    confusion_matrix = confusion_matrix(y_test, y_predict)

    说明混淆矩阵的含义

    from sklearn.metrics import classification_report

    说明准确率、精确率、召回率、F值分别代表的意义

    # 5、模型评估
    from sklearn.metrics import confusion_matrix #混淆矩阵
    from sklearn.metrics import classification_report #回归报告
    import numpy as np
    
    con_m=confusion_matrix(y_test,y_pre)
    print("混淆矩阵",con_m)
    print((con_m[0][0]+con_m[1][1])/np.sum(con_m))
    c_r=classification_report(y_test,y_pre)
    print("回归报告:
    ",c_r)

     运行结果:

    说明混淆矩阵的含义

    说明准确率、精确率、召回率、F值分别代表的意义   

    7.比较与总结

    如果用CountVectorizer进行文本特征生成,与TfidfVectorizer相比,效果如何?

    CountVectorizer()函数只考虑词汇在文本中出现的频率,属于词袋模型特征。

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

     1 from sklearn.feature_extraction.text import CountVectorizer
     2 cvect=CountVectorizer()
     3 XX_train=cvect.fit_transform(x_train)#向量化
     4 XX_test=cvect.transform(x_test)#向量化
     5 XX_train.toarray()[0]
     6 import numpy as np
     7 aa=np.flatnonzero(XX_train.toarray()[0])#非0元素对应的单词
     8 aa
     9 from sklearn.naive_bayes import MultinomialNB
    10 mnb1=MultinomialNB() #构造模型
    11 mnb1.fit(XX_train,y_train) #训练模型
    12 yy_pre=mnb1.predict(XX_test) #预测
    13 print('CountVectorizer的的预测值',yy_pre,'
    ',"CountVectorizer的真实值",y_test)
    14 print('CountVectorizer的不符合预测值的个数:',(yy_pre!=y_test).sum(),"CountVectorizer的符合预测的个数",(yy_pre==y_test).sum())
    15 from sklearn.metrics import confusion_matrix #混淆矩阵
    16 from sklearn.metrics import classification_report #回归报告
    17 import numpy as np
    18 con_m1=confusion_matrix(y_test,yy_pre)
    19 print("CountVectorizer的混淆矩阵",con_m1)
    20 print((con_m1[0][0]+con_m1[1][1])/np.sum(con_m1))
    21 c_r1=classification_report(y_test,yy_pre)
    22 print("CountVectorizer的回归报告:
    ",c_r1)
    View Code

    用CountVectorizer进行文本特征生成,与TfidfVectorizer相比,进行代码编写,结果运行后,发现CountVectorizer的效果似乎更好一点。

    CountVectorizer在混淆矩阵中,正确的预测会比TfidfVectorizer更加少一点。

    参考:https://blog.csdn.net/weixin_40547993/article/details/90296785?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-6
    https://blog.csdn.net/u013063099/article/details/80964865

  • 相关阅读:
    洛谷P3258 [JLOI2014]松鼠的新家
    洛谷P1306 斐波那契公约数
    bzoj4247:挂饰
    [YTU]_2354 (H 实现复数类中的加运算符重载【C++运算符重载】)
    [YTU]_2440 (C++习题 复数类--重载运算符+,-,*,/)
    [YTu]_2441 (C++习题 复数类--重载运算符2+)
    [YTu]_2439(C++习题 复数类--重载运算符+)
    10.3 重载双目运算符
    10.2.1 关于vc++不支持把类的成员函数定义为类的友元函数的处理
    10.2 运算符重载函数作为类成员函数和友元函数
  • 原文地址:https://www.cnblogs.com/cyxxixi/p/12932692.html
Copyright © 2011-2022 走看看