课设-机器学习课设-实现新闻分类

news/2024/11/30 3:33:31/

✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆
🔥系列专栏 :课设-机器学习
📃新人博主 :欢迎点赞收藏关注,会回访!
💬舞台再大,你不上台,永远是个观众。平台再好,你不参与,永远是局外人。能力再大,你不行动,只能看别人成功!没有人会关心你付出过多少努力,撑得累不累,摔得痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷。


文章目录

  • 一.工程摘要
  • 二、研究背景与意义
    • 2.1 研究背景及意义
    • 2.2 文本特征提取方法
  • 三、模型方法
    • 3.1 数据集收集
    • 3.2 数据集处理
    • 3.3 **朴素贝叶斯模型**
    • 3.4 多项式事件模型
    • 3.5 模型建立
  • 拉普拉斯平滑
  • 拉普拉斯平滑
    • 3.6 模型的评估
  • 四.实验结果分析、对比和讨论
    • 4.1 实验结果对比分析:
    • 4.2 本次实验的不足
  • 五.对本门课的感想、意见和建议
  • 六.参考文献

一.工程摘要

摘要: 本次报告实现了新闻分类。从新闻网站上,收集了六类中文文本,分别是政治,体育,法律,经济,科技,美食。对文本采用词集模型和词袋模型分别处理,利用机器学习模型中的基于Multinomial event model模型的朴素贝叶斯文本分类预测进行分类,构建了一个新闻文本分类器。

二、研究背景与意义

2.1 研究背景及意义

中文文本分类在日渐完善的网络信息管理与网络平台建设方面都发挥着重要的作用。国内的信息发布和交流平台主要依靠中文文本进行信息的传递,随着用户的增多,涌现的文本数量也快速增长。平台上服务于用户的个性推荐、垃圾信息过滤等功能的实现主要依托于文本分类技术,然而在网络信息传播过程中,总会出现新鲜类别文本的数量呈爆炸性增长的情况,由于无法在短时间内针对新类别文本进行大量样本标注,会出现文本分类效果不佳的问题,导致与之相关的功能也受到影响。因此,高实时性要求的场景下快速准确的文本分类能力,对于保障网络平台功能的正常运作具有重要意义。基于此背景,本文对基于主动学习的中文文本分类问题进行了研究,能够在保证文本分类器性能的前提下,减少标注样本的使用。

2.2 文本特征提取方法

经过特征提取后保留的文本特征是文本中最重要的特征,但是计算机并不认识,因此需要进一步转化为计算机能识别的向量。特征选择作为文本分类过程中的关键技术之一,那么如何选取贡献程度比较大的特征项集合,大大的降低文本中特征项的维度,进而使文本分类的分类性能得以提升是亟待解决的问题。2005年,Yan 等人提出了正交质心特征选择算法,该算法主要是对正交质子空间学习算法的目标函数进行优化,在特征维度很低的时候,该算法拥有比较出色的表现。2009年,Lin Ying 等人提出了一种新的特征选择算法,该算法主要是基于词权重的概率模型。2013年,Deng和 Zhong提出了一种新的特征选择算法,该算法基于TF-IDF特征加权算法和KL散度,可以更精准的反映文本的类别和内容。2019年,Liu等人提出了一种用于不平衡数据分类的嵌入式特征选择方法。
特征加权同样作为文本分类过程中的一个重要环节,它可以进一步计算文本中的每一个特征项对于文本类别的划分所做的贡献程度值。选择合适的加权算法可以大大提高文本分类最终的分类性能。2007年,Samer等人提出了一种名为Random-Walk特征加权算法,该特征加权算法最终的分类结果也比较出色。2009年,Lin Yin等人提出了一种面向不平衡文本分类的特征加权算法。2010年,Nigam提出了一种基于嫡的特征加权算法,该算法主要是基于信息嫡来度量文本中特征项的权重。2014年,Peng等人提出了一种改进的TF-IDF特征加权算法,该算法可以同时反映文本特征在正类别文本与负类别文本中的重要性。2018年,张敏提出了一种局部一致性的信息嫡Relief特征加权算法。

三、模型方法

3.1 数据集收集

本次报告采用的数据集为新闻网公开的的数据集,分为六类,分别为政治,体育,法律,经济,科技,美食。共25655条数据,其中80%用作训练集,20%用作测试集。

3.2 数据集处理

因为训练集和测试集的处理方法是一致的,所以下文只介绍训练集。
1)首先,将txt中的文本的不同标签下的数据提取,放置于一个二维列表中,因为是有监督学习,所以将同种类的文本放置于同一个维度下,实现代码为load_data_set()和get_data_list()。因为下载的文章有各种标签,所以要用正则表达式读取,实现的代码如下:

图表 1 数据的读取
2)对其去重,去停用词。去重为了生成词汇表。在生成词汇表时,可用python自带的set集合来表示,集合中不会有重复元素。划分词语时,有些词语是没有实际意思的,对后续的关键词提取就会加大工作量,并且可能提取的关键词是无效的。所以在分词处理以后,引入停用词去优化分词的结果。所以要在词汇表中删除停用词。实现的代码为create_vocab_list()和load_stop_words()。停用词表为网上公开的数据集,提前保存到txt文件中。实现的代码如下:

