:::

Weka決策樹分類法使用教學 / Weka J48 Decision Tree Classification Tutorial

image

決策樹是資料探勘(data mining) 分類 (classifition)中的代表性演算法。它是一種監督式演算法,一般是用於預測、建立模型上。它可以協助我們將多維度的大量資料分析成為一些簡單易懂的規則。舉例來說,我們要如何判斷一個職缺好不好呢?我們可以從合約期間、薪資、工時、休假等候選屬性來判斷。決策樹可以幫你分析出第一年薪資會是判斷工作好壞的重要屬性,其次是法定假日。

這兒先不談決策樹背後複雜的演算法,我們可以直接使用開放原始碼的Weka就能簡單地建置一顆決策樹。這篇就是教大家如何使用Weka來建置決策樹的操作教學。


如何取得Weka? / How to get Weka?

關於Weka的介紹我在之前的「Weka的BayesNet分類器操作說明」已有說明,在此就不再重複介紹。

輸入資料 / Data for Mining

image

本教學使用的是Weka提供的範例資料 labor.arff,這是加拿大工業的勞工職缺資料,從至少500多人的資料中整理各種職缺的屬性資訊,以及這份職缺到底是可接受或不可接受的訓練樣本。

這份資料包含了16種屬性:

  • duration: 合約期間,1~7,數值變數。
  • wage-increase-first-year: 首年增加的工資,2.0~7.0,數值變數。
  • wage-increase-second-year: 第二年增加的工資,2.0~7.0,數值變數。
  • wage-increase-third-year: 第三年增加的工資,2.0~7.0,數值變數。
  • cost-of-living-adjustment: 生活津貼調整,沒有/tcf/tc (我不確定這是什麼意思),名義變數。
  • working-hours: 每週工作時數,35~40,數值變數。
  • pension,退休金規劃,沒有/ret_allw/老闆提供,名義變數。
  • stand by-pay: 待命薪資,2~25,數值變數。
  • shift-differential: 工作從II轉換到III的補助 (不確定),1~25,數值變數。
  • education-allowance: 教育津貼,有/沒有,名義變數。
  • statutory-holidays: 法定假日,9~15,數值變數。
  • vacation: 帶薪休假的天數,ba/avg(平均)/gnr,名義變數。
  • longterm-disability-assistance: 僱主對長期工作失能的補助,有/無,名義變數。
  • contribution-to-dental-plan: 僱主提供的牙醫就診補助,沒有/一半/全額,名義變數。
  • bereavement-assistance: 僱主對於喪親的補助,有/無,名義變數。
  • contribution-to-health-plan: 僱主補助員工健康的規劃,無/一半/全額,名義變數。

以及訓練樣本屬性:

  • class:可接受或不可接受 [名義變數]

資料格式 / Data Format

image

這份資料是以Weka的ARFF格式撰寫。這是一種Weka使用的純文字檔案格式,詳細可以看「Data Mining 學習路 - Day 7 資料處理第一步:(3)準備輸入檔案 ARFF」的說明。

es_231_libreoffice_calc85

Weka也可以使用預處理器將CSV格式轉換成ARFF。因此我們可以使用LibreOffice Calc來將資料儲存成CSV格式,再來匯入到Weka計算。作法請見LibreOffice Calc的說明


建置決策樹的步驟 / Building Decision Tree Steps

安裝好Weka,有了資料之後,我們就可以來正式建置決策樹啦。

1. 開啟Weka / Open Weka GUI Chooser

image

請開啟安裝好的Weka。

2. 開啟Weka Explorer / Open Weka Explorer

image

選擇Explorer開啟。

3. 開啟檔案 / Open File

image

在Preproccess裡面點選「Open file…」,選擇準備好的檔案,例如labor.arff。

4. 切換到分類法頁籤 / Switch to Classify

image

確定資料正常載入之後,從上面的頁籤切換到「Classify」(分類法)裡面。

5. 選擇分類法 / Choose Classifier

image

在Classification底下按下「Choose」。

image

切換到「trees」資料夾,點選「J48」。

6. 選擇訓練樣本屬性 / Choose Training Tuples of Data

這一步要選擇一個屬性作為訓練決策樹的依據。這一步不一定要做,因為預設值它就幫我們選好了最後一個屬性。

image

如果你的資料中訓練決策樹的依據不是最後一個屬性,那就依照上圖手動選擇屬性吧。

7. 建立決策樹 / Creating Decision Tree

image

