R语言中的情感分析与机器学习

Python066

R语言中的情感分析与机器学习,第1张

来源 | 雪晴数据网

利用机器学习可以很方便的做情感分析。本篇文章将介绍在R语言中如何利用机器学习方法来做情感分析。在R语言中,由Timothy P.Jurka开发的情感分析以及更一般的文本挖掘包已经得到了很好的发展。你可以查看下sentiment包以及梦幻般的RTextTools包。实际上,Timothy还写了一个针对低内存下多元Logistic回归(也称最大熵)的R包maxtent。

然而,RTextTools包中不包含朴素贝叶斯方法。e1071包可以很好的执行朴素贝叶斯方法。e1071是TU Wien(维也纳科技大学)统计系的一门课程。这个包的主要开发者是David Meyer。

我们仍然有必要了解文本分析方面的知识。用R语言来处理文本分析已经是公认的事实(详见R语言中的自然语言处理)。tm包算是其中成功的一部分:它是R语言在文本挖掘应用中的一个框架。它在文本清洗(词干提取,删除停用词等)以及将文本转换为词条-文档矩阵(dtm)方面做得很好。这里是对它的一个介绍。文本分析最重要的部分就是得到每个文档的特征向量,其中词语特征最重要的。当然,你也可以将单个词语特征扩展为双词组,三连词,n-连词等。在本篇文章,我们以单个词语特征为例做演示。

注意,在R中用ngram包来处理n-连词。在过去,Rweka包提供了函数来处理它,感兴趣的可以查看这个案例。现在,你可以设置RTextTools包中create_matrix函数的参数ngramLength来实现它。

第一步是读取数据:

创建词条-文档矩阵:

现在,我们可以用这个数据集来训练朴素贝叶斯模型。注意,e1071要求响应变量是数值型或因子型的。我们用下面的方法将字符串型数据转换成因子型:

测试结果准确度:

显然,这个结果跟python得到的结果是相同的(这篇文章是用python得到的结果)。

其它机器学习方法怎样呢?

下面我们使用RTextTools包来处理它。

首先,指定相应的数据:

其次,用多种机器学习算法训练模型:

现在,我们可以使用训练过的模型做测试集分类:

准确性如何呢?

得到模型的结果摘要(特别是结果的有效性):

结果的交叉验证:

结果可在我的Rpub页面找到。可以看到,maxent的准确性跟朴素贝叶斯是一样的,其它方法的结果准确性更差。这是可以理解的,因为我们给的是一个非常小的数据集。扩大训练集后,利用更复杂的方法我们对推文做的情感分析可以得到一个更好的结果。示例演示如下:

推文情感分析

数据来自victornep。victorneo展示的是用python对推文做情感分析。这里,我们用R来处理它:

读取数据:

首先,尝试下朴素贝叶斯

然后,尝试其他方法:

这里,我们也希望得到正式的测试结果。包括:

1.analytics@algorithm_summary:包括精确度,召回率,准确率,F-scores的摘要

2.analytics@label_summary:类标签摘要

3.analytics@document_summary:所有数据和得分的原摘要

4.analytics@ensemble_summary:所有 精确度/覆盖度 比值的摘要

现在让我们看看结果:

与朴素贝叶斯方法相比,其它算法的结果更好,召回精度高于0.95。结果可在Rpub查看

原文链接:http://www.xueqing.cc/cms/article/107

是的,明年一月股票价格属于逻辑回归问题。逻辑回归这个模型很神奇,虽然它的本质也是回归,但是它是一个分类模型,并且它的名字当中又包含”回归“两个字,未免让人觉得莫名其妙。

如果是初学者,觉得头晕是正常的,没关系,让我们一点点捋清楚。

让我们先回到线性回归,我们都知道,线性回归当中 y = WX + b。我们通过W和b可以求出X对应的y,这里的y是一个连续值,是回归模型对吧。但如果我们希望这个模型来做分类呢,应该怎么办?很容易想到,我们可以人为地设置阈值对吧,比如我们规定y >0最后的分类是1,y <0最后的分类是0。从表面上来看,这当然是可以的,但实际上这样操作会有很多问题。

