前两次我们讲了数据挖掘中比较常见的两类方法。这次我来介绍一下ensemble(集成技术),总的来说,ensemble技术是归类在分类中的。它的主要原理是通过集成多个分类器的效果来达到提高分类效果的目的。简单我们可以通过两张图片来看看集成的效果:

图一为多个基分类器单独工作时的分类效果图。图二为集成分类器的分类效果。我们可以看到集成分类器的分类曲线明显会平滑的多。来个比喻,在一件事情的表决上面,一个人的意见与多个人的意见相比,往往是多个人的意见来的准确一些。这是大概解释我们要提倡民主决策的原因吧。

Ensemble技术在数据挖掘方向主要在以下三个方向做工作:

1.       在样本上做文章,基分类器为同一个分类算法,主要的技术有bagging,boosting;

2.       在分类算法上做工作,即用于训练基分类器的样本相同,基分类器的算法不同,这是本文采用的方法;

3.       在样本属性集上做文章,即在不同的属性空间上构建基分类器,比较出名的是randomforestTree算法,这个在weka中也有实现。

现在我们来看看ensemble技术在weka中的实现过程。

package com.csdn;

import java.io.File;

import weka.classifiers.Classifier;

import weka.classifiers.Evaluation;

import weka.classifiers.meta.Vote;

import weka.core.Instance;

import weka.core.Instances;

import weka.core.SelectedTag;

import weka.core.converters.ArffLoader;

/*

* Date: 2009.4.3

* by: Wang Yi

* Email: wangyi19840906@yahoo.com.cn

* QQ: 270135367

*

*/

public class SimpleEnsemble {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Instances trainIns = null;

Instances testIns = null;

Classifier cfs1 = null;

Classifier cfs2 = null;

Classifier cfs3 = null;

Classifier[] cfsArray = new Classifier[3];

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();

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

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

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

/*

* 2.初始化基分类器

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

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

*/

//贝叶斯算法

cfs1 = (Classifier)Class.forName("weka.classifiers.bayes.NaiveBayes").newInstance();

//决策树算法,是我们常听说的C45的weka版本,不过在我看代码的过程中发现有一些与原始算法有点区别的地方。

//即在原始的C45算法中,我们规定没有一个属性节点在被使用(即被作为一个分裂节点以后,他将被从属性集合中去除掉)。

//但是在J48中没有这样做,它依然在下次分裂点前,使用全部的属性集合来探测一个合适的分裂点。这样做好不好?

cfs2 = (Classifier)Class.forName("weka.classifiers.trees.J48").newInstance();

//什么东东,不知道做什么用,平常很少用。本想要用LibSVM的,但是由于要加载一些包,比较麻烦。

cfs3 = (Classifier)Class.forName("weka.classifiers.rules.ZeroR").newInstance();

/*

* 3.构建ensemble分类器

*/

cfsArray[0] = cfs1;

cfsArray[1] = cfs2;

cfsArray[2] = cfs3;

Vote ensemble = new Vote();

/*

* 订制ensemble分类器的决策方式主要有:

* AVERAGE_RULE

* PRODUCT_RULE

* MAJORITY_VOTING_RULE

* MIN_RULE

* MAX_RULE

* MEDIAN_RULE

* 它们具体的工作方式,大家可以参考weka的说明文档。

* 在这里我们选择的是多数投票的决策规则

*/

SelectedTag tag1 = new SelectedTag(

Vote.MAJORITY_VOTING_RULE, Vote.TAGS_RULES);

ensemble.setCombinationRule(tag1);

ensemble.setClassifiers(cfsArray);

//设置随机数种子

ensemble.setSeed(2);

//训练ensemble分类器

ensemble.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(

ensemble, testInst);

}

/*

* 5.打印分类结果

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

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

*/

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

}catch(Exception e){

e.printStackTrace();

}

}

}

在weka中主要是通过weka.classifiers.meta.Vote来实现,基分类器是通过基分类器数组来设置的。同时我们可以自己设置集成分类器的决策方法,较为常用的是多数投票算法。

我在写下这篇文章是对ensemble分类器在segment数据集上的分类效果做了一个小小的测试,它对测试集segement-test的分类效果是0.8309的正确率。而我在使用单个分类器NaiveBayes,J48, ZeroR时它们的分类效果分别为0.7704、0.9617、0.1106 这样我们可以看到,ensemble分类器是可以矫正弱分类器的分类效果的。

