基于朴素贝叶斯算法的新闻分类
Posted ZHW_AI课题组
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于朴素贝叶斯算法的新闻分类相关的知识,希望对你有一定的参考价值。
目录
1.作者介绍
郑自立,男,西安工程大学电子信息学院,2021级研究生
研究方向:机器视觉与人工智能
电子邮件:zzl513x@163.com
刘帅波,男,西安工程大学电子信息学院,2021级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1461004501@qq.com
2.朴素贝叶斯算法
2.1朴素贝叶斯算法原理
朴素贝叶斯法(NPC)是基于贝叶斯定理与特征条件独立假设的分类方法。具体来说,朴素贝叶斯算法根据贝叶斯公式来对未知事物进行分类,通过已知条件(X=x)计算未知事物分别属于各个类别(Y=ck)时对应的概率,然后把未知事物判别为概率最大的那一类。贝叶斯公式:
其中A是给定的特征值,B是所属类别,贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,但我们更关心P(B|A),贝叶斯定理就为我们打通从P(A|B)获得P(B|A)的道路。
贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。由于具有坚实的数学基础,贝叶斯分类算法的误判率较低。贝叶斯方法结合先验概率和后验概率,既避免了只使用先验概率的主管偏见,也避免了单独使用样本信息的过拟合现象。
2.2朴素贝叶斯分类算法流程
整个朴素贝叶斯分类算法分为三个阶段:
第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
2.3朴素贝叶斯分类的优缺点
优点:==
(1)算法逻辑简单,易于实现(算法思路很简单,只要使用贝叶斯公式转化一下即可!)
(2)分类过程中时空开销小(假设特征相互独立,只会涉及到二维存储)。
缺点:
理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
3.数据集介绍
20newsgroups数据集是用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合。一些新闻组的主题特别相似(e.g. comp.sys.ibm.pc.hardware/ comp.sys.mac.hardware),还有一些却完全不相关 (e.g misc.forsale /soc.religion.christian)。
4.完整代码
from sklearn.datasets import fetch_20newsgroups
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.pipeline import Pipeline
'''
下面对两种提取特征的方法,分别设置停用词和不停用,
使用朴素贝叶斯进行分类预测,比较评估效果
'''
# 1 下载新闻数据
news = fetch_20newsgroups(subset="all")
# 2 分割训练数据和测试数据
x_train, x_test, y_train, y_test = train_test_split(news.data,
news.target,
test_size=0.25,
random_state=33)
# 3.1 采用普通统计CountVectorizer提取特征向量
# 默认配置不去除停用词
count_vec = CountVectorizer()
x_count_train = count_vec.fit_transform(x_train)
x_count_test = count_vec.transform(x_test)
# 去除停用词
count_stop_vec = CountVectorizer(analyzer='word', stop_words='english')
x_count_stop_train = count_stop_vec.fit_transform(x_train)
x_count_stop_test = count_stop_vec.transform(x_test)
# 3.2 采用TfidfVectorizer提取文本特征向量
# 默认配置不去除停用词
tfid_vec = TfidfVectorizer()
x_tfid_train = tfid_vec.fit_transform(x_train)
x_tfid_test = tfid_vec.transform(x_test)
# 去除停用词
tfid_stop_vec = TfidfVectorizer(analyzer='word', stop_words='english')
x_tfid_stop_train = tfid_stop_vec.fit_transform(x_train)
x_tfid_stop_test = tfid_stop_vec.transform(x_test)
# 4 使用朴素贝叶斯分类器 分别对两种提取出来的特征值进行学习和预测
# 对普通通统计CountVectorizer提取特征向量 学习和预测
mnb_count = MultinomialNB()
mnb_count.fit(x_count_train, y_train) # 学习
mnb_count_y_predict = mnb_count.predict(x_count_test) # 预测
# 去除停用词
mnb_count_stop = MultinomialNB()
mnb_count_stop.fit(x_count_stop_train, y_train) # 学习
mnb_count_stop_y_predict = mnb_count_stop.predict(x_count_stop_test) # 预测
# 对TfidfVectorizer提取文本特征向量 学习和预测
mnb_tfid = MultinomialNB()
mnb_tfid.fit(x_tfid_train, y_train)
mnb_tfid_y_predict = mnb_tfid.predict(x_tfid_test)
# 去除停用词
mnb_tfid_stop = MultinomialNB()
mnb_tfid_stop.fit(x_tfid_stop_train, y_train) # 学习
mnb_tfid_stop_y_predict = mnb_tfid_stop.predict(x_tfid_stop_test) # 预测
# 5 模型评估
# 对普通统计CountVectorizer提取的特征学习模型进行评估
print("未去除停用词的CountVectorizer提取的特征学习模型准确率:", mnb_count.score(x_count_test, y_test))
print("更加详细的评估指标:\\n", classification_report(mnb_count_y_predict, y_test))
print("去除停用词的CountVectorizer提取的特征学习模型准确率:", mnb_count_stop.score(x_count_stop_test, y_test))
print("更加详细的评估指标:\\n", classification_report(mnb_count_stop_y_predict, y_test))
# 对TfidVectorizer提取的特征学习模型进行评估
print("TfidVectorizer提取的特征学习模型准确率:", mnb_tfid.score(x_tfid_test, y_test))
print("更加详细的评估指标:\\n", classification_report(mnb_tfid_y_predict, y_test))
print("去除停用词的TfidVectorizer提取的特征学习模型准确率:", mnb_tfid_stop.score(x_tfid_stop_test, y_test))
print("更加详细的评估指标:\\n", classification_report(mnb_tfid_stop_y_predict, y_test))
text_clf = Pipeline([('vect', TfidfVectorizer()), ('clf', MultinomialNB())])
text_clf = text_clf.fit(news.data, news.target)
predicted = text_clf.predict(news.data)
news.target.shape
# 输入新闻进行新闻种类G匹配
text = input("enter the text you want to categorise")
predict_new = text_clf.predict([text])
targetNames = news.target_names
#输出新闻所属的种类
print(targetNames[int(predict_new)])
mydict = "text": targetNames[int(predict_new)]
print(mydict)
5.实验结果
以上是关于基于朴素贝叶斯算法的新闻分类的主要内容,如果未能解决你的问题,请参考以下文章