最大的问题在于如果我们简单地设计一个阈值来做判断,那么会导致最后的y是一个分段函数,而分段函数不连续,使得我们没有办法对它求梯度,为了解决这个问题,我们得找到一个平滑的函数使得既可以用来做分类,又可以解决梯度的问题。

很快,信息学家们找到了这样一个函数,它就是Sigmoid函数,它的表达式是:

357572dfd95e096f6b1db8d0418b7666.png

它的函数图像如下:

3c9f8ea71dade02bee91d6837a9ab772.png

可以看到,sigmoid函数在x=0处取值0.5,在正无穷处极限是1,在负无穷处极限是0,并且函数连续,处处可导。sigmoid的函数值的取值范围是0-1,非常适合用来反映一个事物发生的概率。我们认为

σ(x) 表示x发生的概率,那么x不发生的概率就是 1 - σ(x) 。我们把发生和不发生看成是两个类别,那么sigmoid函数就转化成了分类函数,如果 σ(x) >0.5 表示类别1,否则表示类别0.

到这里就很简单了,通过线性回归我们可以得到

00f6409abfa62fff48ef6345454c1307.png

也就是说我们在线性回归模型的外面套了一层sigmoid函数,我们通过计算出不同的y,从而获得不同的概率,最后得到不同的分类结果。

损失函数

下面的推导全程高能,我相信你们看完会三连的(点赞、转发、关注)。

让我们开始吧,我们先来确定一下符号,为了区分,我们把训练样本当中的真实分类命名为y,y的矩阵写成 Y 。同样,单条样本写成 x , x 的矩阵写成 X。单条预测的结果写成 y_hat,所有的预测结果写成Y_hat。

对于单条样本来说,y有两个取值,可能是1,也可能是0,1和0代表两个不同的分类。我们希望 y = 1 的时候,y_hat 尽量大, y = 0 时, 1 - y_hat 尽量大,也就是 y_hat 尽量小,因为它取值在0-1之间。我们用一个式子来统一这两种情况:

4e1d139e638f22b1f7c3c34ec7ac1750.png

我们代入一下,y = 0 时前项为1,表达式就只剩下后项,同理,y = 1 时,后项为1,只剩下前项。所以这个式子就可以表示预测准确的概率,我们希望这个概率尽量大。显然,P(y|x) >0,所以我们可以对它求对数,因为log函数是单调的。所以 P(y|x) 取最值时的取值,就是 log P(y|x) 取最值的取值。

b493206f3f6ac1d18987cc2136d43e74.png

我们期望这个值最大,也就是期望它的相反数最小,我们令

bd1691f5ed6d3b14ad6678ea7ab4a73e.png

这样就得到了它的损失函数:

18ae4824989eb45abea1a568bb8afc0b.png

如果知道交叉熵这个概念的同学,会发现这个损失函数的表达式其实就是交叉熵。交叉熵是用来衡量两个概率分布之间的”距离“,交叉熵越小说明两个概率分布越接近,所以经常被用来当做分类模型的损失函数。关于交叉熵的概念我们这里不多赘述,会在之后文章当中详细介绍。我们随手推导的损失函数刚好就是交叉熵,这并不是巧合,其实底层是有一套信息论的数学逻辑支撑的,我们不多做延伸,感兴趣的同学可以了解一下。

硬核推导

损失函数有了,接下来就是求梯度来实现梯度下降了。

这个函数看起来非常复杂,要对它直接求偏导算梯度过于硬核(危),如果是许久不碰高数的同学直接肝不亚于硬抗苇名一心。

ade04cadcb25c9674f76ec1fa217eb85.png

为了简化难度,我们先来做一些准备工作。首先,我们先来看下σ 函数,它本身的形式很复杂,我们先把它的导数搞定。

