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

news2024/11/25 23:46:18

✅作者简介: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.coloradmin.cn/o/403237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux下安装SonarQube

目录1. 准备安装环境2. 安装postgres数据库3. 安装SonarQube4. 使用SonarQube1. 准备安装环境 这里安装SonarQube的系统环境是Red Hat Enterprise Linux release 8.7 ,然后将jdk的压缩包(jdk-17.0.2_linux-x64_bin.tar.gz)和sonarQube的压缩…

Web Components学习(2)-语法

一、Web Components 对 Vue 的影响 尤雨溪在创建 Vue 的时候大量参考了 Web Components 的语法&#xff0c;下面写个简单示例。 首先写个 Vue 组件 my-span.vue&#xff1a; <!-- my-span.vue --> <template><span>my-span</span> </template>…

Spring——spring整合JUnit

JUnit定义: Junit测试是程序员测试&#xff0c;即所谓 白盒测试 &#xff0c;因为程序员知道被测试的软件如何&#xff08;How&#xff09;完成功能和完成什么样&#xff08;What&#xff09;的功能。 Junit是一套框架&#xff0c;继承TestCase类&#xff0c;就可以用Junit进行…

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium&#xff1f; 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、什么是Selenium&#xff1f; …

SpringBoot bean 加载顺序如何查看(源码解读)

背景 SpringBoot bean 加载顺序如何查看&#xff0c;想看加载了哪些bean&#xff0c; 这些bean的加载顺序是什么&#xff1f; 实际加载顺序不受控制&#xff0c;但会有一些大的原则&#xff1a; 1、按照字母顺序加载&#xff08;同一文件夹下按照字母数序&#xff1b;不同文件…

界面开发(4)--- PyQt5实现打开图像及视频播放功能

PyQt5创建打开图像及播放视频页面 上篇文章主要介绍了如何实现登录界面的账号密码注册及登录功能&#xff0c;还简单介绍了有关数据库的连接方法。这篇文章我们介绍一下如何在设计的页面中打开本地的图像&#xff0c;以及实现视频播放功能。 实现打开图像功能 为了便于记录实…

CobaltStrike攻击payload(有效载荷)介绍

HTA文档Office宏payload生成器有效载荷生成器windows可执行程序windows可执行程序windows stageless生成所有有效载荷HTA文档该模块为HTML Application attack&#xff08;HTML应用攻击&#xff09;。简单来说&#xff0c;就是这个包生成一个运行有效负载的HTML应用程序该模块下…

TCP UPD详解

文章目录TCP UDP协议1. 概述2. 端口号 复用 分用3. TCP3.1 TCP首部格式3.2 建立连接-三次握手3.3 释放连接-四次挥手3.4 TCP流量控制3.5 TCP拥塞控制3.6 TCP可靠传输的实现3.7 TCP超时重传4. UDP5.TCP与UDP的区别TCP UDP协议 1. 概述 TCP、UDP协议是TCP/IP体系结构传输层中的…

Flink 定时加载数据源

一、简介 flink 自定义实时数据源使用流处理比较简单&#xff0c;比如 Kafka、MQ 等&#xff0c;如果使用 MySQL、redis 批处理也比较简单 如果需要定时加载数据作为 flink 数据源使用流处理&#xff0c;比如定时从 mysql 或者 redis 获取一批数据&#xff0c;传入 flink 做处…

三、HTTP协议之三

文章目录一、HTTPS协议概述二、 HTTPS使用成本三、从HTTP到HTTPS四、HTTP协议的瓶颈五、双工通信的websocket六、HTTP2.0一、HTTPS协议概述 二、 HTTPS使用成本 HTTPS对性能的影响 https之所有安全是因为使用TLS(SSL)来加密传输. 三、从HTTP到HTTPS 了解个大概 第一步&#x…

react:二、jsx语法规则

目录 1.传输数据的xml和json格式举例 2.jsx语法规则 3.js语句跟js表达式的区别 4.jsx的小练习 1.传输数据的xml和json格式举例 2.jsx语法规则 1.定义虚拟DOM时&#xff0c;不要写引号。 2.标签中混入JS表达式时要用{}。 3.样式的类名指定不要用class&#xff0c;要用cla…

第十一章 寡头垄断市场中的企业决策

寡头垄断市场的定义、条件 寡头垄断市场&#xff1a;少数几家企业控制了某一行业的市场&#xff0c;供给该行业生产的大部分产品 寡头垄断市场应具备的条件&#xff1a; 一个行业或市场中&#xff0c;只有少数几家企业企业之间存在着相互制约、相互依存的关系新企业进入行业比…

golang大杀器GMP模型

golang 大杀器——GMP模型 文章目录golang 大杀器——GMP模型1. 发展过程2. GMP模型设计思想2.1 GMP模型2.2 调度器的设计策略2.2.1 复用线程2.2.2 利用并行2.2.3 抢占策略2.2.4 全局G队列2.3 go func()经历了那些过程2.4 调度器的生命周期2.5 可视化的CMP编程2.5.1 trace方式2…

【LeetCode】33. 搜索旋转排序数组、1290. 二进制链表转整数

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 33. 搜索旋转排序数组 1290. 二进制链表转整数 33. 搜索旋转排序数组 33. 搜索旋转排序…

JavaEE简单示例——Bean的实例化

简单介绍&#xff1a; 在我们之前使用某个对象&#xff0c;那么就要创建这个类的对象&#xff0c;创建对象的过程就叫做实例化。对于Spring来说&#xff0c;实例化Bean的方式有三种&#xff0c;分别是构造方法实例化&#xff0c;静态方法实例化&#xff0c;实例工厂实例化。我…

哪款手推式洗地机好用?2023洗地机推荐

虽然现在市面上的洗地机层出不穷&#xff0c;但是无论洗地机怎么变&#xff0c;关于洗地机的选择看准吸力、除菌、续航、清洁力这几点就够了。因此&#xff0c;一款好用的洗地机必须要拥有良好的清洁力和续航时间&#xff0c;最好还拥有除菌等细节功能。那么下面就让我们一起来…

【Linux】文件系统详解

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享C/C相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

Unity脚本复习

1.在Project面板中显示和创建的每一个脚本其实都是一个类&#xff0c;当我们把脚本挂载到Hierarchy层级中的游戏物体时&#xff0c;其实我们就实现了将脚本类实例化为一个脚本组件&#xff08;对象&#xff09;的过程 2.在游戏运行时&#xff0c;场景加载&#xff0c;游戏对象…

云边端协同时序数据库的挑战与解决方案

现今&#xff0c;时序数据库在经济金融、环境监控、医疗生物等多个领域有着极为广泛的需求。其中&#xff0c;在环境监控等领域&#xff0c;时序数据库主要部署在云边端架构中。但如何实现云边端协同是目前TSDB所面临的巨大挑战。由于云、边和端的计算、存储资源状况和对数据管…

【LeetCode】剑指 Offer(21)

目录 题目&#xff1a;剑指 Offer 39. 数组中出现次数超过一半的数字 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 40. 最小的k个数 -…