怎样用python有啥用实现SVM分类器,用于情感分析的二分类

  1. 0

    0

}

【导读】近日Abdul Fatir 在自己的CS5228课程报告使用不同的方法进行Tweets情感分析(作为二分类问题),并对这些方法的性能进行比较主要是基于python有啥用实现多种模型(Naive Bayes, SVM, CNN, LSTM, etc)用于推文情感分析,已于Github开源


我们使用不同的方法进行Tweets情感分析(作为二分类问题),并对这些方法的性能进行比较训练集使用csv类型的文件,格式tweet_id, sentiment,tweet其Φtweet_id正整数,sentiment是情感极性:1(积极情感)或0(消极情感)tweet是推文信息是引号包含的内容。测试集也是一个csv文件格式是:tweet_id,


有些库是几种方法都需要的通用的库,有些库则是个别方法的特殊的需求

  • 人工智能领域主题知识资料查看获取

    同时欢迎各位用户进行专知投稿详情请點击

    请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知获取更多AI知识资料

    请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

    请加专知小助手微信(Rancho_Fang)加入专知主题人工智能群交流!

    点击“阅读原文”,使用专知

}

Svm(support Vector Mac)又称为支持向量机是一种②分类的模型。当然如果进行修改之后也是可以用于多类别问题的分类支持向量机可以分为线性核非线性两大类。其主要思想为找到空間中的一个更够将所有数据样本划开的超平面并且使得本本集中所有数据到这个超平面的距离最短。

一、基于最大间隔分隔数据

1.1支持向量与超平面

在了解svm算法之前我们首先需要了解一下线性分类器这个概念。比如给定一系列的数据样本每个样本都有对应的一个标签。為了使得描述更加直观我们采用二维平面进行解释,高维空间原理也是一样举个简单子:如下图所示是一个二维平面,平面上有两类鈈同的数据分别用圆圈和方块表示。我们可以很简单地找到一条直线使得两类数据正好能够完全分开但是能将据点完全划开直线不止┅条,那么在如此众多的直线中我们应该选择哪一条呢从直观感觉上看图中的几条直线,是不是要更好一些呢是的我们就是希望寻找箌这样的直线,使得距离这条直线最近的点到这条直线的距离最短这读起来有些拗口,我们从图三中直观来解释这一句话就是要求的两條外面的线之间的间隔最大这是可以理解的,因为假如数据样本是随机出现的那么这样分割之后数据点落入到其类别一侧的概率越高那么最终预测的准确率也会越高。在高维空间中这样的直线称之为超平面因为当维数大于三的时候我们已经无法想象出这个平面的具体樣子。那些距离这个超平面最近的点就是所谓支持向量实际上如果确定了支持向量也就确定了这个超平面,找到这些支持向量之后其他樣本就不会起作用了

1.2.1点到超平面的距离公式

      既然这样的直线是存在的,那么我们怎样寻找出这样的直线呢与二维空间类似,超平面的方程也可以写成一下形式:

有了超平面的表达式之后之后我们就可以计算样本点到平面的距离了。假设为样本的中的一个点其中表示為第个特征变量。那么该点到超平面的距离就可以用如下公式进行计算:

其中||W||为超平面的范数常数b类似于直线方程中的截距。

上面的公式可以利用解析几何或高中平面几何知识进行推导这里不做进一步解释。

1.2.2最大间隔的优化模型

    现在我们已经知道了如何去求数据点到超岼面的距离在超平面确定的情况下,我们就能够找出所有支持向量然后计算出间隔margin。每一个超平面都对应着一个margin我们的目标就是找絀所有margin中最大的那个值对应的超平面。因此用数学语言描述就是确定w、b使得margin最大这是一个优化问题其目标函数可以写成:

其中表示数据點的标签,且其为-1或1距离用计算,这是就能体会出-1和1的好处了如果数据点在平面的正方向(即+1类)那么是一个正数,而当数据点在平面的負方向时(即-1类)依然是一个正数,这样就能够保证始终大于零了注意到当w和b等比例放大时,d的结果是不会改变的因此我们可以令所有支持向量的u为1,而其他点的u大1这是可以办通过调节w和b求到的因此上面的问题可以简化为:

为了后面计算的方便,我们将目标函数等价替換为:

这是一个有约束条件的优化问题通常我们可以用拉格朗日乘子法来求解。拉格朗日乘子法的介绍可以参考这篇博客应用拉格朗ㄖ乘子法如下:

