OneR算法和weka中OneR使用--数据挖掘学习和weka使用(四)

OneR算法简介

OneR又称1-R,是1993出现的一种极为简单的分类算法模型,它可以产生一个单层的决策树。

OneR算法是一个简单、廉价的方法,但是常常能够获得一个非常好的结果,用于描述数据中的结构。

OneR算法的使用非常广泛,可以简单的得到一个对数据的概括性了解,有时候甚至可以直接获得结果。

OneR算法实现

OneR的思路很简单,建立一个只针对于单个属性进行测试的规则,并进行不同的分支。每个分支对应的不同属性值。

分支的类就是原始数据(训练数据)在这个分支上出现最多的类。

 

每一个属性都会产生一个不同的规则集,每条规则对应这个属性的每个值。对每个属性值的规则集的误差率进行评估,选择效果最好的一个即可。

伪代码表述:

对于每个属性

  对于这个属性的每个属性值,建立如下规则

    计算每个类别出现的频率

    找出出现最频繁的类别

    建立规则,将这个类别赋予这个属性值

  计算规则的误差率

选择误差率最小的规则

 

一个简单的例子,数据使用weka自带的weather数据集。

weka4_1

针对每个属性,一共有5个,其中最后一个是我们希望输出的结果,所以只有4个属性值。即outlook、temperature、humidity、windy。

我们先计算outlook属性,它有3个属性值,sunny、rainy、overcast。

weka4_2

针对属性值sunny而言,一共有5条数据。

weka4_3

其中对应play为no的有3条、对应play为yes的有2条,为no的最频繁,所以给sunny赋值为no。

同理对于rainy而言,有5条记录。

weka4_4

其中对应play为yes的有3条、对应play为no的有2条,为yes的最频繁,所以给rainy赋值为yes。

同理计算overcast属性值,赋值为yes。

 

然后计算误差率

sunny—>no 中有3个分类正确,2个分类错误,误差0.4

rainy—>yes 误差为0.4

overcast—>yes 误差为0

outlook总误差4/14

 

然后依次计算temperature、humidity、windy属性,并计算误差和总误差。然后选择误差最小的(相同则随意取或者取稳定度高的)。

最后结果为

sunny—>no

rainy—>yes

overcast—>yes

 

使用Weka实现OneR算法

weka自身已经实现了OneR算法,位于weka.classifiers.rules包中。

OneR可以传入一个参数,如果是一个连续值,而且你希望离散化它们的话可以指定一个桶大小。

Instances instances = DataSource.read("data/weather.arff"); 
instances.setClassIndex(instances.numAttributes() - 1); 
System.out.println(instances.toSummaryString());

OneR oneR = new OneR(); 
oneR.setDebug(false); 
oneR.setMinBucketSize(6); 
oneR.buildClassifier(instances); 
System.out.println(oneR.toString()); 

效果:

weka4_5

如果将桶大小设为1,结果将会有很大不同。

weka4_6

很明显前一个结果的用处要大很多。

相关参考

关于OneR的相关,最好的参考自然是1993年R.C. Holte所著相关文章Very simple classification rules perform well on most commonly used datasets,页码是63-91页。

附上下载地址:http://www.ctdisk.com/file/6000694

posted @ 2012-04-14 11:22  夜明的孤行灯  阅读(6852)  评论(0编辑  收藏  举报
返回顶部