Rule_set = {}; //學習的規則集初試為空
for 每個類c do
repeat
Rule = Learn_One_Rule(D,Att-vals,c)
從D中刪除被Rule覆蓋的元組;
until終止條件被滿足
Rule_set = Rule_set +Rule
end for
返回Rule_set
以上是順序覆蓋算法的基本過程
Learn_One_Rule采用一種貪心的深度優先策略。每當面臨添加一個新的屬性測試到當前規則時,它根據訓練樣本選擇最能提高規則質量屬性的測試。
而什么樣的度量能被選擇為規則質量,將是我們以下將解決的問題。
有幾個概念:
准確率:當前規則覆蓋的正確的元組/當前規則覆蓋的全部元組
覆蓋率:當前規則覆蓋的全部元組/當前全部元組
正元組(pos):在順序覆蓋算法中,當前所關心的類
負元組(neg):在順序覆蓋算法中,所有類-當前所關心的類 的集合
直覺上,我們選擇准確率作為規則質量標准,但是這有一個問題,如下圖所示:

雖然R2只覆蓋兩個元組,但是R2的准確率為100%,大於R1,在順序覆蓋算法中,將會選擇R2而不是R1,這顯然是不合理的。
為了解決這個問題,采用Foil_Gain作為規則質量標准:
FOIL_Gain = pos' x (log2((pos'/pos' +neg'))-log2((pos/pos +neg)))
其中 pos' ,neg'為新增規則R'所覆蓋的正元組和負元組,pos,neg是R'覆蓋之前的R所覆蓋的正元組和負元組
FOIL_Gain越大越好。
規則剪枝:
FOIL_Prune(R) = (pos - neg)/(pos+neg)
如果R剪枝后的FOIL_Prune值較高,則對R剪枝。
