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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM