栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

朴素贝叶斯模型应用实践

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

朴素贝叶斯模型应用实践

实验四:朴素贝叶斯模型应用实践
一、实验目的

1.了解贝叶斯原理;

2.理解朴素贝叶斯算法原理;

3.掌握朴素贝叶斯工作流程

4.初步应用朴素贝叶斯分类器在分类中应用;

二、 实验内容

(以下实验二选一)1

1、文档分类

给定4种中文文档类型:女性、体育、文学、校园,其中训练集放在train文件夹里,测试数据放在test文件夹里,停用词放在stop文件夹里。

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZaF04vS-1632969729073)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片1.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KS1xL3UM-1632969729076)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片2.png)]

请使用朴素贝叶斯分类对训练集进行训练,并对测试集进行验证,,并给出测试集的准确率。

2、情感分类

要求建立文本情感分类模型,选手用训练好的模型对测试集中的文本情感进行预测,判断其情感为「Negative」或者「Positive」。所提交的结果按照指定的评价指标使用在线评测数据进行评测。数据格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qDdhMkfb-1632969729078)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片3.png)]

提供样本数据集的规模为6328,其中10%用于测试,90%用于训练。计算预测正确率。

三、 实现过程分析 1)情感分类: 总体思维导图:

主要步骤:

第一步:导入所需要的python包并导入数据:

import pandas as pd
import seaborn as sns
import nltk
import matplotlib.pyplot as plt
from nltk.stem.porter import *
from sklearn.feature_extraction.text import TfidfTransformer,TfidfVectorizer
from sklearn.model_selection import  train_test_split,KFold
from sklearn.naive_bayes import GaussianNB,BernoulliNB,MultinomialNB
from sklearn.metrics import roc_auc_score,auc,roc_curve
from wordcloud import WordCloud

第二步:导入数据并查看数据状态:

1):查看整体数据是否空值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kl8rQvBT-1632969729079)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片数据初步查看.png)]

2):查看数据状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpOMVGyu-1632969729080)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片数据粗糙特征.png)]

    # 导入数据
    All = pd.read_csv('SentimentData.csv', engine='python')
    # ppf.ProfileReport(All)
    # profile = ppf.ProfileReport(All)
    # profile.to_file(outputfile = "output_file.html")

第三步:数据清洗

1):查看数据情感是否缺失,对缺失数据进行删除:

由于缺失数据量小,所以直接删除,最大保证数据模型准确性。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1305nxsQ-1632969729082)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片4.png)]

    print(All.isnull().sum())
    # # 丢弃掉缺失情绪的人物数据
    All= All.dropna (axis=0,subset = ['label'])

2):标签替换:

    #标签替换以便后期处理
    All['label'] = All['label'].replace(to_replace=['Positive', 'Negative'], value=[0, 1])

3):正则表达式去除无关单词的符号:

无关符号不能表达情感,只有小部分符号能表达,所以对符号进行过滤

    # All.info()
    #正则表达式把标点、特征符号、数字等无关判断因素替换成空格
    All['review'] = All['review'].apply(Character_filtering)

4):查看词频并做数据处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZ7U1czi-1632969729082)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片未删除.png)]

通过图像发现语气词和不能代表信息的短单词,且容易影响精确率

删除三个单词以下词段,hi等语气词表达有限,且有大量的无关单词影响

    #删除低于三个字母的单词
    All['review'] = All['review'].apply(lambda x: ' '.join([w for w in x.split() if len(w) > 3]))

查看删除以后的前十个单词:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZ0Huzzp-1632969729083)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片前十位单词.png)]

删除后单词频率显示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrF4cRWc-1632969729084)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片训练集数据单词长度频率.png)]

第四步:TF-IDF词频:

vectorizer = TfidfVectorizer(stop_words=None,sublinear_tf=True, ngram_range=(1, 2), max_df=0.5)vectorizer.fit_transform(Tmp)Tmp_X = vectorizer.transform(Tmp)

第五步:训练集与测试集分割:

    #贝叶斯
    X_train_part, X_test_part, y_train_part, y_test_part = train_test_split(Tmp_X, All_ans_Y, test_size=0.1)

第六步:贝叶斯分类模型与模型评估

    #贝叶斯
    X_train_part, X_test_part, y_train_part, y_test_part = train_test_split(Tmp_X, All_ans_Y, test_size=0.1)
    clf = MultinomialNB()
    clf.fit(X_train_part, y_train_part)
    y_pred = clf.predict_proba(X_train_part)
    fpr, tpr, thresholds = roc_curve(y_train_part, y_pred[:, 1])
    #AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)
    print('训练集正确率:',auc(fpr, tpr) ) #acu评估方法
    y_pred = clf.predict_proba(X_test_part)
    fpr, tpr, thresholds = roc_curve(y_test_part, y_pred[:, 1])
    print('测试集正确率:',auc(fpr, tpr) ) #acu评估方法

四、实验结论:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xSFXs1IV-1632969729084)(E:机器人学院大三上机器学习实验代码和数据第四次实验报告-代码-图片贝叶斯-情感分类图片准确率.png)]

五、实验总结:

徐炜涛:此次实验选择了情感分析是因为数据集只有一张表,感觉比较好处理,结果发现也没有多好处理,由于这次的数据量大,而且数据缺失率小,就直接把缺失的数据删除了,麻烦点在于词频统计以后发现前面大部分的词语居然是无意义的语气词或者连语气词都不是乱码,于是虽然没有进,于是开始去除,去除完以后发现还比没去除的准确率低,当然低了一点点,无伤大雅,最后模型评估使用acu,AUC用于衡量“二分类问题”机器学习算法性能(泛化能力),和前几天人工智能课对上了一些,感觉效果不错(训练效果、理解效果)。

六、附录:实验代码
# -*- coding: utf-8 -*-
#开发团队:机器人学院
#开发人员:蟹老板
#开发时间:2020/10/2711:00
#文件名:Bayes
#开发工具:PyCharm



import sys
import xlrd
import random#随机百分10%
import nltk
import jieba
import  numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import string
from sklearn import metrics
import pandas as pd
import re
from nltk.stem.porter import *
from sklearn.feature_extraction.text import TfidfTransformer,TfidfVectorizer
from sklearn.model_selection import  train_test_split,KFold
from sklearn.naive_bayes import GaussianNB,BernoulliNB,MultinomialNB
from sklearn.metrics import roc_auc_score,auc,roc_curve
from wordcloud import WordCloud
import pandas_profiling as ppf#eda
from sklearn.cross_validation import cross_val_score


def main():
    # 导入数据与数据分割
    All = pd.read_csv('SentimentData.csv', engine='python')
    # ppf.ProfileReport(All)
    # profile = ppf.ProfileReport(All)
    # profile.to_file(outputfile = "output_file.html")

    # print(All.isnull().sum())
    # # 丢弃掉缺失情绪的人物数据
    All= All.dropna (axis=0,subset = ['label'])

    #标签替换
    All['label'] = All['label'].replace(to_replace=['Positive', 'Negative'], value=[0, 1])

    # All.info()
    #正则表达式把标点、特征符号、数字等无关判断因素替换成空格
    All['review'] = All['review'].apply(Character_filtering)

    #提取词干,即基于规则从单词中去除后缀的过程,如,play,player,played,plays,playing等
    #删除低于三个字母的单词
    All['review'] = All['review'].apply(lambda x: ' '.join([w for w in x.split() if len(w) > 3]))

    # stemmer = PorterStemmer()
    # All['review'] = All['review'].apply(lambda x: [stemmer.stem(i) for i in x])
    # All['review'] = All['review'].apply(lambda x: " ".join(x))

    #检查空值
    # print(All.isnull().sum())
    All_ans_Y=All[['label']]
    All_ans_X=All.drop(['label'], axis=1)

    Tmp=All['review'].values.tolist()

    #词云画图
    # word_map(All_ans_X)
    # positive_and_negativ_map(All)
    # Fequent(All)
    # map(All)


    vectorizer = TfidfVectorizer(stop_words=None,sublinear_tf=True, ngram_range=(1, 2), max_df=0.5)

    vectorizer.fit_transform(Tmp)
    Tmp_X = vectorizer.transform(Tmp)

    #贝叶斯
    X_train_part, X_test_part, y_train_part, y_test_part = train_test_split(Tmp_X, All_ans_Y, test_size=0.1)
    clf = MultinomialNB()
    clf.fit(X_train_part, y_train_part)
    y_pred = clf.predict_proba(X_train_part)
    fpr, tpr, thresholds = roc_curve(y_train_part, y_pred[:, 1])
    #AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)
    print('训练集正确率:',auc(fpr, tpr) ) #acu评估方法
    y_pred = clf.predict_proba(X_test_part)
    fpr, tpr, thresholds = roc_curve(y_test_part, y_pred[:, 1])
    print('测试集正确率:',auc(fpr, tpr) ) #acu评估方法
    # clf = MultinomialNB()
    # clf.fit(train_data, train_data['label'])
    # y_pred_text = clf.predict_proba(test_data)


