文本分类——K-Nearest Neighbor
1 关于k-Nearest Neighbor算法
KNN算法的基本思路:存在一个预先选定并且人工标注好类别的训练集合,给定一个新的文本,需要计算这个新文本与训练集合中每个文本的相似度,选出其中相似度最大的K个文本,然后在这K个文本中找出类别最多的一个类作为最后新文本的所属类别。可以形式化的描述如下:
其中Sim(X,d) 为新样本和训练集中文档d的相似度,f(d,c)为文档d的类别函数,取值0或1. 从公式可以看出,最重要的就是相似度函数了。
2 文本相似度函数
文本的相似度函数也可以称为距离函数,是用来衡量两个文本的相近程度,距离越小那么就越相近反之也是成立。对于距离函数的介绍网上的介绍资料非常之多。自行google或者百度一下就能发现不少。 这里仅介绍下比较流行的两种距离函数——cosine距离函数和欧式距离函数。
Cosine距离和欧式距离的计算都是基于数据的VSM表示模型。对于这两个距离可以用这样一张图来直观表达。
![本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁 本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁](http://img0.ph.126.net/kPY8Nks23dQgm3oV4tPdjA==/6598100009051547610.jpg)
Cosine距离计算的就是向量AB和向量AC之间夹角的余弦值,值越大(趋近于1)那么文本就越相似,反之也成立。而欧式距离计算的是向量AB和向量AC之间点B和点C之间的长度(即红线的长度)。形式化表述如下:
3 代码实现
https://github.com/zengkui/machine-learning/blob/master/K-NN/knn.py
此代码中实现了cosine距离函数和欧式距离函数。其中vsm模型中特征词的筛选算法是采用的信息增益,即对分类样本文本分词后,计算各个词的信息增益选出top50个词来表示文本。
4 模型评价和对比
选取搜狗实验室的分类语料:商务类新闻和娱乐类新闻各100篇作为分类样本,测试集中商务类新闻文章19926篇,娱乐类新闻文章11987篇。其中商务类标记为正样本,娱乐类标记为负样本。
对KNN模型对比了两个距离函数在不同的K值情况下的召回,准确以及正确率这三个指标,数据如下:
距离函数 | 评价参数 | K=5 | K=11 | K=21 | K=31 | K=41 | K=51 | K=101 |
欧式距离 | 正确率 | 87.60 | 79.64 | 92.37 | 92.84 | 92.49 | 91.91 | 89.10 |
Cosine距离 | 92.64 | 92.66 | 92.76 | 92.72 | 92.34 | 91.92 | 88.50 | |
欧式距离 | 召回率 | 82.22 | 69.09 | 89.98 | 91.50 | 91.03 | 90.04 | 85.05 |
Cosine距离 | 96.78 | 96.93 | 97.07 | 97.60 | 97.65 | 97.64 | 99.52 | |
欧式距离 | 准确率 | 97.53 | 97.61 | 97.62 | 96.86 | 96.76 | 96.77 | 97.13 |
Cosine距离 | 91.87 | 91.78 | 91.81 | 91.34 | 90.79 | 90.22 | 84.73 |
将这些数据从直观的形式表示出来的图表如下:
![本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁 本分类——K-Nearest Neighbor算法 - zengkui111 - 北斗之首——魁](http://img7.ph.126.net/m_w_3KtR_DQ7pYINWIdakw==/6597363336262491347.jpg)
从实验数据可以看出:整体来将cosine距离要略好于欧式距离,效果更好也更加稳定。欧式距离在k=11的时候出现了一个异常,这是由于数据样本筛选导致的。
5 模型的优缺点
该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。