图表 2 生成词汇表和去停用词
3)文本向量化,以词为单位。分别利用如下的词集模型和词袋模型利用上述的词汇表将文本转换为向量。二者的不同点在于,对于重复出现的词在向量中的位置由1表示,还是由出现的次数表示。
词集模型
词袋模型
实现的代码如下:

图表 3 SOW和BOW的代码实现

3.3 朴素贝叶斯模型

贝叶斯公式如下:

由于同一个训练集的p(x)和p(y)相等,则可以转化为如下公式:即类先验概率和类条件概率的乘积由于模型采用了y=cj,表明使用了标签信息,最后预测时,需要对测试样本属于每个标签的概率都要计算一遍。不像生成式一般直接就输出测试样本的概率分布。

3.4 多项式事件模型

1)模型概率计算:
假设每个类别的概率
将文本转换为字符统计,将重复字符转为N次方形式

联合概率

2)最大似然求参:

3)解出闭式解:
MLE 公式

应用拉格朗日乘法

4)闭式MLE解:
梯度

MLE解

为了避免在预测时出现概率为零的情况,应用拉普拉斯平滑

3.5 模型建立

程序首先输入预先统计好的词汇表数和文档数目,利用拉普拉斯平滑方法创建一个全为1的数组。然后继续利用拉普拉斯方法初始化所有标签的概率,即分子为相应的标签数量+1,分母为训练集总标签的数量+标签的分类数量(本报告为6)。
for i in range(len(p_class)):

拉普拉斯平滑

p_class[i] = np.log((train_category.count(i) + 1.0) / (len(train_category) + classes_num))
然后循环整个训练集,按照上述公式,累加相应标签下,相应词中每个元素的分子分母。
for i in range(classes_num):

拉普拉斯平滑

p_words_num.append(np.ones(num_words))
p_words_denom.append(num_words)
分子和分母相除时,要取对数,防止下溢出。
for i in range(classes_num):
p_words.append(np.log(p_words_num[i] / p_words_denom[i]))
即计算每个标签下的每个词出现的累加概率,此时的值即为后续验证集中某个词是否为相应标签下的权重。后续预测时,不像生成式一般直接就输出测试样本的概率分布,需要对测试样本属于每个标签的概率都要计算一遍。
for class_index in range(classes_num):
log_sum = p_class[class_index]
for i in range(len(bag_of_words_vec)):
if bag_of_words_vec[i] > 0:
log_sum += bag_of_words_vec[i] * p_words[class_index][i]
此时,选择概率最大的所属标签即为可能的标签。Python中的矩阵模块自带函数numpy.argmax可以得到每一维度下最大值所在的索引,刚好对应相应字典中的标签。此时便可在有监督学习下预测值是否正确。

3.6 模型的评估

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)(高方差)
欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)(高偏差)
初步测试时,将20%的测试集放入测试,得到准确率为93.90%,怀疑是过度拟合,将80%的测试集放入测试,得到准确率为99.16%,模型过于拟合,方差太高,我认为是有几点可以改进的地方,1、增大数据的训练量,2、减少特征维度,减少词汇表,3、正则化。本次报告从前两点入手。
起初,词汇表为23983条词汇。将词汇随机选取18000条,测试是否拟合程度可以下降。结果为将20%的测试集放入测试,得到准确率为94.93%,将80%的测试集放入测试,得到准确率为98.83%,得出结论,该程序过拟合,并且当适当缩小词汇表规模的情况下,可以增加准确率。所以需要降低特征维度,也就是降低词汇表中的数据集数量,所以设计程序以1000的间隔遍历词汇表,观察测试集和训练集的准确率。程序运行的结果如下图:

图表 4 词汇表在16000-23000的测试结果
由图像可知,在21000附近以100位单位继续划分,得到如下结果:

图表 5词汇表在20500-21500的测试结果
由上图可知,词汇表在20900附近,得到的模型较好,拟合度较高。

四.实验结果分析、对比和讨论

4.1 实验结果对比分析:

1)不同数量词汇表下的准确率:
一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)(高方差)。一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)(高偏差)经过对比和遍历循环,找到了最适合的,最拟合的数据集如下图所示:

图表 6 词汇表在20500-21500的测试结果
2)SOW和BOW模型下的准确率:
经过对比SOW和BOW模型下的准确率,发现BOW下的准确率略高于SOW,SOW是单个文本中单词出现在字典中,就将其置为1,而不管出现多少次。BOW是单个文本中单词出现在字典中,就将其向量值加1,出现多少次就加多少次。 所以BOW比SOW更能表现原始数据的特点吧,但是都是基于词之间保持独立性,没有关联为前提。这使得其统计方便,但同时也丢失了文本间词之间关系的信息。结果如下图:

图表 7 SOW和BOW模型
3)是否去停用词下的准确率
经过对比是否去掉停词,划分词语时,有些词语是没有实际意思的,对后续的关键词提取就会加大工作量,并且可能提取的关键词是无效的。所以在分词处理以后,引入停用词去优化分词的结果。所以结果如下图:

