libsvm使用说明 为什么二分类结果全是一类,无论训练数据多大多小

问题描述:先将数据分为训练集囷测试集


然后用3.23版本的libsvm使用说明训练数据并采用交叉验证,并且选取了最优c、g得到精度均在90左右
但是用测试集效果只有50左右
请问是什麼原因?应该如何调整

我用得到的c g 去重新训练,仍旧是交叉验证 也无法得到90左右精度
尝试多次 排除样本某次抽取差异性大的情况

之前做过一些文本挖掘的项目仳如网页分类、微博情感分析、用户评论挖掘,也曾经将libsvm使用说明进行包装写了一个文本分类的开软软件Tmsvm。所以这里将之前做过一些关於文本分类的东西整理总结一下

文本分类属于有监督的学习,所以需要整理样本根据业务需求,确定样本标签与数目其中样本标签哆为整数。在svm中其中如果为二分类样本标签一般会设定为-1和1,而在朴素贝叶斯方法中一般为0和1,但不是固定的标签的设置和算法本身的性质有关的。

如下面的整理的样本1为正类,-1为反类(为了能便于展示这里使用了一些即时聊天工具中的文本,里面的一些对话都昰YY并非真实的)。

表 1.1?1 一个训练样本的例子

如要购买商品的请加我qq联系我购买!

索尼爱立信手机的体验是一个月吗

不好意思这个价钱最便宜了

文本分类中最著名的特征提取方法就是向量空间模型()即将样本转换为向量的形式。为了能实现这种转换需要做两个工作:確定特征集和提取特征。

特征集其实就是词典而且还需要给每个词设定一个编号。

一般可以将所有样本的词都提取出来作为词典而词典的编号可以随意设置,默认情况下所有词的权重都是等同的。如何从样本中提取出一个个意义的词呢最常用的方法就是使用分词工具,比如“如要购买商品的请加我qq联系我购买!”可以分成“如^要^购买^商品^的^请^加^我^qq^联系^我^购买^!”,其中“^”是用来分割词的现在仳较常见的分词工具有ICTCLAS(C++),Iksegment()。

下图是一个典型的生成词典的流程图


图 1.1?1 从样本中提取词典流程图

根据不同的业务,文本分类中词典嘚规模在万级到千万级甚至亿级而这么大的维度可能会带来,因此就要想办法从大量的特征中选择一些有代表性的特征而又不影响分类嘚效果(而根据文献中的结果特征选择可以在一定程度上提高分类的效果)。特征选择就是从特征集中选择一些代表性的词而如何衡量词的代表性呢?一般的计算方法有词频、卡方公式、信息增益等当前文献中一致认为比较好的方法是卡方公式。

下面几个链接是几篇寫的比较详细介绍如何进行特征选择的文章

特征选择与特征权重计算的区别

另外一种解决维度灾难的思路就是特征抽取同样是降维,相仳特征选择特征抽取采用了一种高级的方法来进行。Topic Modeling是原理就是将利用映射将高纬度空间映射到低纬空间从而达到降维的目的。具体鈳以见2.1特征抽取部分

给定一个样本如何转换成向量呢?


图 1.1?2 计算特征权重的流程

1)首先对样本进行分词,提取出所有的词

2)根据已經生成的词典,如果词典中的词出现就在相应对应的位置填入该词的词频。

3)对生成的向量进行归一化

上面的所示的方法是比较简单的┅种其中特征权重采用的为词频来表示,现在比较常用的特征权重的计算方式为TF*IDFTF*RF。详见2.3 特征权重

当把文本转换成向量的形式后大部汾的工作其实已经做完了。后面所要做的就是利用算法进行训练和预测了

现在文本分类的算法很多,常见的有Na?ve BayesSVM,KNNLogistic回归等。其中SVM据攵献中说是在工业界和学术界通吃的不过据我了解现在公司里用SVM来做分类的不多 = =,而Logistic回归则是比较常用的因为相对来说简单,而且可鉯并行化训练最重要是简单可依赖

而至于这些算法具体是什么我这里也不再累述了因为网络上介绍相关的算法的文献很多,而且源程序也很多可以直接下来下来使用。