def Character_filtering(str):
    #正则表达式把标点、特征符号、数字等无关判断因素替换成空格
    str=re.sub(r'[^a-zA-Z]',' ',str)
    str = str.lower()#转成小写
    return str


def word_map(Tmp):
    all_words = ' '.join([text for text in Tmp['review']])
    wordcloud = WordCloud(width=800, height=500, random_state=30, max_font_size=110).generate(all_words)
    plt.figure(figsize=(10, 7))
    plt.imshow(wordcloud, interpolation="nearest")
    plt.axis('off')
    plt.show()

def positive_and_negativ_map(Tmp):
    positive_words = ' '.join([text for text in Tmp['review'][Tmp['label'] == 0]])
    wordcloud = WordCloud(width=800, height=500, random_state=21, max_font_size=110).generate(positive_words)
    plt.figure(figsize=(10, 7))
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis('off')
    plt.show()

    negative_words = ' '.join([text for text in Tmp['review'][Tmp['label'] == 1]])
    wordcloud = WordCloud(width=800, height=500, random_state=21, max_font_size=110).generate(negative_words)
    plt.figure(figsize=(10, 7))
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis('off')
    plt.show()

def map(Tmp):
    HT_positive = hashtag_extract(Tmp['review'][Tmp['label'] == 0])

    # extracting hashtags from racist/sexist tweets
    HT_negative = hashtag_extract(Tmp['review'][Tmp['label'] == 1])
    # unnesting list
    HT_positive = sum(HT_positive, [])
    HT_negative = sum(HT_negative, [])

    # 画积极标签
    a = nltk.FreqDist(HT_positive)
    d = pd.Dataframe({'Hashtag': list(a.keys()), 'Count': list(a.values())})
    # selecting top 10 most frequent hashtags
    d = d.nlargest(columns="Count", n=10)
    # 前十
    plt.figure(figsize=(16, 5))
    ax = sns.barplot(data=d, x="Hashtag", y="Count")
    ax.set(ylabel='Count')
    plt.show()

    # # 画消极标签
    # b = nltk.FreqDist(HT_negative)
    # e = pd.Dataframe({'Hashtag': list(b.keys()), 'Count': list(b.values())})
    # # selecting top 10 most frequent
    # hashtagse = e.nlargest(columns="Count", n=10)
    # plt.figure(figsize=(16, 5))
    # ax = sns.barplot(data=e, x="Hashtag", y="Count")
    # ax.set(ylabel='Count')
    # plt.show()

def Fequent(All):
    def split_word(s):
        return len(s.split())
    All['word_length'] = All['review'].apply(split_word)
    sum_len, nums, maxnum, minnum = sum(All['word_length']), len(All['word_length']), max(All['word_length']), min(All['word_length'])
    print("all words number: {0} , mean word length : {1} ,max word length: {2} and min: {3} ".format(sum_len,sum_len // nums,maxnum, minnum))
    ##评论词长---频次
    plt.xlabel('length')
    plt.ylabel('frequency')
    plt.hist(All['word_length'], bins=150)
    plt.axis([0, 100, 0, 800])
    plt.show()

def hashtag_extract(x):
    hashtags = []    # Loop over the words in the tweet
    for i in x:
        ht = re.findall(r'(w+)', i)
        hashtags.append(ht)
    print(hashtags)
    return hashtags



if __name__=='__main__':
    main()







转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/283765.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号