图表 8 是否去除停用词
3)多元伯努利事件模型和多项式事件模型下的准确率
二者的计算粒度不一样,多项式模型以词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。计算后验概率时,对于一个文档d,多项式模型中,只有在d中出现过的词,才会参与后验概率计算,伯努利模型中,没有在d中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的。所以在词汇表为23983条词汇时,结果如下表:

模型名称\准确率测试集准确率训练集准确率
多项式事件模型93.90%99.16%
多元伯努利事件模型87.64%97.85%

图表 9多元伯努利事件模型和多项式事件模型

4.2 本次实验的不足

1)SOW和BOW都是基于词之间保持独立性,没有考虑句子有关联为前提。这使得其统计方便,但同时也丢失了文本间词之间关系的信息。可以采用经典的One-hot模型、TF-IDF模型和基于深度学习的Word2vec模型。TF-IDF模型与One-hot模型相比,可以计算反词频概率值;Word2vec模型能解决One-hot模型和TF-IDF模型的维度灾难和向量稀疏的缺陷。
2)因为用到了随机函数,删掉了部分特征点(并没有考虑这些特征的权值),所以模型的参数最终是在一个合理的空间范围内,需要进一步的缩小范围,然后得到确切得值。
3)朴素贝叶斯分类器。朴素贝叶斯在机器学习中非常常见,尤其是在文本分类中对于情感分析、垃圾邮件处理等应用比较广泛。但是对于朴素贝叶斯分类算法,以后还可以考虑对条件概率的计算方法进行改进。

五.对本门课的感想、意见和建议

过本次实验,我熟悉了python语言的语法,并可以熟练的使用。同时也培养了我的动手能力,“实验就是为了让你动手做,去探索一些你未知的或是你尚不是深刻理解的东西。每个步骤我都亲自去做,不放弃每次锻炼的机会。经过这一周,让我的动手能力有了明显的提高。机器学习课程历时大半个学期,做实验时通过自己编写、运行程序,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果。不仅巩固了书本所学的知识,还具有一定的灵活性,发挥了我们的创造才能。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在自己的思考以及和同学的讨论中,终于迎刃而解。
本门课程算是我最喜欢的一门课程了,他有完整的机器学习体系,可以让我们从0到1,合肥工业大学的老师和网课吴恩达老师相辅相成,共同助力我们理解机器学习,coursera网课配套的实验编程题题引导我一步一步导入数据,构建模型,评估模型,参数优化等,为今天的工程设计打下了夯实的基础。

六.参考文献

  1. 青盏.朴素贝叶斯模型 多元伯努利事件模型+多项式事件模型 Multi-Variate Bernoulli Event Model and Multinomial Event Model. https://blog.csdn.net/qq_16234613/article/. 2018
  2. 吴恩达.Machine Learning. https://www.coursera.org/ .2022

http://www.ppmy.cn/news/34590.html

相关文章

基于OpenCV的人脸识别

目录 🥩 前言 🍖 环境使用 🍖 模块使用 🍖 模块介绍 🍖 模块安装问题: 🥩 OpenCV 简介 🍖 安装 OpenCV 模块 🥩 OpenCV 基本使用 🍖 读取图片 🍗 【…

MHA实现mysql数据库高可用

目录 MHA原理 MHA工具包 MHA实现mysql高可用实战 MHA原理 ①MHA利用 SELECT 1 As Value 指令判断master服务器的健康性,一旦master 宕机,MHA 从宕机崩溃的master保存二进制日志事件(binlog events) ②识别含有最新更新的slave ③应用差异的中继日志&…

【前缀和】

前缀和前缀和子矩阵的和结语前缀和 输入一个长度为 n的整数序列。 接下来再输入 m 个询问,每个询问输入一对 l,r 对于每个询问,输出原序列中从第 l 个数到第 r个数的和。 输入格式第一行包含两个整数 n和 m 第二行包含 n个整数,表示整数…

ES-笔记

1、索引 查看所有索引 GET /_cat/indices?v健康状况 GET _cluster/health GET _cluster/health?levelindices分词器 POST _analyze {"analyzer": "ik_max_word","text": "四川森森管理公司" }索引数据拷贝 POST _reindex {&quo…

java学习笔记——抽象类

2.1 概述 由来 父类中的方法,被他的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有主体的方法称为抽象方法。java语法规定,包含抽象…

Linux命令运行原理shell和bash

目录前言什么是shell,什么是bash?ls -l 执行过程前言 学习操作系统的过程中我们经常在自己的shell中执行一些Linux命令,那么当我们输入一个类似于 ls -a 这样的命令式,发生了什么? 换句话说,从我们在shell中输入ls -a 按下回车…

基于springboot框架实现校园闲置物品交易 源码+论文

基于springboot框架实现校园闲置物品交易 源码论文开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Ma…

锂电池充电的同时也能放电吗?

大家应该都有这样经历,我们的手机在充电的同时也能边使用,有的同学就会说了,这是因为手机电池在充电的同时也在放电。如果这样想我们可能就把锂电池类比了一个蓄水池,以为它在进水的同时也能出水,其实这个比喻是错误的…