Weka和Mulan的介绍和理解

来源:互联网 发布:国海证券交易软件 编辑:程序博客网 时间:2024/05/15 01:25

http://blog.csdn.net/u011274209/article/details/51996753

Weka:


       Weka的分类器,都放在以weka.classifiers为开头的包里。并根据其功能进行分门别类,具体见其方法。Weka里的核心类,放在了weka.core为开头的包里。

       对于Weka的数据,存在了Instances里。然后每一条数据,则是接口Instrance的实例(有s和没有s的区分,很好理解)。该接口有一些不一样的实现,可以根据实际情况使用。通常使用arff文件,按照一定的格式进行使用,官网都有例子,这里不赘述。使用enumerateAttributes()对数据集的特征进行迭代,也可以使用enumerateInstances()对数据集的每一条数据集进行迭代。函数remove可以删掉某一个特征,函数renameAttribute对特征重新命名。

       对于每一条数据Instance,都有其特征,用类Attribute表示(特别的,对于该数据的Instances,特征也是一样的)。实例里的特征集合,用ArrayList<Attribute>进行表示,这样就拥有顺序,也就是有个自己的序号。对于数据特征的获取,可以通过其名字,也可以通过其序号进行选取。(从另一个侧面说,在Weka里,特征名是唯一的)。取出特征,我们也可以得到该特征的数据集合。特征有numeric,nominal,string,date,relational,5种类型。一般用得最多的是第一种numeric,也就是数值;对于文本处理,用的是string类型。

       Weka里提供了一个强大的工具,叫做filter。我们可以利用这个工具,对数据集进行筛选和处理。分别是有监督和无监督两类,筛选方法包括对特征进行筛选或者对实例进行筛选,总共4种,根据自己所需进行使用。使用方法一般如下:

xxxFilter filter = new xxxFilter();filter.setA(some);filter.setB(some2);Instances newData = Filter.useFilter(oldData,filter);
        这样数据就按照我们要的进行整理了。Weka和sklearn一样,都提供了一些诸如切割训练集和测试集的方法。


Mulan:


       Mulan是依托着Weka所做的一个多标签分类的类库。和Weka一样,其做法是,把标签也看成是一个特征,其类别是Weka里面的nominal类型,也就是一个字符串的集合(如:@ATTRIBUTE class   {Iris-setosa,Iris-versicolor,Iris-virginica})。但是有所区别的是,Weka的标签可以是好多类别,类别的也可以不同命名。而Mulan的标签只能是0和1(如:@attribute label {0, 1})。输入格式有两种arff和xml,具体也是见官网。

        Mulan的核心类,主要是放在了mulan.data里。和Weka一样,数据集使用类Instances表示,在Mulan里,叫做MultiLabelInstances。getDataSet()获取数据里除了标签以外的其他数据(也就是特征所对应的数据),返回一个Weka的Instances实例。getFeatureAttributes() 获取其数据的标签集合。

        相比于Weka,Mulan多了一个叫做label的东西,在接口LabelsMetaData里声明了,Mulan把标签和特征区分对待(尽管二者也是不能重名)。

         Mulan是一个多标签的分类库,也就是分类,其算法,主要是集中在mulan.classifier.*这里。在mulan.classifier这个包里,有几个东西值得看一看。MultiLabelOutput类,是训练后的学习器,对每一条实例进行分类,然后得到的结果,包括了几个点:标签的二分(也就是打不打该标签),标签的评分,标签的排序。获取到这些,我们就可以自己构建一个结果。类MultiLabelLearnerBase是接口MultiLabelLearner的实现。使用方法,很简单

xxxClassifier learner = new xxxClassifier();learner.build(mlTrain);for (int instanceIndex = 0; instanceIndex < numInstances; instanceIndex++) {Instance instance = testData.instance(instanceIndex);Instance labelsMissing = (Instance) instance.copy();labelsMissing.setDataset(instance.dataset());for (int i = 0; i < mlTest.getNumLabels(); i++) {labelsMissing.setMissing(mlTest.getLabelIndices()[i]);}MultiLabelOutput output = learner.makePrediction(labelsMissing);}
           利用学习器的方法,makePrediction,可以对每一条数据进行多标签分类,从而达到我们要的效果。

1 0