注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

anqiang专栏

不要问细节是怎么搞的,源码说明一切

 
 
 

日志

 
 

Weka学习六(Lazy Learning)  

2009-04-08 11:15:14|  分类: Weka 学习系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

相对对其它的Inductive Learning的算法来说,lazy Learning的方法在训练是仅仅是保存样本集的信息,直到测试样本到达是才进行分类决策。也就是说这个决策的模型是在测试样本到来以后才生成的。相对与其它的分类算法来说,这类的分类算法可以根据每个测试样本的样本信息来学习模型,这样的学习模型可能更好好的拟合局部的样本特性。关于Lazy learning的好处可以在Dynamic ensemble selection/learning中得到进一步的讲解。我会在以后的博文中介绍这部分内容。

现在最常见的lazy learning的算法有kNNLazy Decision Tree(也许大家对这个分类器不太了解,感兴趣的可以参见《Lazy Decision Trees AAAI’96,也是档次比较搞的论文了)。大家平常比较熟悉的就是kNN算法了,它的基本原理是在测试样本到达的时候寻找到测试样本的k最临近的样本,然后选择这些邻居样本的类别最集中的一种作为测试样本的类别。这样的想法也是比较通俗的,人常说“物以类聚,人以群分”,要看一个人的好坏就看看他周围的朋友,如果朋友都是好人,当然此君也不会坏到什么地方去。反之亦真。

weka中关于kNN的算法有两个,分别是IB1IBk。从字面上我们就可以知道,IB1是通过它的一个邻居来判断测试样本的类别,IBk是通过它周围的k个邻居来判断测试样本的类别。在样本中有比较多的噪音点是(nosiy points)时,通过一个邻居的效果很显然会差一些,因为出现误差的情况会比较多。这种情况下,IBk就成了一个较优的选项了。这个时候有出现了一个问题,k这个值如何确定,一般来说这个k是通过经验来判断的,我们在测试过程,根据不同的样本集合,选择一个较优的的k经验值。

现在我将weka的实现代码罗列如下:

package com.csdn;

 

import java.io.File;

 

import weka.classifiers.Evaluation;

import weka.classifiers.lazy.IBk;

import weka.core.Instance;

import weka.core.Instances;

import weka.core.converters.ArffLoader;

 

/*

 * Date: 2009.4.8

 * by: Wang Yi

 * Email: andrew.wang.1900@gmail.com

 *

 */

 

public class SimpleLazyLearning {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       Instances trainIns = null;

       Instances testIns = null;

       IBk cfs = null;

      

      

       try{

          

           /*

            * 1.读入训练、测试样本

            * 在此我们将训练样本和测试样本是由weka提供的segment数据集构成的

            */

           File file= new File("C:\\Program Files\\Weka-3-6\\data\\segment-challenge.arff");

           ArffLoader loader = new ArffLoader();

           loader.setFile(file);

           trainIns = loader.getDataSet();

          

           file = new File("C:\\Program Files\\Weka-3-6\\data\\segment-test.arff");

           loader.setFile(file);

           testIns = loader.getDataSet();

          

           //在使用样本之前一定要首先设置instancesclassIndex,否则在使用instances对象是会抛出异常

           trainIns.setClassIndex(trainIns.numAttributes()-1);

           testIns.setClassIndex(testIns.numAttributes()-1);

          

          

           /*

            * 2.初始化基分类器

            * 具体使用哪一种特定的分类器可以选择,请将特定分类器的class名称放入forName函数

            * 这样就构建了一个简单的分类器

            */

           cfs = (IBk)Class.forName("weka.classifiers.lazy.IBk").newInstance();

          

           //设置邻居的个数

           cfs.setKNN(2);

          

           /*

            * 3.训练分类器

            */

           cfs.buildClassifier(trainIns);

          

           /*

            * 4.使用测试样本测试分类器的学习效果

            * 在这里我们使用的训练样本和测试样本是同一个,在实际的工作中需要读入一个特定的测试样本

            */

           Instance testInst;

           /*

            * Evaluation: Class for evaluating machine learning models

            * 即它是用于检测分类模型的类

            */

           Evaluation testingEvaluation = new Evaluation(testIns);

           int length = testIns.numInstances();

           for (int i =0; i < length; i++) {

              testInst = testIns.instance(i);

              //通过这个方法来用每个测试样本测试分类器的效果

              testingEvaluation.evaluateModelOnceAndRecordPrediction(

                     cfs, testInst);

           }

          

           /*

            * 5.打印分类结果

            * 在这里我们打印了分类器的正确率

            * 其它的一些信息我们可以通过Evaluation对象的其它方法得到

            */

           System.out.println( "分类器的正确率:" + (1- testingEvaluation.errorRate()));

       }catch(Exception e){

           e.printStackTrace();

       }

    }

 

}

 

IBk中使用了线性的搜索算法LinearNNSearch,有兴趣的大家可以看看这个类。今天就讲到这里了。
  评论这张
 
阅读(5812)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017