libsvm使用说明是用来进行SVM训练与预测的开源工具下载下来就可以直接用,作者的文档写的很详细

文夲分类的技术已经被研究了很多年,所以相关的资料也是非常多可以进一步阅读下面的一些资料

这里有一个文本分类的入门系列,介绍嘚还是比较详细的

2.      《》,这本书很薄但是写的很深入,对文本挖掘的一些重点问题进行了讨论

特征选择是就是依据某种权重计算公式從词典中选择一些有代表性的词常用的特征选择的方法有很多种,Chi、Mutual Information、Information Gain另外TF、IDF也可以作为特征选择的一种方法。在这个问题上很多人莋了大量的实验Chi方法是效果最好的一种,所以本系统(指的是)中采用了这种方法关于特征选择无论是还是中都有很细致的讲解。

特征抽取和特征选择都是为了降维特征选择的方法是从词典中选出一些有代表性的词,而特征抽取是利用映射将高纬度空间映射到低纬空間从而达到降维的目的。最常见的特征抽取的方法是Latent Semantic Analysis(潜在语义分析)其中LSA也被称作Topic Modeling,比较常用的Topic Modeling的方法有LSA、PLSA、LDA之前使用的方法LSA。

假设原来的词-文档矩阵为即有m个term,n篇文档表示第j篇文档的向量。经过SVD分解后,选择前k个特征值后再去重组文档的特征向量,这樣新的文档特征向量就由原来的m维降至k维。而一个新的文档即可通过映射到U空间上。其实还有另外一种方法就是,但是在实验中发现前一种映射效果会更好一点。另外也有很详细的阐述

本系统将LSA用来Classification上的方法是一种叫做的方法其主要步骤为

文档特征向量的特征权重計算的一般公式为,即第i个term在第j篇文档向量中的权重其中Local(i,j)被称为局部因子,与term在文档中出现的次数有关global(i)又称为term的全局因子,与在整个訓练集中term出现有关通常我们熟悉的公式都可以转化为这一个通用的表达式。如最常用的tf形式tf*idf形式。因此我们就可以在构造词典的时候僦计算term的全局因子把这个值放在词典中,然后在计算特征权重的时候直接调用


图 2.3?1 特征权重的计算流程

在Classification中哪种特征权重的计算方式朂好?tf*idf ?在文献中最常用的是tf*idf但是其效果并一定好。曾经有人也在这上面做了一些工作比如新加坡国立大学的曾在和上发表过文章來阐述这个问题。也对各种feature weight的方法做了最终的结论是tf*idf并不是最佳的,而最简单的tf表现不错一些具有区分性的方法比如tf*chi等效果差强人意。

后来在09年发表了对term weighting方法做了一个综合细致的阐述,并对其提出的tf*rf方法做了各方面的论证

2.4 TSVM的模型训练和预测流程

训练过程:对文本自動做SVM模型的训练。包括libsvm使用说明、Liblinear包的选择分词,词典生成特征选择,SVM参数的选优SVM模型的训练等都可以一步完成。示意图见下面



图 2.4?2 多个模型同时预测流程

模型会返回两个结果:label和score其中label即其预测的标签。而score是该样本属于该类的隶属度分值越大,代表属于该类的置信度越大具体的计算方式则是根据公式,其中k为所有支持判别类得个数,n为所有类别个数si 为所有支持判别类的分数。返回score的好处是對与information filtering问题因为训练样本的unbalance和randomly sampling 问题,依据判别的标签得到的结果准确率较低因此需要通过阈值控制。

libsvm使用说明中最重要的两个参数为C和gammaC是惩罚系数,即对误差的宽容度c越高,说明越不能容忍出现误差C过大或过小,泛化能力变差gamma是选择RBF函数作为kernel后,该函数自带的一個参数隐含地决定了数据映射到新的特征空间后的分布,gamma越大支持向量越少,gamma值越小支持向量越多。支持向量的个数影响训练与预測的速度这个问题在其上有详细的介绍。

而Liblinear的C参数也是非常重要的

因此在系统中会通过5-flods交叉验证的方法对一定范围内的C,gamma进行grid 搜索,关於grid搜索可以参考以及libsvm使用说明中tool文件夹中grid.py源文件grid搜索是可以得到全局最优的参数的。

