写在开头:最近确实事情比较多,每天没有啥时间去学习其他的东西,也就没有时间来继续创作博客,不过最近学习了一些多标签分类的东西,并简单的实现了一下。
内容安排
对于多标签分类任务还有许多常见的方法比如ML-DT(决策树)、Rank-SVM等,由于ML-KNN沿袭KNN的思想比较容易上手,于是本文将对多标签分类任务中的ML-KNN算法进行简单的介绍,并通过代码进行实例操作,使用数据及为MULAN的eurlex-directory-codes(点击可下载)。
1.ML-KNN算法简介
ML-KNN的核心思想与KNN相似,即通过寻找K个最近的样本来判断当前测试样本类别,不过在ML-KNN中是运用贝叶斯条件概率,来计算当前测试样本标签是存在还是不存在,如果存在的概率大于不存在的概率,那么该标签存在。这里将论文的伪代码放过来,讲述思路借鉴基于ML-KNN的多标签分类算法,伪代码如下:
其主要思想是单独观察样本的每个标签存在的概率,那么通过伪代码可以看到
Step1.(训练阶段第1到3行)利用knn算法计算出样本集中每个样本的K个最近邻;
Step2.(第4到6行)计算标签出现的概率、已经在K近邻中出现的次数统计,计算公式如下
第一个式子表示的时某个标签在样本总体中存在的频率,其中, H j H_j Hj表示的是标签 j j j的出现, m m m表示的是样本总量,分子中的求和项表示的是存在标签 j j j的个数总计, s s s是拉普拉斯平滑项,避免某个标签计算出的概率为0,具体解释可以参考这篇文章:平滑处理-拉普拉斯。与之对应的第二个式子表示的则是某个标签在样本总体中不存在的频率。
计算 κ j [ r ] \kappa_j[r] κj[r]表示的就是当前标签存在,并且当前样本的K近邻中标签 j j j存在数为 r r r的样本总数。也就是统计多少样本的K近邻在标签 j j j上出现 r r r次。其中 δ j ( x i ) \delta_j(x_i) δj(xi)就表示的是当前样本的K近邻中标签 j j j存在的个数。简单来说就是看总体情况下标签 j j j存在,那么其每个样本的KNN近邻存在次数的一个分布,反之 κ ~ j [ r ] \tilde{\kappa}_j[r] κ~j[r]就是计算当总体中标签 j j j不存在时,每个样本的K近邻在标签 j j j上的一个分布;
Step3.(预测阶段第8行)计算测试样本的K近邻;
Step4.(第9到11行)计算测试样本K近邻中标签 j j j为1的个数
Step5.(第12行)计算测试样本每个标签出现的概率,并进行判断,其计算公式如下,