总的来说,我在做实验的过程中,大部分的实验结果都表明ensemble技术确实是可以提高分类效果。当然这也是有国际上大牛的证明的,可不是我一个人这样说的。

Weka学习三(ensemble算法)相关推荐

  1. 统计学习三要素 模型+策略+算法

    统计学习方法都是由模型. 策略和算法构成的. 即统计学习方法由三要素构成, 可以简单地表示为:方法=模型+策略+算法 模型 统计学习首要考虑的问题是学习什么样的模型. 在监督学习过程中, 模型就是所要 ...

  2. 机器学习之 weka学习(二)算法说明

    本文转自:http://blog.csdn.net/mm_bit/article/details/47405433 weka中的各算法说明 1) 数据输入和输出 WOW():查看Weka函数的参数. ...

  3. 集成学习(Ensemble)相关概念及算法(Adaboost,Bagging,Stacking)

    集成学习(Ensemble)相关概念及算法(Adaboost,Bagging,Stacking) 集成学习简介 集成学习(Ensemble)指的是,instead of 用一个单一的精密的高效能的学习 ...

  4. 神经网络算法未来_“深度学习三巨头”来了俩,Hinton、LeCun预言深度学习的未来...

    当地时间 6 月 23 日,今年的 ACM 图灵奖得主."深度学习三巨头"中的 Geoffrey Hinton.Yann LeCun 在 ACM FCRC 2019上发表演讲,分享 ...

  5. 机器学习之 weka学习(三)

    本文转自:http://blog.csdn.net/qiao1245/article/category/6115745 Weka教程笔记    http://blog.csdn.net/qiao124 ...

  6. 深入理解机器学习——集成学习(Ensemble Learning):基础知识

    分类目录:<深入理解机器学习>总目录 集成学习基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好.实际上,就是" ...

  7. Ensemble算法

    What's up everybody, welcome back to my channel! hi,how are ya ! 上周跟大家分享了随机森林算法的应用,这周我准备把Ensemble算法原 ...

  8. 强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例----Sarsa算法, Q学习, 期望Sarsa算法

    强化学习(五) - 时序差分学习(Temporal-Difference Learning)及其实例 5.1 TD预测 例5.1 回家时间的估计 5.2 TD预测方法的优势 例5.2 随机移动 5.3 ...

  9. 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)

    知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...

最新文章

  1. cs嵌html5页面,在.cs c#.net中包含HTML页面
  2. 求最小Hamming距离的DNA序列
  3. 淘金尖端领域:全球量子技术最新投资趋势
  4. php不使用递归实现无限极分类
  5. [Android Studio] Android Studio如何查看branch列表及切换branch(转载)
  6. 空谈Saas都扯淡,让你看看真正的云计算
  7. golang slice append函数如何头插
  8. 锐捷亮相GITC:请互联网企业为我点个赞!
  9. mysql重置root密码方法
  10. java文件重命名失败问题
  11. 知识图谱入门2-1:实践——基于医疗知识图谱的问答系统
  12. 理解C语言——从小菜到大神的晋级之路(9)——多维数组
  13. cocos2dx 制作单机麻将(四)
  14. IRQL(转载 自 windows内核情景分析)
  15. Python自动化下载模块
  16. 看电影“刺客聂隐娘”前必须了解的知识(绝无剧透)
  17. 计算机技术职业资格考试
  18. 云计算与大数据概论(1) 云计算,大数据是什么
  19. 【BZOJ4987】Tree(树形dp)
  20. steam饥荒服务器为什么显示未响应,《饥荒:联机版》服务器卡顿原因分析及解决教程...

热门文章

  1. Log4j使用详解(log4j.XML格式)
  2. 一图秒懂P2P、P2C 、O2O 、B2C、B2B、C2C
  3. Deep Learning简明深度学习方法概述
  4. 【Visual C++】一些开发心得与调试技巧
  5. 数字图像处理:第一章 概述
  6. 鸟哥的Linux私房菜(基础篇)- 第十七章、程序管理与 SELinux 初探
  7. OpenCV中BriefDescriptorExtractor
  8. python常用异常处理
  9. 使用Ant Design 和Vue,React中后台开发套餐
  10. 【ionic App问题总结系列】ionic 如何更新app版本