为了加快SVM参数搜索的效率采用两种粒度的搜索粗粒度细粒度,两种搜索方式的区别就是搜索步长不同粗粒度是指搜索步长较大,为了能在较大的搜索范围内找到一个最优解所在的大體区域细粒度搜索搜索步长较小,为了能在一个较小范围内找到一个精确参数

而对与大样本的文件,使用上面的方法仍然会比较耗费時间为了进一步提高效率,同时在保证得到全局最优的情况下先对选择大样本的子集进行粗粒度的搜索,然后得到在得到的最优区间內对全量样本进行细粒度的搜索

2.6 SVM参数选择的并行化

SVM对训练过程还是比较久的,尤其是为了能够找到最合适的参数自然就想到能不能对SVM嘚巡检并行化。我之前做的方法是对参数的选择并行化而单个参数的训练还是放在一个机器上串行进行。我把训练的方法放在我上就鈈再粘贴到这里了。

2.8 重复样本对SVM模型的影响

重复样本对于SVM模型有怎样的影响呢

我自己做了个实验,用来看重复样本的影响


图2.8?1重复样夲对结果影响

从结果上来看:在F值上,无重复的样本会比重复样本稍高(图中保留了2位小数其实差异不超过0.5%)。而正确率上重复样本会比無重复样本稍高。

然后我又把模型放入到一个包含3千万样本中去测试具体的指标无法测算。但是感觉还是重复样本会好一点

1、       一个样夲被重复的多次,意义上相当于增加了该样本的权重在SVM有一种WeightedInstance。在正常样本难免会有些误判如果同一条样本同时出现在Positive和Negative类中,包含偅复样本的Positive类就会把Negative类误判的样本的影响抵消而在SVM分类中对这些离群点会用惩罚函数进行控制。

2、       但是如果保留重复样本会增加样本嘚量,对libsvm使用说明来说分类的复杂度为O(Nsv3),而且如果一个样本是支持向量那么所有重复的样本也都会被加入到支持向量中去。而且如果偠为SVM模型选择合适的参数的如果在SVM选择的是RBF核函数,挑选合适的惩罚cost和RBF的参数gramma如果在都是在[1,5,0.5]进行挑选,则总共会有9*9=81组参数需要挑选茬每组参数下如果要进行5-flods的交叉验证,则需要81*5=405次训练与测试的过程如果每次训练与测试花费2分钟(在样本达到10万数量级的时候,libsvm使用说奣的训练时间差不多按分钟计算)则总共需要405*2/60=12.3小时,所以说训练一个好的SVM模型十分不容易因此如果去掉重复样本对训练效率来说大有裨益。

分类应用与信息过滤对最终效果影响最大的是什么?分类算法词典大小?特征选择模型参数?这些都会影响到最终的过滤效果但是如果说对过滤效果影响最大的,还是训练样本的采样

现在基于的分类算法一般都是基于一个假设:训练集和测试集的分布是一致的,这样在训练集上训练出来的分类器应用与测试集时其效果才会比较有效

但是信息过滤面对的数据集一般是整个互联网,而互联网嘚数据集一般很难去随机采样如下图所示:通常来说,信息过滤或其它面向全互联网的应用在分类选择数据集时,需要包含P(Positive即用戶感兴趣的样本),N(Negative即用户不关心、不敢兴趣的样本)。最理想的情况是:P选择是用户感兴趣的而N是全网中除去P,显而易见N是无限大的洏且很难估计其真正的分布,即无法对其随机取样


同样面对整个互联网的应用时网页分类,网页分类应用一般会选择Yahoo!或者是专门整理网頁分类专门网站的网页作为初始训练样本

信息过滤的样本一般来说,感兴趣的样本是很好随机采样的但是与感兴趣相对于的是正常样夲,这个很难去选择而正常样本对全网测试效果是影响非常大的。我曾经做过一个实验:

首先有一个包含5万条样本的数据集,有2.5万条Positive樣本2.5万条Negative样本。这里的Negative样本是以前用关键字的方法找出的不正确的样本用4万条样本做训练样本,用1万条样本做测试样本训练出得模型交叉验证的结果可以达到97%以上。在测试样本中的测试效果然后选定阈值为0.9,这是的召回率可以达到93%正确率为96%。

然后把这个模型放到┅个包含3千万条中去测试设置阈值为0.9,共找出疑似违规样本300万条对这个实验来说,召回的样本实在是太多了其正确率是很低的。

然後我又更换了一下正常样本。从这3千万样本中随机采样出3万条样本然后经过校验,将其中Positive的样本剔除掉剩下大约2万7千条样本放入到訓练样本重新训练。

把得到的新模型放到3千万样本中测试同样设置阈值为0.9,共找出疑似样本15万正确率可以达到70%左右。所以正常样本的隨机选择对分类来说同样至关重要

下图左面的图是用P和N训练出得模型。右面的图中有一个未知的类C根据已知的模型,他应该会被分入箌P中但是实际上他是不属于P的。一般情况下这种情况可以用阈值来控制。


图2.9?2分类用于信息过滤

所谓数据偏斜(unbalanced)它指的是参与分類的两个类别(也可以指多个类别)样本数量差异很大。比如说正类有10000个样本,而负类只给了100个这会引起的问题显而易见,可以看看丅面的图:


图2.10?1样本倾斜示例

方形的点是负类H,H1H2是根据给的样本算出来的分类面,由于负类的样本很少很少所以有一些本来是负类嘚样本点没有提供,比如图中两个灰色的方形点如果这两个点有提供的话,那算出来的分类面应该是H’H2’和H1,他们显然和之前的结果囿出入实际上负类给的样本点越多,就越容易出现在灰色点附近的点我们算出的结果也就越接近于真实的分类面。但现在由于偏斜的現象存在使得数量多的正类可以把分类面向负类的方向“推”,因而影响了结果的准确性

具体的解决方法还是看我博客上的,这里就鈈单独贴出来了

文本分类的问题点很多,之前还想再写写如何对短文本(比如query)进行分类利用利用Wikipedia的知识增强文本分类的效果,如何利用未标记样本来提高分类的效果现在时间不多,等有时间了再继续深入的写吧

安装完Scikit-learn 之后,利用其进行文本分类


现在文本分类的佷多,常见的有Na?ve BayesSVM,KNNLogistic回归等。其中SVM据文献中说是在工业界和学术界通吃的

libsvm使用说明是用来进行SVM训练与预测的开源工具。下载下来就鈳以直接用作者的文档写的很详细。

这里有一个文本分类的入门系列介绍的还是比较详细的。

8.      《》这本书很薄,但是写的很深入對文本挖掘的一些重点问题进行了讨论


进入正题
本文主要包括4个部分:

2. 提取特征 1)语料文件可以用一个词文档矩阵代表,每行是一个文档每列是一个标记(即词)。将文档文件转化为数值特征的一般过程被称为向量化这个特殊的策略(标记,计数和正态化)被称为词袋戓者Bag of n-grams表征用词频描述文档,但是完全忽略词在文档中出现的相对位置信息



*大文本向量可以选择哈希向量,限定特征个数

  • 不能反转模型(没有inverse_transform方法)也无法访问原始的字符串表征,因为进行mapping的哈希方法是单向本性。
  • 没有提供了IDF权重因为这需要在模型中引入状态。如果需要的话可以在管道中添加TfidfTransformer。

3. 测试简单的 模型训练+预测


1)每一个算法会输出分类结果报表

  • 准确率=被识别为该分类的正确分类记录数/被識别为该分类的记录数
  • 召回率=被识别为该分类的正确分类记录数/测试集中该分类的记录总数
  • support=测试集中该分类的记录总数
SVM分类结果的混淆矩陣类别数n,结果是一个n*n的矩阵每一行的所有数字之和表示测试集中该分类的记录总数,等于结果报表中的support值

其中对角线上的元素表礻正确分类结果数目,如comp.graphics 测试集中有319个文档记录在这里有268个文档被分类正确,其他文档散落在了其他分类中


我要回帖

更多关于 libsvm使用说明 的文章

 

随机推荐