乍一看题目,使用”meka“实现分类器,是不是笔者打错了啊,应该是weka啊。其实不然,这世上还真有一个叫meka的包,并且他还跟weka算是亲戚关系。只不过,这个meka是一个专门用来解决多标签分类问题的包,并且是基于weka的,可以算作是weka的一个扩展。
那好,什么是多标签分类呢?我们先来看一个示例:如果我有一篇文章,我要推断它是不是“体育”类新闻,那么分类标签就只有“是”或者“不是”,这种问题就是经典的二分类(binary classifier)问题。好,再复杂一点,如果我们要判断这篇文章是属于“体育”、“财经”、“社会”中的哪一类?那么这个问题就变成了一个多类分类问题(multiclass classifier),注意,对于每篇文章它只能属于“体育”、“财经”、“社会”中的某一类,不能属于多个类。也就是我们的样本的标签可以是[0,0,1]或者[0,1,0]或者[1,0,0],但绝不可能是[1,1,0]或者[1,0,1]等。好了,与多分类对应的就是多标签分类(multilabel classifier),它是解决什么问题的呢?如果一篇文章,它既能属于“体育”类,又能属于“财经类”,甚至还能属于“社会”类,也就是我们待分类的文章有可能同时分到多个类中去,对于这样的分类我们就叫多标签分类。
明白了多标签分类的概念,我们怎么实现呢?其实说到底,多类分类,多标签分类,其实底层都是二分类组合。我们当然可以自己手动实现。但有没有已有的库来帮助我们实现呢?当然有!!!sklearn中已经有实现多标签分类的方法了,它的底层支持可以是Decision Trees, Random Forests以及Nearest Neighbors. 不过我们这次不使用我们优雅的sklearn,要跳到JAVA的坑去(好桑心)。JAVA中比较有名的多标签分类包是mulan以及meka,我们今天只讲meka,至于mulan的实现方法其实也跟meka很像,甚至在meka中都已经集成了mulan的jar包。
meka是由三个大牛Jesse Read、Peter Reutemann、Joerg Wicker实现,并且现在已经开源到github了,与weka其实是师出同门。meka的使用基本与weka一致,它甚至到包含一个客户端,长相也跟weka很像。 对于图形界面的使用,可以去看看它们的官方教程,很详细。我们今天来说一说如何使用集成meka-1.9.0.jar来进行编程实现。这个jar包存在于lib文件夹下。
meka也是用arff文件作为输入。官方文档中有这么一句话:”A suitable dataset is the only requirement to begin running experiments with Meka.”,足见meka使用之方便~~ meka中已经自带了几个用于实现多标签分类的数据集在data目录下,这个数据集是描述某段音频的特征,以及它们属于哪些分类(是悲伤类的还是安静类的亦或是疯狂摇滚的…)我们来看看大概看看,每行%后面是我自己加的注释:
% 'Music' dataset; normalised version. |
与weka有点区别的是,对于标签在每个样本集中的位置,weka一般是放在每行末尾,虽然可以放在每行的任意位置,可以通过Instances.setClassIndex(n)方法,来指定每行的第n位是属于分类标签。 先来上代码吧:
import meka.classifiers.multilabel.BR; |
输出结果:
0.0 |
甚至还可以使用多标签分类进行增量学习,使用:
meka.classifiers.multilabel.incremental.BRUpdateable类,该类底层使用weka.classifiers.trees.HoeffdingTree来实现。
扫描二维码,分享此文章