数据代码分享|Python用NLP自然语言处理LSTM神经网络Twitter推特灾难文本数据、词云可视化与SVM,KNN,多层感知器,朴素贝叶斯,随机森林,GBDT对比
作者:Yunfan Zhang
Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话。迄今为止,Twitter的日活跃用户达1.86亿。与此同时,Twitter也已成为突发紧急情况时人们的重要沟通渠道。由于智能手机无处不在,人们可以随时随地发布他们正在实时观察的紧急情况。 因此,越来越多的救灾组织和新闻机构对通过程序方式监视Twitter产生了兴趣。但是,我们并不清楚一个用户在推特上发布的推文是否是真实的正在发生的灾难。举个例子,用户发送了“从正面看昨晚的天空,好像在燃烧一样。”作者明确使用了“ABLAZE”一词,但仅仅是为了形容火烧云,并非真正的火焰燃烧。这对于人类来说是显而易见的,但是对于机器来说便很难分辨该用户是否正在预告真实发生的火灾。
解决方案
任务/目标
建立一个预测推文发布灾难真实性的机器学习模型,该模型可以预测哪些推文发布的是真实发生的灾难,哪些是虚假的灾难,从而为相关组织网络监测灾难发生及救援提供帮助。
数据源准备
数据集中包含的列:
列名 解释
id 每条推文的唯一标识符
text 推特的内容
location 推文发送的位置(可以为空白)
keyword 推文中的特定关键字(可以为空白)
target 仅在train.csv中存在,表示推文中描述灾难的真假,真实为1,虚假为0
其中,测试集包含7613个样本,训练集包含3263个样本。
加载数据并查看
运用pandas分别读取训练集,测试集等。
查看训练集前五行
结果如下:
查看测试集前五行
结果如下:
数据可视化
首先,运用plotly绘制真实虚假灾难数量对比的饼图,该饼图描述了正例反例在训练样本中的占比,检验数据平衡性。
counts_train = train.target.value_counts(sort=False)
labels = counts_train.index
values_train = counts_train.values
#输入饼图数据
data = go.Pie(labels=labels, values=values_train ,pull=[0.03, 0])
运行结果如下:
由饼图可知,在训练集中,灾难真实发生的样本(1)共有3271个,占总体的43%,非真实发生的样本(0)有4342个,占总体的57%。总体来说比例较为均衡,可以进行后续建模。
然后,为了进一步了解灾难推文的大致内容,本文利用wordcloud绘制推文的内容的词云。
首先自行将一些网络常用词加入停用词表。
然后定义绘制词云图的函数:
#设置词云格式并生成词云
wordcloud = WordCloud(width = 4000, height = 3000, #宽高background_color ='white', #背景色stopwords = stopwords, #停用词
结果如下:
数据清洗
众所周知,在进行建模之前,我们必须首先进行数据的预处理,以便于后续进一步处理。因此,本文将进行一些基本的网络文本清理工作,例如去除网址,去除网络标签,删除标点符号,删除常用表情符号,拼写矫正等。
1. 删除网址
2. 删除HTML标签
3. 删除表情符号
首先,搜索推特中常用的表情符号,查询他们的代码点(https://emojipedia.org/relieved-face/),将需要删除的表情符号记录。
5. 拼写矫正
文本的向量化处理
1. 文本序列化
通过tensorflow自带的Tokenizer分词器设置训练集text中所有词的索引值,然后将词映射为其索引值。
然后,查看text中独立词汇的数量
输出结果:Number of unique words: 14666
2. 嵌入GloVe字典
在这里我们将使用GloVe预训练的语料库模型来表示我们的单词。GloVe模型用于进行词的向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息。我们需要输入语料库,然后通过该模型输出词向量。该方法的原理是首先基于语料库构建词的共现矩阵,然后基于共现矩阵和GloVe模型学习词向量。GloVe语料库共有3种类型:50D,100D和200 D。在这里我们将使用100D。
3. 匹配GloVe向量
输出结果:
100%|██████████| 14666/14666 [00:00<00:00, 599653.57it/s]
(14667, 100)
建立模型
从2014年起,NLP 的主流方法转移到非线性的神经网络方法,从而输入也从稀疏高维特征向量变为低位稠密特征向量。神经网络不仅像传统机器学习方法一样学习预测,同时也学习如何正确表达数据,即在处理输入输出对时,网络内部产生一系列转化以处理输入数据来预测输出数据。
因此,本次建模以神经网络为基础,设置了Embedding层,Dropout层,LSTM层,以及全连接层。
1. 定义模型函数
导入神经网络相关库后定义模型函数。
#嵌入层
model.add(Embedding(input_dim=num_words,output_dim=100,embeddings_initializer=initializers.Constant
添加Embedding层以初始化GloVe模型训练出的权重矩阵。input_dim即词汇量,输入数组中的词典大小是14666,即有14666个不同的词,所以我的input_dim便要比14666要大1,output_dim是密集嵌入的尺寸,就如同CNN最后的全连接层一样,上面设置的100,便将每一个词变为用1x100来表示的向量,embeddings_initializer为嵌入矩阵的初始化的方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。输入序列的长度设置为序列长度20,将每个text表示为一个20×100的矩阵
由于文本数据的连续性,我们添加LSTM层。LSTM是作为短期记忆的解决方案而创建的长短期记忆模型,和RNN类似,只是当词向量作为输入进入神经元后,神经元会按照某种方式对该词向量的信息进行选择,存储成新的信息,输入到相邻的隐藏层神经元中去。
输出结果:
2. 参数选择与调优
本文运用交叉验证的方法得到验证集精度,并以此为标准,使用网格搜索来确定最优超参数。
Scikit-Learn里有一个API 为model.selection.GridSearchCV,可以将keras搭建的模型传入,作为sklearn工作流程一部分。因此,我们运用此函数来包装keras模型以便在scikit-learn中使用keras。
3. 模型训练
输出结果:
输出结果:
由训练过程可知,验证集准确率最高的参数组合为第五次训练时的参数,batch_size=10 ,epochs=10。
4. 模型评估
查看最终参数选择的结果和交叉验证的结果:
输出结果:
交叉验证平均准确率: 0.7921975544580065
最好的参数模型: {‘batch_size’: 10, ‘nb_epoch’: 10}
5. 与传统机器学习模型对比
将train中训练集数据划分为训练集和验证集,然后对比其在验证集上的准确率。
分别使用SVM,KNN,多层感知器,朴素贝叶斯,随机森林,GBDT等方法构建模型,与神经网络进行对比。
输出结果:
模型1验证集准确率: 0.6250820748522653
模型2验证集准确率: 0.5843729481286933
模型3验证集准确率: 0.5384110308601444
模型4验证集准确率: 0.4799737360472751
模型5验证集准确率: 0.6323046618516087
模型6验证集准确率: 0.6401838476690742
以上模型的验证集准确率与神经网络的验证集准确率相比差别较大,可见本文基于神经网络的文本预测模型是相对准确且可靠的。
结果预测
我们继续通过上述步骤构建的神经网络模型预测test测试集中的target列。
#预测
predictions = grid_result.predict(testing_padded)
submission['target'] = (predictions > 0.5).astype(int)
输出结果:
项目结果
真实虚假样本比例接近1:1.
灾难相关推文中提到最多的词汇是fire。
最好的参数组合是batch_size=10 ,epochs=10。
将测试集输入模型得到最终预测结果。
关于作者
在此对Yunfan Zhang 对本文所作的贡献表示诚挚感谢,她专长机器学习,概率论与数理统计。
数据代码分享|Python用NLP自然语言处理LSTM神经网络Twitter推特灾难文本数据、词云可视化与SVM,KNN,多层感知器,朴素贝叶斯,随机森林,GBDT对比相关推荐
- 数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化...
全文下载链接:http://tecdat.cn/?p=28877 作者:Yunfan Zhang Twitter是一家美国社交网络及微博客服务的网站,致力于服务公众对话.迄今为止,Twitter的日活 ...
- 先马后看!详解线性回归、朴素贝叶斯、随机森林在R和Python中的实现应用!(附代码)...
来源| analyticsvidhya 编译| 火火酱,责编| Carol 出品 | AI科技大本营(ID:rgznai100) 谷歌的自动驾驶汽车和机器人得到了媒体的广泛关注,但是公司真正的未来是在 ...
- 数据科学和人工智能技术笔记 十六、朴素贝叶斯
十六.朴素贝叶斯 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 伯努利朴素贝叶斯 伯努利朴素贝叶斯分类器假设我们的所有特征都是二元的,它们仅有两个值(例如,已经是独热 ...
- 鸢尾花python贝叶斯分类_机器学习之鸢尾花-朴素贝叶斯方法
在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同. 对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系 ...
- 朴素贝叶斯法原理及其python实现
文章目录 一.模型描述与假设 模型描述 期望风险最小化 生成式模型 朴素假设 二.模型学习与参数估计 伯努利模型(文本型) 多项式模型(词频型) 高斯模型 三.Python实现 伯努利模型 多项式模型 ...
- Python 高斯朴素贝叶斯的优缺点
关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 Sklearn基于这些分布以及这些分布上的概率估计的改进,为我们提供了四个朴素贝叶斯的分类器 类 含义 naive_bayes.Bernoul ...
- 数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户...
原文链接:http://tecdat.cn/?p=23518 项目背景:银行的主要盈利业务靠的是贷款,这些客户中的大多数是存款大小不等的责任客户(存款人).银行拥有不断增长的客户(点击文末" ...
- php熊掌号怎么设置json-ld,织梦DEDECMS熊掌号JSON LD结构化数据代码分享
织梦DEDECMS熊掌号JSON LD结构化数据代码分享 效果: 注意:@id里面的地址必须是自适应网站或者手机站,pc端链接是不支持! 百度官方JSON-LD示例: { "@context ...
- 【转载学习】数据代码分享丨1990-2020年中国省级行政区1km分辨率NDVI数据
数据代码分享丨1990-2020年中国省级行政区1km分辨率NDVI数据 原创 等你关注的 地理学人GeoCompany 2023-03-31 10:00 发表于广东 收录于合集 #植被变化3个 #数 ...
最新文章
- JSON Web Tokens测试工具
- cube sdio fatfs 初始化sd卡_Stm32CubeMx配置SDIO+FATFS+FREERTOS
- Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量...
- 004_Spring Data JPA根据实例查询数据
- win10任务管理器快捷键_你都知道吗?Win10任务管理器到底藏了多少秘密
- oracle中序列号的使用
- 快递信息管理系统源代码c++_学生信息管理系统C语言版
- 基于DBUtils实现数据库连接池
- 世界上最伟大的十个公式,看看你懂得几个?
- 简述python的安装过程_python3+ selenium3开发环境搭建-手把手教你安装python(详细)...
- python3 xlrd包的用法
- 【Oracle】Rman备份策略
- 【事件驱动】【数码管识别】 封装成DLL的函数的梳理
- 面试题之GC垃圾回收算法
- 基于单片机的电子秤系统设计(电路+流程)
- 一个牛人给JAVA初学者的建议【转】
- 人工智能挑战教师角色独特性 与教育教学融合显现独特优势
- 跨省游开放首展,海峡旅博会和休闲旅博会将在厦门举行
- 怎样才能无需训练也能成为武林高手
- Fault tolerant heap shim applied to current process. This is usually due to previous crashes
热门文章
- 课程学习笔记1:自然辩证法概论
- 洛谷P1618 三连击(升级版)
- 微信小程序(Behaviors使用)
- bootice添加黑苹果引导_NUC8 x 黑苹果抄作业续集,快速迁移 OpenCore + 升级 Big Sur...
- Oracle时间戳类型
- 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。 请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排
- Vector CANoe 更改帧的调度表的顺序
- (仿牛客论坛项目)01 - 开发社区首页
- 【ECAPA_TDNN 下 】代码和论文细节分析
- ZF均衡和ML均衡在不同天线数量下的MIMO系统误码率matlab仿真