接著按下上圖 (A) 的「Start」。然後右邊Classifier output會顯示建置的數值。其中上圖(B)的「Correctly Classified Instances」表示這顆決策樹的正確率為73.6842%。(附帶一題,這個正確率在分類演算法中並不算高。)

8. 顯示決策樹 / Visualize Tree

image

接著在左邊的Result list中剛剛建置的結果上按滑鼠右鍵,選擇「Visualize tree」。

image

決策樹建置結果就出來了。

從這張圖中我們可以得知首年增加的薪資法定休假是重要的分類依據,整理的規則如下:

  • 首年增加的薪資在2.5以下的話,則是不好的工作
  • 首年增加的薪資大於2.5的話,則繼續看下列規則:
    • 法定休假在10以下的話,則是不好的工作
    • 法定休假在大於10的話,則是好的工作。

 

這樣就建置完成一顆決策樹了!

總共19 則留言, (我要發問)

  1. Weka裡面的分類演算法也有 Logistic Regression 羅吉士回歸,又快又好用,操作方式跟J48決策樹一樣,推薦給大家使用!

    回覆刪除
  2. 想請問安裝後想使用回歸功能,但回歸的演算法都反白,且點擊後也無法進行START,是什麼問題呢?

    回覆刪除
    回覆
    1. To 周軒逸,

      資料格式不符
      很多回歸分類器attribute跟class只能接受numeric類型

      刪除
    2. 請問我的定義有問題嗎?都是數字,還是不能指定範圍?
      @attribute Turn {0,1,2}
      @attribute L {0,1,2}
      @attribute Resistance {0,1,2}
      @attribute Q {0,1,2}

      刪除
    3. 這是類別類型喔
      你看看iris.arff怎麼寫的吧

      @RELATION iris

      @ATTRIBUTE sepallength REAL
      @ATTRIBUTE sepalwidth REAL
      @ATTRIBUTE petallength REAL
      @ATTRIBUTE petalwidth REAL
      @ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica}

      刪除
  3. 所以我的資料有需要定義為三種型態的話,就不適合在WEKA進行回歸處理囉?!因為資料格式會被定義為nominal,是這樣嗎?

    回覆刪除
    回覆
    1. To 周軒逸,

      三種形態就是類別形態nominal...
      呃...要先搞懂資料形態的問題,區分好numeric跟nominal的差別
      不是數字寫作1 2 3 4就是numeric

      刪除
    2. 瞭解,所以我的資料不適合做回歸。非常感謝您的回覆。謝謝!

      刪除
    3. To 周軒逸,

      有時候在整理資料時會把類別資料編碼成數字
      像是 男生=1、女生=2
      但他們本質上還是類別資料

      是說這種編碼方式純粹是為了配合SPSS才需要這樣做
      這樣編碼反而容易造成人們誤導
      實在是很沒必要

      刪除
  4. 布丁你好,想請問布丁Visualize tree後最下面leaf裡面的數字是代表什麼意思?

    有些是0,有些是整數(Ex:1、23),有些是分數或是小數(Ex:2.0/1.0、2.1),還有些是小數形式的分數(Ex:2.1/1.3)

    非常感謝布丁介紹Weka!!

    回覆刪除
    回覆
    1. To 陳英和,

      在left裡面的數字,第一個數字是觀察案例數量,第二個數字是案例數量的頻率或平均數

      以上面的這張圖為例
      https://lh3.googleusercontent.com/-4x8RdJlJx8A/Vz3BTpA8e7I/AAAAAAACwyo/xDCyRkdBB9k/s1600/image%25255B45%25255D.png
      wage-increase-first-year <= 2.5: bad (15.27/2.27)
      被分類到bad的第一個數字15.27是指觀察案例的數量
      第二個數字就是被分類到bad而且wage-increase-first-year小於2.5的平均值。

      不過,為什麼觀察案例的數量怎麼會有小數點呢?這是因為labor.arff資料本身有缺失值,非缺失值的比例會反映在案例數量上。詳細請看這篇的解釋:
      https://weka.wikispaces.com/What+do+those+numbers+mean+in+a+J48+tree%3F


      刪除
    2. 了解,非常謝謝布丁的解答!!

      刪除
  5. 你好想請問 我將資料投入,但J48不能使用 原因為何呢?
    投入資料有時間(DATE) 謝謝

    回覆刪除
    回覆
    1. 通常是Class不是J48能夠接受的格式
      你可以看看J48的Capabilities

      CAPABILITIES
      Class -- Binary class, Nominal class, Missing class values

      Attributes -- Nominal attributes, Binary attributes, Empty nominal attributes, Unary attributes, Numeric attributes, Date attributes, Missing values

      Additional
      min # of instances: 0

      然後看看在Preprocess裡面,被你作為分類目標的class,它的Type是不是上述的Binary class, Nominal class, Missing class values
      通常大家都問題都是Class被Weka認為是數字,因此不能使用分類的演算法,只能用迴歸的演算法

      刪除
  6. 你好~想請問假設有1000筆資料
    選擇前80%做為訓練資料 後面20做為測試資料 test options:percentage split:80
    其中沒有缺值 有沒有像iris資料中的?需預測
    想了解前面資料訓練出來的模型是否準確 所以才用後面20去驗證
    這樣的作法是正確的嗎

    回覆刪除
    回覆
    1. 早期的機器學習研究大多會這樣手動切割,80/20作為training/test
      但會有過擬合的問題,也就是找出來的模型可能只特別適用於少量的20%資料

      一般會建議採用cross-validation,將資料拆成10 folds來各別進行驗證
      這篇雖然沒有特別提,但使用的就是Weka預設的cross-validation

      關於cross-validation的介紹,請看「分類與預測:貝氏網路」中的「3. 進階評估模型:交互驗證10疊」
      http://blog.pulipuli.info/2017/10/classification-and-prediction-bayesnet.html#postcataclassification-and-prediction-bayesnet.html0_anchor1

      投影片在80頁
      https://docs.google.com/presentation/d/1KV3j9n9ApOo8bOitZ9S50C_vGzy18DhQJGoKNG_MKlY/edit#slide=id.g21cec636b4_0_907

      刪除
  7. 請問如果想提升J48決策樹的準確度(80%提升到100%)除了改投入的數據外,有沒有其他方法可以提升

    回覆刪除
    回覆
    1. 如果要提升J48正確率的話,有幾個方法可供參考:

      1. 調整J48演算法的參數

      http://facweb.cs.depaul.edu/mobasher/classes/ect584/weka/classify/figure22.gif
      J48有一些參數可供調整,但遺憾的是,預設值通常是最好的結果,因此調整參數比較可能會讓正確率下降。

      2. 使用特徵選取 AttributeSelectedClassifier
      https://weka.wikispaces.com/Performing+attribute+selection#Meta-classifier
      meta裡面有個分類器叫做AttributeSelectedClassifier
      這可以讓你在分類前先進行特徵選取處理,然後再來用J48進行分類

      關於特徵選取的知識請看這篇
      https://machinelearningmastery.com/perform-feature-selection-machine-learning-data-weka/

      3. 更換演算法,不要用J48
      Weka提供了多種演算法,不會選擇的話也可以用Auto-Weka。
      http://blog.pulipuli.info/2017/04/auto-weka-automatic-model-selection-and.html

      當然,要自行用特徵選取、特徵建立等多種方法來建立類神經網路模型,手動實作深度學習,Weka也是可以做到,但這就不是滑鼠點個一下兩下就能了事的程度。
      若要做到這個份上,個人建議改用Python上專門為了深度學習開發的函式庫來建立模型比較合適。

      ------------------

      然後最後是一定要講的重要概念:「過擬合 overfitting」
      https://www.wikiwand.com/zh-tw/%E9%81%8E%E9%81%A9

      準確率100%,但是資料跟特徵卻不多,通常大家不會認為你的模型很準,而是認為你的模型出現了過擬合的問題。
      過擬合表示你的模型僅能適用於解釋你既有的資料,而未來可能需要判斷的未知資料,極有可能難以適用。

      當然,過擬合只是個抽象的標準。
      隨著你要解決的問題、資料類型、預測目標的不同,理想上的正確率都不太一樣,並沒有統一的標準。
      個人觀點來看,如果在20個以下的案例、用少數三十幾個特徵、來預測5種類別,那正確率有6成已經很不錯了。

      http://blog.pulipuli.info/2017/06/wekamnist-mnist-digits-classification.html
      若是像手寫數字資料庫這樣,用6萬個訓練案例與1萬個測試案例,從784個特徵中預測10種類別,那因為數量與特徵都夠多,我們就會期望他能夠達到90%以上。

      ----------------

      說到底,分類預測只是一個輔助工具
      建立模型是可以幫助我們省下一些瑣碎的時間
      但大多數情況下,我都不建議完全依賴預測的答案
      僅供參考即可

      刪除