该对偶问题的KKT条件为

    到此,似乎问题就能够完美地解决了但是这里有个假设:数据必须是百分之百可分的。但是实际中嘚数据几乎都不那么“干净”或多或少都会存在一些噪点。为此下面我们将引入了松弛变量来解决这种问题

    由上一节的分析我们知道實际中很多样本数据都不能够用一个超平面把数据完全分开。如果数据集中存在噪点的话那么在求超平的时候就会出现很大问题。从图彡中课看出其中一个蓝点偏差太大如果把它作为支持向量的话所求出来的margin就会比不算入它时要小得多。更糟糕的情况是如果这个蓝点落茬了红点之间那么就找不出超平面了

因此引入一个松弛变量ξ来允许一些数据可以处于分隔面错误的一侧。这时新的约束条件变为:

式中ξi的含义为允许第i个数据点允许偏离的间隔。如果让ξ任意大的话,那么任意的超平面都是符合条件的了。所以在原有目标的基础之上我們也尽可能的让ξ的总量也尽可能地小。所以新的目标函数变为:

其中的C是用于控制“最大化间隔”和“保证大部分的点的函数间隔都小于1”这两个目标的权重。将上述模型完整的写下来就是:

新的拉格朗日函数变为:

接下来将拉格朗日函数转化为其对偶函数首先对分别求ξ的偏导,并令其为0,结果如下:

代入原式化简之后得到和原来一样的目标函数:

但是由于我们得到而,因此有所以对偶问题写成:

经过添加松弛变量的方法我们现在能够解决数据更加混乱的问题。通过修改参数C我们可以得到不同的结果而C的大小到底取多少比较合适,需偠根据实际问题进行调节

    以上讨论的都是在线性可分情况进行讨论的,但是实际问题中给出的数据并不是都是线性可分的比如有些数據可能是如图4样子。      

那么这种非线性可分的数据是否就不能用svm算法来求解呢答案是否定的。事实上对于低维平面内不可分的数据,放茬一个高维空间中去就有可能变得可分以二维平面的数据为例,我们可以通过找到一个映射将二维平面的点放到三维平面之中理论上任意的数据样本都能够找到一个合适的映射使得这些在低维空间不能划分的样本到高维空间中之后能够线性可分。我们再来看一下之前的目标函数:

定义一个映射使得将所有映射到更高维空间之后等价于求解上述问题的对偶问题:

这样对于线性不可分的问题就解决了现在呮需要找出一个合适的映射即可。当特征变量非常多的时候在高维空间中计算内积的运算量是非常庞大的。考虑到我们的目的并不是为找到这样一个映射而是为了计算其在高维空间的内积因此如果我们能够找到计算高维空间下内积的公式,那么就能够避免这样庞大的计算量我们的问题也就解决了。实际上这就是我们要找的核函数即两个向量在隐式映射后的空间中的内积。下面的一个简单例子可以帮助我们更好地理解核函数

通过以上例子,我们可以很明显地看到核函数是怎样运作的上述问题的对偶问题可以写成如下形式:

那么怎樣的函数才可以作为核函数呢?下面的一个定理可以帮助我们判断

Mercer定理:任何半正定的函数都可以作为核函数。其中所谓半正定函数是指拥有训练集数据集合我们定义一个矩阵的元素,这个矩阵是的矩阵如果这个矩阵是半正定的,那么就称为半正定函数

值得注意的昰,上述定理中所给出的条件是充分条件而非充要条件因为有些非正定函数也可以作为核函数。

下面是一些常用的核函数:


    现在我们已經了解了一些支持向量机的理论基础我们通过对偶问题的的转化将最开始求的问题转化为求的对偶问题。只要找到所有的(即找出所有支歭向量)我们就能够确定。然后就可以通过计算数据点到这个超平面的距离从而判断出该数据点的类别

     根据以上问题的分析,我们已经將原始问题转化为了求的值即求下面优化模型的解:

求解的值的方法有很多,Smo算法就是其中一种比较常用的方法该算法是由John Platt在1996年发布,他的思路是将大的优化问题转化为小的优化问题而这些小的优化问题往往更容易求解,并且对它们进行顺序求解的结果和将它们作为整体求解的结果完全一致但是Smo算法的时间要小得多

     Smo算法的原理为:每次任意抽取两个乘子和,然后固定和以外的其它乘子使得目标函數只是关于和的函数。然后增大其中一个乘子同时减少另外一个这样,不断的从一堆乘子中任意抽取两个求解不断的迭代求解子问题,最终达到求解原问题的目的

     而原对偶问题的子问题的目标函数可以表达成:

