1. 程式人生 > 實用技巧 >【機器學習與R語言】5-規則學習演算法

【機器學習與R語言】5-規則學習演算法

目錄

1.分類規則原理

  • if-else邏輯:前件由特徵值的特定組合構成,在滿足規則的條件下,後件描述用來指定的分類值。
  • 決策樹必須從上至下應用,而規則是單獨存在的事實。通常比決策樹更簡潔、直接和理解。
  • 規則學習應用於以名義特徵為主,或全部是名義特徵的問題。
  • “獨立而治之”:與決策樹的“分而治之”不同(每個決策節點會受到過去決策歷史的影響),一旦規則學習演算法分離出一組案例,下一組案例可能會根據完全不同的特徵,以完全不同的順序分離出來。如:所有動物——>if有皮毛(哺乳動物),else無皮毛(非哺乳)
  • 分而治之和獨立而治之(覆蓋演算法)都基於先到先得的思想,稱為貪婪/學習演算法。

1.1 1R單規則演算法

  • ZeroR:無規則演算法,即無需考慮特徵值就能預測為最常見的類(忽略所有特徵,只是預測目標的模式)。
  • 1R/OneR:單規則演算法,通過選擇一個單一的規則來提高ZeroR演算法的效能。簡單規則通常極具預測性,它能夠識別對於目標類最具有預測性的單一特徵,並利用該特徵構建一個規則集。


過程:對於每一個特徵,基於相似的特徵值1R對資料分組,然後對於每個書分組,該演算法的預測類為佔多數的類。比如動物分類中若以行走途徑為規則錯誤率為2/15,若以是否有皮毛為規則錯誤率為3/15,因此1R演算法基於以行走途徑為規則返回結果。
注意:如果分類水平分佈很不均勻,規則學習再預測少數類時會有困難。


單一的規則可能太簡單了(大拇指規則),更復雜的任務需要考慮多個屬性,用到更高階的規則學習演算法,但早期這類演算法非常慢,也不準確,因此陸續提出了IREP、RIPPER、IRPE++、SLIPPER、TRIPPER等演算法來提高規則學習的效能。

1.2 RIPPER演算法

  • RIPPER:重複增量修剪演算法,對IREP(增量減少誤差修剪演算法)進行改進後再生成規則,效能與決策樹相當。

  • RIPPER過程:生長——修剪——優化
  • 分類規則也可以直接從決策樹獲得。即巢狀if-else結構。缺點:這樣產生的規則比從規則學習演算法學到的規則更復雜,分而治之策略是有偏的,與規則學習的結果會不同。

2. 規則學習應用示例

應用規則學習識別有毒的蘑菇

1)收集資料

8124個蘑菇案例的22個特徵,額外一列包含有毒和無毒資訊。
資料下載:

連結: https://pan.baidu.com/s/1nrLEXkdISPSn1DLkjaPbMA 提取碼: mhvr

2)探索和準備資料

## Example: Identifying Poisonous Mushrooms ----
## Step 2: Exploring and preparing the data ---- 
mushrooms <- read.csv("mushrooms.csv", stringsAsFactors = TRUE)

# examine the structure of the data frame
str(mushrooms)

# drop the veil_type feature
mushrooms$veil_type <- NULL

# examine the class distribution
table(mushrooms$type)

3)訓練資料

## Step 3: Training a model on the data ----
library(RWeka)

# train OneR() on the data
mushroom_1R <- OneR(type ~ ., data = mushrooms)

mushroom_1R

4)評估效能

## Step 4: Evaluating model performance ----
summary(mushroom_1R)


準確率能達到98%以上,但錯過了120種可以食用的蘑菇。

5)提高效能

訓練JRip規則演算法,從所有的可用特徵中選擇規則:

## Step 5: Improving model performance ----
mushroom_JRip <- JRip(type ~ ., data = mushrooms)
mushroom_JRip
summary(mushroom_JRip)


JRip分類器學習了9條規則。準確度提高到100%。

6)選擇決策樹中的分類規則

看一下,選擇了兩個特徵,比較比較。

# Rule Learner Using C5.0 Decision Trees (not in text)
library(C50)
mushroom_c5rules <- C5.0(type ~ odor + gill_size, data = mushrooms, rules = TRUE) #rules分類規則生成一個模型
summary(mushroom_c5rules)


和1R演算法的結果一樣。