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頁。