77509348117bf958bd84c57fbbe2c048.png

因为 y_hat = σ(θX) ,我们将它带入损失函数,可以得到,其中σ(θX)简写成σ(θ) :

7cc17ea96bd209a6a71e30a89827553e.png

接着我们求 J(θ) 对 θ 的偏导,这里要代入上面对 σ(x) 求导的结论:

363b945b9b4cc57919d3d503c45c0ff6.png

代码实战

梯度的公式都推出来了,离写代码实现还远吗?

不过巧妇难为无米之炊,在我们撸模型之前,我们先试着造一批数据。

我们选择生活中一个很简单的场景——考试。假设每个学生需要参加两门考试,两门考试的成绩相加得到最终成绩,我们有一批学生是否合格的数据。希望设计一个逻辑回归模型,帮助我们直接计算学生是否合格。

为了防止sigmoid函数产生偏差,我们把每门课的成绩缩放到(0, 1)的区间内。两门课成绩相加超过140分就认为总体及格。

2d25f5bfaa9ec45a3089c4f12c201ccf.png

这样得到的训练数据有两个特征,分别是学生两门课的成绩,还有一个偏移量1,用来记录常数的偏移量。

接着,根据上文当中的公式,我们不难(真的不难)实现sigmoid以及梯度下降的函数。

2bf9363d9bb6a71a0e0e33a1234d5c7b.png

这段函数实现的是批量梯度下降,对Numpy熟悉的同学可以看得出来,这就是在直接套公式。

最后,我们把数据集以及逻辑回归的分割线绘制出来。

097c155cf08a23efc7d2e3d69b4704e2.png

最后得到的结果如下:

9db92f8f8681c247a6cba139152c5ca2.png

随机梯度下降版本

可以发现,经过了1万次的迭代,我们得到的模型已经可以正确识别所有的样本了。

我们刚刚实现的是全量梯度下降算法,我们还可以利用随机梯度下降来进行优化。优化也非常简单,我们计算梯度的时候不再是针对全量的数据,而是从数据集中选择一条进行梯度计算。

基本上可以复用梯度下降的代码,只需要对样本选取的部分加入优化。

cfd38e0b28894b1016968075e6a1bc3b.png

我们设置迭代次数为2000,最后得到的分隔图像结果如下:

6a1a9d6962bf1b801f0a8801883dec05.png

当然上面的代码并不完美,只是一个简单的demo,还有很多改进和优化的空间。只是作为一个例子,让大家直观感受一下:其实自己亲手写模型并不难,公式的推导也很有意思。这也是为什么我会设置高数专题的原因。CS的很多知识也是想通的,在学习的过程当中灵感迸发旁征博引真的是非常有乐趣的事情,希望大家也都能找到自己的乐趣。

今天的文章就是这些,如果觉得有所收获,请顺手点个关注或者转发吧,你们的举手之劳对我来说很重要。

