OneR算法和weka中OneR使用--数据挖掘学习和weka使用(四)
OneR算法简介
OneR又称1-R,是1993出现的一种极为简单的分类算法模型,它可以产生一个单层的决策树。
OneR算法是一个简单、廉价的方法,但是常常能够获得一个非常好的结果,用于描述数据中的结构。
OneR算法的使用非常广泛,可以简单的得到一个对数据的概括性了解,有时候甚至可以直接获得结果。
OneR算法实现
OneR的思路很简单,建立一个只针对于单个属性进行测试的规则,并进行不同的分支。每个分支对应的不同属性值。
分支的类就是原始数据(训练数据)在这个分支上出现最多的类。
每一个属性都会产生一个不同的规则集,每条规则对应这个属性的每个值。对每个属性值的规则集的误差率进行评估,选择效果最好的一个即可。
伪代码表述:
对于每个属性
对于这个属性的每个属性值,建立如下规则
计算每个类别出现的频率
找出出现最频繁的类别
建立规则,将这个类别赋予这个属性值
计算规则的误差率
选择误差率最小的规则
一个简单的例子,数据使用weka自带的weather数据集。
针对每个属性,一共有5个,其中最后一个是我们希望输出的结果,所以只有4个属性值。即outlook、temperature、humidity、windy。
我们先计算outlook属性,它有3个属性值,sunny、rainy、overcast。
针对属性值sunny而言,一共有5条数据。
其中对应play为no的有3条、对应play为yes的有2条,为no的最频繁,所以给sunny赋值为no。
同理对于rainy而言,有5条记录。
其中对应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());
效果:
如果将桶大小设为1,结果将会有很大不同。
很明显前一个结果的用处要大很多。
相关参考
关于OneR的相关,最好的参考自然是1993年R.C. Holte所著相关文章Very simple classification rules perform well on most commonly used datasets,页码是63-91页。
作者:黄云坤
出处:http://www.huangyunkun.com/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
支持:
新浪微博