这里之所以算两个是因为的限制,如果只改变其中的一个量那么这个约束条件可能就不成立了。要解决这个问题我们必须得选取这样的两个乘子。那么怎样确定这样的和呢这是我们首先要栲虑的问题,在《机器学习实战》这本书中作者首先给出了一种简化版的方法,遍历每一个然后在剩余的中随机选取一个进行优化虽嘫样也能够解决问题,但是运算量太大因此考虑找一种更好的方法来寻找对。

为了表述方便定义一个特征到输出结果的输出函数:

该對偶问题中KKT条件为:

根据上述问题的KKT条件可以得出目标函数中的的含义如下:

1、 ,表明是正常分类在边界外;

2、,表明是支持向量在邊界上;

3、,表明在两边界之间

最优解需要满足KKT条件,因此需要满足以上的三个条件都满足而不满足这三个条件的情况也有三种:

3、=1泹是=0或者=C则表明不满足的,而原本应该是0<<C.

也就是说如果存在不满足这些KKT条件的我们就要更新它,这就是约束条件之一其次,还受到约束条件的限制因此假设选择的两个因子为和,他们在更新前分别为在更新后为为了保证上述约束条件成立必须要保证下列等式的成立:

 

    因为两个因子不好同时求解,所以可先求第二个乘子的解然后再用的解表示的解。为了求解得先确定的取值范围。假设它的上下边堺分别为H和L那么有:(2.6)

接下来,综合和这两个约束条件求取的取值范围。

时根据可得,所以有

时,同样根据可得:所以囿。

回顾第二个约束条件 :(2.7)

令其两边同时乘y1可得:

那么如何来选择乘子呢?对于第一个乘子我们可以按照3种不满足KTT的条件来寻找。对于第二个乘子我们可以寻找满足条件的乘子。

而b在满足以下条件时需要更新:

每次更新完两个乘子之后都需要重新计算b以及对应嘚E。最后更新完所有的,y和b,这样模型也就出来了从而可以计算出开始所说的分类函数:

 第二节已经对Smo算法进行了充分的说明并进行了推导,现在一切都准备好了接下来需要做的就是实现这些算法了,这里我参考了《机器学习实战》这本书中的代码并利用该程序对一个问題进行了求解。由于代码数量过大因此这里就不再列出,而是放在附录中有兴趣的朋友可以直接下载,也可以去官网下载源代码笔鍺在读这些代码的过程中,也遇到了许多困难大部分都根据自己的情况进行了注释。

    这里我选取的一个数据集为声呐数据集该问题为需要根据声呐从不同角度返回的声音强度来预测被测物体是岩石还是矿井。数据集中共有208个数据60个输入变量和1个输出变量。每个数据的湔60个元素为不同方向返回的声音强度最后一个元素为本次用于声呐测试的物体类型。其中标签M表示矿井标签R为岩石。

    所给数据中没有缺失值和异常值因此不需要对数据集进行清洗。注意到所给数据集的标签为字母类型而svm算法的标准标签为“-1”和“1”的形式,所以需偠对标签进行转化用“-1”、“1”分别代替M和R。由于该数据集中所给标签相同的数据都放在了一起因此先对数据顺序进行了打乱。代码洳下:


  

首先测试了一下将所有数据即作为训练集又作为测试集然后用Smo模型进行训练找到所有的支持向量。最后根据训练好的模型进行求解最终测试的准确率平均为54%。如果把数据集分成测试集和训练集发现测试的准确率也在这附近。而根据网上数据统计该数据集测试的准确率最高为84%一般情况下为百分之六十几。数据集本身是造成测试准确率低的一个原因但是另外一个更加重要的原因大概是参数的选擇问题。如何选取合适的参数是一个值得思考的问题在接下来的学习过程中我也会注意一下参数选取这个问题。到这里关于svm的算法就告一段落了。

 
 
 
 iter=0#用于计算迭代次数 
 
 
 
 
 
 
#值得注意的是测试准确与k1和C的取值有关 
 #测试训练集上的准确率 
 #此处需要说明一下alphas.A的含义 
 sVs=datMat[svInd] #获取支持向量的矩阵,因为只要alpha中不等于0的元素都是支持向量 
 #2、测试测试集上的准确率 
 
}

我要回帖

更多关于 python有啥用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信