相关资源:【原创】R语言对二分连续变量进行逻辑回归数据分析报告论文(代码...

文章知识点与官方知识档案匹配

算法技能树首页概览

33030 人正在系统学习中

打开CSDN,阅读体验更佳

VGG论文笔记及代码_麻花地的博客_vgg论文

VGG论文笔记及代码 VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 牛津大学视觉组(VGG)官方网站:https://www.robots.ox.ac.uk/~vgg/ Abstract 在这项工作中,我们研究了在大规模图像识别环境中卷积网络深度对其...

...MNIST研究》论文和Python代码_通信与逆向那些事的博客_机器...

1、逻辑回归算法 逻辑回归(Logistic Regression),与它的名字恰恰相反,它是一个分类器而非回归方法,在一些文献里它也被称为logit回归、最大熵分类器(MaxEnt)、对数线性分类器等。 使用sklearn.linear_model中的LogisticRegression方法来训练...

两个重要极限的推导

两个重要极限 (1) lim⁡θ→0sin⁡θθ=1 (θ为弧度) \underset{\theta \rightarrow 0}{\lim}\frac{\sin \theta}{\theta}=1\ \ \text{(}\theta \text{为弧度)} θ→0lim​θsinθ​=1 (θ为弧度) (2) lim⁡x→∞(1+1x)x=e \underset{x\rightarrow \infty}{\lim}\left( 1+\frac{1}{x} \ri

继续访问

两个重要极限及其推导过程

一、 证明:由上图可知, 即 二、 证明:首先证明此极限存在 构造数列 而对于n+1 ...

继续访问

...是多项式回归】Jeff Dean等论文发现逻辑回归和深度学习一样好_qq...

其中,基线 aEWS(augmented Early Warning Score)是一个有 28 个因子的逻辑回归模型,在论文作者对预测患者死亡率的传统方法 EWS 进行的扩展。而 Full feature simple baseline 则是 Uri Shalit 说的标准化逻辑回归。 注意到基线模型(红...

数学模型——Logistic回归模型(含Matlab代码)_苏三有春的博客...

Logistic回归模型是一种非常常见的统计回归模型,在处理大量数据,揭示各自变量如何作用于因变量(描述X与Y之间的关系)时有着十分重要的作用。笔者在写Logit回归模型前参加了一次市场调研比赛,在这次比赛中学到了很多东西,同时发现,许多优秀获...

《神经网络设计》第二章中传递函数

import math #硬极限函数 def hardlim(data): if data <0: a = 0 else: a = 1 print("fun:hardlim,result:%f"%a) #对称硬极限函数 def hardlims(data): if data <0: a = -1 e

继续访问

两个重要极限定理推导

两个重要极限定理: lim⁡x→0sin⁡xx=1(1) \lim_{x \rightarrow 0} \frac{\sin x}{x} = 1 \tag{1} x→0lim​xsinx​=1(1) 和 lim⁡x→∞(1+1x)x=e(2) \lim_{x \rightarrow \infty} (1 + \frac{1}{x})^x = e \tag{2} x→∞lim​(1+x1​)x=e(2) 引理(夹逼定理) 定义一: 如果数列 {Xn}\lbrace X_n \rbrace{Xn​},{Yn}

继续访问

【原创】R语言对二分连续变量进行逻辑回归数据分析报告论文(代码...

【原创】R语言对二分连续变量进行逻辑回归数据分析报告论文(代码数据).docx资源推荐 资源评论 鲸鱼算法(WOA)优化变分模态分解(VMD)参数python 5星 · 资源好评率100% 1.python程序 2.有数据集,可直接运行 matlab批量读取excel表格数据...

机器学习--逻辑回归_科技论文精讲的博客

机器学习-逻辑回归分析(Python) 02-24 回归和分类方法是机器学习中经常用到的方法区分回归问题和分类问题:回归问题:输入变量和输出变量均为连续变量的问题分类问题:输出变量为有限个离散变量的问题。因此分类及回归分别为研究这两类问题...

常见函数极限

lim⁡x→0sin⁡x=1\lim_{x\to 0}\frac{\sin}{x}=1x→0lim​xsin​=1 lim⁡x→∞(1+1x)x=e\lim_{x\to \infty}(1+\frac{1}{x})^x=ex→∞lim​(1+x1​)x=e lim⁡α→0(1+α)1α=e\lim_{\alpha\to 0}(1+\alpha)^\frac{1}{\alpha}=eα→0lim​(...

继续访问

逻辑回归原理及代码实现

公式自变量取值为任意实数,值域[0,1]解释将任意的输入映射到了[0,1]区间,我们在线性回归中可以得到一个预测值,再将该值映射到Sigmoid函数中这样就完成了由值到概率的转换,也就是分类任务预测函数其中,分类任务整合解释对于二分类任务(0,1),整合后y取0只保留,y取1只保留似然函数对数似然此时应用梯度上升求最大值,引入转换为梯度下降任务求导过程参数更新多分类的softmax。............

继续访问

python手写数字识别论文_Python利用逻辑回归模型解决MNIST手写数字识别问...

本文实例讲述了Python利用逻辑回归模型解决MNIST手写数字识别问题。分享给大家供大家参考,具体如下: 1、MNIST手写识别问题 MNIST手写数字识别问题:输入黑白的手写阿拉伯数字,通过机器学习判断输入的是几。可以通过TensorFLow下载MNIST手写数据集,...

逻辑回归问题整理_暮雨林钟的博客

逻辑回归问题整理 之前只是简单的接触过逻辑回归,今天针对于最近看论文的疑惑做一个整理逻辑回归与极大似然的关系: 逻辑回归的提出主要是在线性问题下为分类问题而提出的简单来说,针对于一个二分类问题,我们需要将线性函数映射为一...

机器学习算法-逻辑回归(一):基于逻辑回归的分类预测(代码附详细注释)

1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个字,但逻辑回归其实是一个分类模型,并且广泛应用于各个领域之中。虽然现在深度学习相对于这些传统方法更为火热,但实则这些传统方法由于其独特的优势依然广泛应用于各个领域中。 而对于逻辑回归而且,最为突出的两点就是其模型简单和模型的可解释性强。 逻辑回归模型的优劣势: 优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低; 缺点:容易欠拟合,分类精度可能不高 1.2

继续访问

逻辑回归:原理+代码

(作者:陈玓玏) 逻辑回归算是传统机器学习中最简单的模型了,它的基础是线性回归,为了弄明白逻辑回归,我们先来看线性回归。 一、线性回归 假设共N个样本,每个样本有M个特征,这样就产生了一个N*M大小的样本矩阵。令矩阵为X,第i个样本为Xi,第i个样本的第j个特征为Xij。令样本的观测向量为Y,第i个样本的观测值为Yi,那么就会有以下公式: (X+[1]N*1)*W = Y 也就是说,...

继续访问

浅谈逻辑回归_jzhx107的博客

LMSE回归的回归平面受左上角两个绿色样本的影响而向上倾斜。 支持向量机的分离平面只由两个支持向量决定。 另外我们看到,在本例中逻辑回归和支持向量机得到的分离平面很接近,但是支持向量机的推导和训练过程要比逻辑回归复杂很多。所以加州...

论文研究-基于HBase的多分类逻辑回归算法研究.pdf_多分类逻辑回归...

论文研究-基于HBase的多分类逻辑回归算法研究.pdf,为解决在大数据环境下,用于训练多分类逻辑回归模型的数据集可能会超过执行计算的客户端内存的问题,提出了块批量梯度下降算法,用于计算回归模型的系数。将训练数据集存入HBase后,通过设置表...

【机器学习】 逻辑回归原理及代码

大家好,我是机器侠~1 Linear Regression(线性回归)在了解逻辑回归之前,我们先简单介绍一下Linear Regression(线性回归)。线性回归是利用连续性的变量来预估实际数值(比如房价),通过找出自变量与因变量之间的线性关系,确定一条最佳直线,称之为回归线。并且,我们将这个回归关系表示为2 Logistic Regression(...

继续访问

最新发布 【大道至简】机器学习算法之逻辑回归(Logistic Regression)详解(附代码)---非常通俗易懂!

逻辑回归详细推导,附github代码

继续访问

第二重要极限公式推导过程_机器学习——一文详解逻辑回归「附详细推导和代码」...

在之前的文章当中,我们推导了线性回归的公式,线性回归本质是线性函数,模型的原理不难,核心是求解模型参数的过程。通过对线性回归的推导和学习,我们基本上了解了机器学习模型学习的过程,这是机器学习的精髓,要比单个模型的原理重要得多。新关注和有所遗忘的同学可以点击下方的链接回顾一下之前的线性回归和梯度下降的内容。讲透机器学习中的梯度下降机器学习基础——线性回归公式推导(附代码和演示图)回归与分类在机器学习...

继续访问

机器学习之逻辑回归,代码实现(附带sklearn代码,小白版)

用小白的角度解释逻辑回归,并且附带代码实现

继续访问

热门推荐 两个重要极限及相关推导极限

两个重要极限: ①limx→0sinxx=1\lim_{x \to 0}\frac{\sin x}{x} = 1 ②limx→∞(1+1x)x=e\lim_{x \to \infty}(1 + \frac{1}{x})^x = e 关于重要极限①的推导极限可以参考: 无穷小的等价代换 由重要极限②可以推导出: limx→∞(1+1x)x⇒limx→0(1+x)1x=e\lim_{x \t

继续访问

(一)机器学习——逻辑回归(附完整代码和数据集)

什么是逻辑回归? 首先逻辑回归是一种分类算法。逻辑回归算法和预测类算法中的线性回归算法有一定的类似性。简单来讲,逻辑回归,就是通过回归的方法来进行分类,而不是进行预测,比如预测房价等。 逻辑回归解决的问题 先看下面的图,已知平面上分布的红点和蓝点,逻辑回归算法就是解决怎么根据一系列点,计算出一条直线(或者是平面)将平面上的点分成两类,一般的解决方法就是建立一个数学模型,然后通过迭代优化得到一个最优...

继续访问

机器学习:逻辑回归及其代码实现

一、逻辑回归(logistic regression)介绍 逻辑回归,又称为对数几率回归,虽然它名字里面有回归二字,但是它并不像线性回归一样用来预测数值型数据,相反,它一般用来解决分类任务,特别是二分类任务。 本质上,它是一个percetron再加上一个sigmoid激活函数,如下所示: 然后逻辑回归采用的损失函数是交叉熵: ...

继续访问

逻辑回归,原理及代码实现

Ⅰ.逻辑回归概述: 逻辑回归(LR,Logistic Regression)是传统机器学习中的一种分类模型,它属于一种在线学习算法,可以利用新的数据对各个特征的权重进行更新,而不需要重新利用历史数据训练。因此在实际开发中,一般针对该类任务首先都会构建一个基于LR的模型作为Baseline Model,实现快速上线,然后在此基础上结合后续业务与数据的演进,不断的优化改进。 由于LR算法具有简单、高效、易于并行且在线学习(动态扩展)的特点,在工业界具有非常广泛的应用。例如:评论信息正负情感分析(二分类)、用户点

继续访问

逻辑(logistic)回归算法原理及两种代码实现

①简单介绍了逻辑回归的原理 ②介绍了两种代码实现方法

继续访问

由两个重要极限推导常见等价无穷小以及常见导数公式

两个重要极限 第一个重要极限 lim⁡x→0xsinx=1 \lim_{x\rightarrow0}\frac{x}{sinx}=1x→0lim​sinxx​=1 第二个重要极限 lim⁡x→+∞(1+1x)x=e \lim_{x\rightarrow+\infty}(1+\frac{1}{x})^x=ex→+∞lim​(1+x1​)x=e 等价无穷小 1. ln(1+x)~x lim⁡x→0ln(1+x)x=lim⁡x→0ln(1+x)1x=ln(lim⁡x→+∞(1+1x)x)=lne=1 \lim_{

继续访问

机器学习——逻辑回归算法代码实现

机器学习——逻辑回归算法代码实现前言一、逻辑回归是什么?二、代码实现1.数据说明2.逻辑回归代码 前言 最近准备开始学习机器学习,后续将对学习内容进行记录,该文主要针对逻辑回归代码实现进行记录!同时也准备建一个群,大家可以进行交流,微信:ffengjixuchui 一、逻辑回归是什么? 逻辑回归概念篇可看博主之前的文章,传送门 二、代码实现 1.数据说明 你想根据两次考试的结果来决定每个申请人的录取机会。你有以前的申请人的历史数据,你可以用它作为逻辑回归的训练集。