:::

不寫程式也能預測未知!用Weka分類模型來預測未知案例 / Make predictions with Saved Machine Learning Model in Weka

image

雖然Weka有很多用來預測的分類演算法,但真正用Weka來進行預測的教學卻很少。這篇將參考「How to Save Your Machine Learning Model and Make Predictions in Weka」的教學,從比較容易為大家編輯的試算表檔案開始,如何利用Weka的分類功能來為未知案例進行預測。


範例資料 / Demo Data

image

這裡我以知名的鳶尾花資料集(iris set)為例子跟大家說明。原本鳶尾花資料集共150個樣本,為了方便說明,我各取三種鳶尾花中的5個樣本,重新選出取出15個資料集出來,製作成試算表格式的檔案。我將其中3個樣本的分類目標(class)以「?」遮起來,表示這是未知、需要預測的案例

這個鳶尾花試算表格式資料集可以從下面連結下載:

製作這樣的資料集時,必須注意以下幾點:

  • 第一列為屬性名稱,例如「sepallength」、「class」等等。
  • 屬性名稱中必須要有名為「class」的分類目標。
  • 如果是文本探勘,則必須要有名為「document」的屬性。預設此欄位會套用斷詞功能。

預測未知案例的操作步驟 / How to Predict Unknow Instances

接下來我要以Weka 3.8版跟我撰寫的網頁程式為例來說明如何這份資料集中標示為「?」的未知案例。這整個流程有點長,大致上可分成四大階段:

  1. 將試算表檔案轉換成「訓練資料集」跟「測試資料集」兩份ARFF檔案
  2. 在Weka中,以訓練資料集建立預測模型
  3. 在Weka中,以預測模型預測測試資料集,取得分析結果
  4. 將測試資料集與分析結果轉換為試算表檔案

那麼,我們就開始吧。


1. 試算表檔案轉換成ARFF / Spreafsheet to ARFF

這個步驟我們都在上面「Weka Spreadsheet to ARFF」的網頁中進行。

  1. 取得試算表檔案:首先我們要將鳶尾花試算表格式檔案儲存到本機端,個人推薦使用Open Document Spreadsheet開放文件格式
    image
  2. Weka Spreadsheet to ARFF網頁中的Input裡的上傳檔案欄位,選擇該檔案。
    image
  3. 然後找到Result下載檔案的按鈕,下載「Train Data Set」跟「Test Data Set」。
    image

 

這個步驟最後就會取得兩個檔案:

  • Train Data Set:用來建立預測模型的訓練檔案。
  • Test Data Set:分類目標為「?」,有待預測的未知案例。

image


2. 建立預測模型 / Building a Predict Model

接下來我們來到Weka中建立預測模型。這邊大部分的步驟都跟大家知道的Weka分類操作很像,但還是有微些不同,請仔細看看囉。

  1. 開啟Weka,進入Explorer。
    image
  2. Open file,開啟剛剛下載的Train Data Set訓練資料集。
    image
  3. 進入Classify分類面板,選擇Classifier分類器、分類目標Class,這部分的設定就隨你想要使用的分類器來調整即可,例如選用J48決策樹。要特別注意的是,在Test options裡面需要選擇「Use training set」。然後按下「Start」,得到分析結果。
    image
  4. 接著在Result list中選取剛剛分析結果,按滑鼠右鍵,選擇「Save model」,這樣就可以把分類預測模型儲存成一份副檔名為「.model」的檔案。
    image

 

在這個步驟中,最後我們會獲得一個副檔名為「.model」的分類預測模型檔案「classify.model」。接下來我們就要用這個模型來對未知案例進行預測。

image


3. 預測未知案例 / Predict Unknow Instances

一般在使用的時候,建立分類預測模型跟預測未知案例會是兩個不連續、不會在同一時間進行的步驟。建立分類預測模型是拿手邊已經知道結果的資料集,而建立過程通常會花費許多時間。一旦有了既成的分類預測模型,那麼我們未來有不確定的未知案例時,就可以用這個模型簡單地進行預測。因此,下面的步驟中,請全部關閉Weka,重頭開始作起吧。

  1. 開啟Weka,進入Explorer。
    image
  2. Open file,開啟剛剛下載的Test Data Set測試資料集。
    image
  3. 進入Classify分類面板,直接選擇Test options中的Supplied test set,然後點選「Set…」按鈕。
    image
  4. 用「Open file…」開啟Test Data Set測試資料集,確認分類目標Class選擇無誤,按下Close。
    image
  5. 在分類面板中,進入「More options…」。
    image
  6. 找到Output predicitons設定,用「Choose」按鈕選擇「CSV」,然後點選「CSV」粗體字進入更深一層的設定選單。
    image
  7. 將outputDistribution設定改為「True」,按下「OK」一路推出回到分類面板。
    image
  8. 在左下角的「Result list」中按右鍵,選擇「Load model」,讀取剛剛儲存的「classify.model」,Result list會出現一個分析結果,那就是剛剛儲存的分類預測模型。
    image
  9. 選擇分類預測模型分析結果,按滑鼠右鍵,選擇「Re-evaluate model on current test set」,右邊就會出現預測結果。但這個結果不好分析,我們的步驟還沒結束。
    2017-04-02_115329
  10. 同樣在分類預測模型分析結果上按滑鼠右鍵,選擇「Save result buffer」,把預測結果儲存成「result.txt」吧。
    image

 

這個步驟中,最後我們會取得預測結果「result.txt」。這個結果並不容易閱讀與分析,所以我們要在下一個步驟中把它轉換成容易處理的試算表格式CSV。

image


4. 將分析結果轉換成試算表格式CSV檔案 / Convert Predict Results to CSV format

在第一個步驟中,我們獲得了「Test Data Set」測試資料集;在第三個步驟中,我們獲得了「result.txt」預測結果。現在我們要將這兩種檔案結合在一起,轉換成容易處理、分析的CSV格式。

以下步驟都會在「Weka ARFF to CSV」網頁內進行:

  1. 在Input中的「Test data set ARFF file」選擇Test Data Set測試資料集;在「Buffer file」選擇result.txt預測結果。
    image
  2. 在Result中,點選DOWNLOAD按鈕下載轉換後的檔案。
    image
  3. 接著使用Google試算表或是LibreOffice Calc開啟CSV檔案,predictedclass就是我們要取得的預測結果。後面的「entropy」是我計算各機率分佈的Entropy亂度,亂度數字越高,分類正確性越低,0是最準確的數字。其他以「pro_dis」開頭的欄位是機率分佈,表示這個案例被分類在某一種分類的可能性。Weka會選擇機率分佈最高的那一個分類作為predictedclass的結果。當只有一個分類的機率分佈接近1時,表示這個分類模型的答案很明確,正確率很高。當機率分佈分散時,predictedclass的結果可能會有錯誤,需要多加注意。
    image

最後的預測未知案例結果就是在原本的試算表檔案後面多加幾個欄位而已,很容易就能讓大家複製、貼上到原本的檔案中,再來進行後續的整理囉。


結語 / Conclusion

這段時間陸陸續續都在研究Weka的使用方法,現在總算是把Weka的分類預測步驟整理出一套比較簡單的操作方式了。

這一連串操作步驟中,最麻煩的就是Weka的ARFF格式。因為我們不太容易用自己習慣的試算表工具來編輯ARFF,所以我花了很多時間在做試算表檔案跟ARFF格式之間的轉換。

一旦這樣的流程確定下來,不管用什麼分類器都可以實際拿來作預測了,非常方便。

附帶一提,如果未知案例的分類目標是類別變項,例如預測「成功」或「失敗」,我們會稱這種預測叫做「分類問題」;如果分類目標是數值型的連續變項,例如預測「得分」、「漲跌幅度」,這種則叫做「回歸問題」。

希望大家能以這套做法為基礎,在實作的過程中一起來感受分類預測的魅力吧。

封面

最後跟大家推薦「王者歸來: WEKA機器學習與大數據聖經」這本書,這大概是目前臺灣Weka教學最詳細的一本書了吧,從這本書可以瞭解Weka很多功能喔。

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

  1. 您好,請問訓練資料集和測試資料集該如何準備? 測試資料集的 class 欄位一定要放上 ? 號,web 服務才會視為測試資料?

    回覆刪除
    回覆
    1. 您好,

      請參考這個檔案
      https://docs.google.com/spreadsheets/d/1tfZ_PtxjSwxYbzoYFhBs8qSQXZ57CrpwRSN04izyF-A/edit#gid=1281119087

      class要是「?」,Weka才知道這是未知待預測的資料
      這邊的定義跟傳統已知答案的測試不一樣

      如果你只是要測試資料來看正確率,那請你用cross-validation來做吧
      本例子沒講正確率的評估

      刪除
    2. 您好,謝謝回覆。我想我了解您的意思了。
      1. 若我有已知答案的數據,但是把 class 欄位改為問號,跑完 model 後,一樣可以得到預測結果,又可以從已知答案計算正確率,這樣可行嗎?
      2. 在 Weka 使用 cross-validation 或其他切割 training set / Test set,跑完預測後,是否有方法可以看到 Test set 和預測後的 raw data?因為做完測試後,只能得到 confuse matrix,但無法知道用了哪些資料當作 Test set,也不知道哪些資料產生預測錯誤。

      謝謝

      刪除
    3. 您好,

      把從CSV切割處理完的Test Data Set arff檔案中的class為「?」的資料換成你已知的答案
      你要的資訊就會全部出現了

      刪除
    4. 您好。如果把答案填回問號的地方,接下來要如何看分析結果? 我的意思是,Weka 的分析結果,是 run 完 model 後才會出現。現在假設有 Test set,也知道跑完 model 後的預測結果,我該如何利用Weka這個介面,來分析這份檔案? 謝謝

      刪除
    5. To Leo Kao,

      如果你照著這篇文章的做法一步一步的作

      3. 預測未知案例 / Predict Unknow Instances
      第10步的Result buffer中,就會看到你要的結果

      https://lh3.googleusercontent.com/-NMA7yP3j98c/WRHh24H_mII/AAAAAAADK0w/OQ3XO2TpX0U2Cmug6jl5CB7u5Y-mSsNrQCHM/s0/2017-05-09_233457.png

      如果你的Result buffer沒出現Predictions on test set
      那麼請照我這篇文章的內容重頭做一次看看吧

      刪除
    6. Hi, 我的確有出現如圖的數據,謝謝您

      刪除
    7. To Leo Kao,

      不客氣

      這招真的很少人知道可以這樣做,大多數用Weka的人都不知道有這功能
      所以我才特別寫一篇blog來說明

      刪除
  2. 請問我要怎麼把
    @RELATION sequential_test_set
    @attritbute seq_id {1 2 3 4 5 6 7 8 9 10 11}
    @attritbute item_id{0 1 2 3 4 5 6 7 8 9 10}

    @data
    1 1
    1 6
    1 7
    1 3
    1 9
    2 6
    2 7
    2 3
    2 8
    2 9
    2 10
    3 6
    3 7
    3 2
    3 7
    3 3
    3 8
    4 3
    4 2
    4 1
    4 6
    4 7
    4 3
    4 9
    5 4
    5 5
    5 3
    5 1
    5 2
    6 6
    6 5
    6 1
    6 3
    6 2
    7 7
    7 8
    7 9
    7 10
    8 6
    8 9
    8 10
    8 8
    8 3
    9 4
    9 9
    9 10
    9 8
    9 1
    10 6
    10 10
    10 8
    10 9
    10 7
    11 5
    11 10
    11 8
    11 9
    11 6
    11 3


    這些資料用WEKA的GSP執行出來?

    回覆刪除
    回覆
    1. 您好,

      嗯...我之前有研究過,但現在忘了
      因為GPS不能辨識不同使用者的關係,所以我後來就改用R來跑循序樣式探勘
      不好意思沒能幫上忙

      https://weka.wikispaces.com/GeneralizedSequentialPatterns
      用這個範例的例子倒是很簡單就能跑出結果
      https://lh3.googleusercontent.com/-We_08srJM3w/WRHgb9DFQjI/AAAAAAADK0k/Wut6diSHGpYg-Lla0A_eSCgN2OPa2uvIACHM/s0/2017-05-09_23-29-07.png

      刪除
    2. 您好,看到這個留言,想要延伸一個問題。我自己產生的數據集,有時間戳記,我想看看待預測欄位,是否跟時間有明顯的關聯性。我應該用什麼分類器?
      時間戳記是否要先預處理,例如改成年月日時分,或者時間區間,或者上下午,是否可以請您建議? 我的資料每 10s 記錄一次,class 是待測試是否在 charging 狀態

      刪除
    3. To Leo Kao,

      這個比較像是時間序列分析與預測,但時間序列分析主要預測都的都是連續變項,而不是類別變項
      Weka有這個功能,叫做timeseriesForecasting,需要在Package Manager另外安裝
      在「王者歸來: WEKA機器學習與大數據聖經」一書中對此有詳細的介紹。
      http://www.books.com.tw/products/0010660633

      刪除
  3. http://imgur.com/a/EF2R1
    請問我使用您提供的工具,將buffer result轉換成csv檔,可是打開卻如上圖所示,與您呈現的結果不太一樣,難以判讀出分類預測的結果以及亂度為何,想請教您應該如何判讀?

    備註:原始資料集是從UCI dataset上面下載,轉換成arff之後,先訓練出model,然後我再隨機設定10筆test set去跑。

    回覆刪除
    回覆
    1. To Michael Chen,

      你這個是ARFF檔案,不是CSV檔案
      搞錯了喔

      刪除
  4. 您好,請問針對類別不同,資料比例不對稱的狀況下,是否先做平衡資料?另外我將資料檔案轉換成「訓練資料集」跟「測試資料集」之後,有更改幾個attribute,之後都按照步驟進行到最後,但最後結果entropy卻出現NaN。能否提點是哪個步驟錯誤了嗎?(新手剛接觸weka,若問了蠢問題請見諒~)

    回覆刪除
    回覆
    1. To lin,

      1. 請把欲分析的資料傳上來看看,這樣比較好知道問題是什麼?
      大部分時候都是資料本身的問題而已。

      2. 你在做這篇的預測分析嗎?

      刪除
    2. 不知是否是因為我的資料屬性有數值型和類別型的關係?還是因為我的分類目標(class)是數值的關係?(但只有0和1的區分)我使用ods檔案格式丟入"Weka Spreadsheet to ARFF",下載「Train Data Set」跟「Test Data Set」,在用weka開啟時我的所有資料都是屬於numeric,我可再做轉換屬性的動作嗎?
      不知能否私下請教您呢?我的email是ucs731963@gmail.com
      謝謝

      刪除
    3. To lin,

      大多都只是arff格式錯誤
      http://ithelp.ithome.com.tw/articles/10156302

      不過這篇教學裡面的class是只有針對nominal類別資料來預測,這種叫做分類問題
      並不是預測numeric 連續資料,這種叫做預測問題

      如果不知道你要幹嗎的話,有資料也不知道怎麼用

      我的聯絡方式都寫在這裡
      http://blog.pulipuli.info/2005/12/blogger_113544406852218769.html
      blog@pulipuli.info

      刪除
  5. 作者已經移除這則留言。

    回覆刪除
  6. 你好,覺得你寫得超好懂,真希望有weka時間序列預測示範..謝謝。

    回覆刪除
    回覆
    1. 謝謝你的支持。

      現在我在準備時間序列預測的介紹
      敬請期待

      刪除
    2. 時間序列預測的教學請看這篇:
      http://blog.pulipuli.info/2017/09/aiweka-time-series-forecasting-with-weka.html
      AI能夠告訴你未來?用Weka實作多變項時間序列預測

      刪除
  7. 您好:想請問一下在第1大點中的第2步驟,我把檔案放上去(.ods)後等很久一直跑不出結果,想請教可能是什麼問題?謝謝!

    回覆刪除
    回覆
    1. 程式bug,已經修正,過個十分鐘清除快取後再試試看吧。

      刪除
    2. 可以跑了,謝謝!

      刪除
    3. 那真是太好了!
      有問題請不要客氣,盡量回報吧!

      刪除
  8. 作者已經移除這則留言。

    回覆刪除
  9. 您好請問跑完預測結果,他那個結果要怎麼向您網頁提供那樣結合成CSV檔?

    回覆刪除
    回覆
    1. 4. 將分析結果轉換成試算表格式CSV檔案 / Convert Predict Results to CSV format
      http://blog.pulipuli.info/2017/04/weka-make-predictions-with-saved.html#postcataweka-make-predictions-with-saved.html0_anchor5
      照著網頁提供的那樣就可以結合成CSV檔了

      刪除
  10. 您好~
    在使用weka我有一些問題想要請問您:
    1. 因為鐵達尼號這題,需要預測生存與否,可是我在test.csv 中Survived這個屬性每個都打問號(?)被weka讀進來時,他會判讀為str格式,可是train.csv的Survived是用0,1來當作生或死,我目前想到方法就是在test.csv的第一行插入一筆從train.csv的其中一筆,讓test.csv中至少有一筆完整資料,這樣weka就能正確判讀Survived的屬性為Num,我想知道有沒有別得更好的方法,謝謝

    2. 我在預測時,最後預測的資料只有100筆,可是test.csv應該有418筆資料,為什麼只預測100筆? 我在網路上沒有找到解答,是不是我有哪裡設定有誤?
    DATA: https://1drv.ms/f/s!AmtaiP3WIMAqhp1mOU0H1yyfmie4bA
    Thank for your time. Appreciate:) !
    -Nason

    回覆刪除
    回覆
    1. 您好,

      如果你的test資料有正確答案,那你要的做法跟本篇文章的做法不太相同
      但總歸來說,基本上一開始資料清理沒做好,後面做什麼都會是錯誤的

      1. 如果是「生/死」,這種資料形態是布林邏輯,不可以用數值0,1代替 (SPSS的陋習),要用true / false來表示。
      2. 如果預測目標是「Survived」屬性,則應該將「Survived」放到最後一欄,命名為「class」。
      3. 如果是缺漏值,要填入「?」
      4. 不會拿來預測的多餘欄位要刪掉
      5. test也要有跟train是完全一樣的欄位

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

      重新整理後的資料如下:
      titanic-train
      https://docs.google.com/spreadsheets/d/1HGm5-1yYtSHV3VBuO5uoNL02hbxNaUgrKIcrD9PPfLc/edit?usp=sharing

      titanic-test
      https://docs.google.com/spreadsheets/d/1wJaG3aFjr6-I5LF8Rek-kKvgCX0qehqazIAIyIHsrio/edit?usp=sharing

      使用SMO,以titanic-train建模,預測titanic-test,正確率為100%
      輸入結果: https://docs.google.com/document/d/1vjFd4oFkCYhZNZODY3J_-VVEiCap0wqo2BUoum0mdhg/edit?usp=sharing

      可以自己研究看看怎麽做到這樣的結果的喔

      刪除
  11. 布丁大您好,

    檔案位址:https://drive.google.com/open?id=1SkDlIKJybeSFPKd3Pf8VVVPWlH6n-kNT
    我現在想用Train_1這個檔案當訓練,distance_sample1當測試,
    ,用的演算法是SMO,而其中的CLASS是0-5,
    最後我發現把測試的資料順序打亂跟不打亂的結果是一樣的,(如csv_result-distance_sample1這個檔案所示)

    另外我想問有甚麼辦法可以提高辨識率,因為55%真的很低ˊˋ

    感恩不盡

    回覆刪除
    回覆
    1. To 李大俠,

      先做PCA之後再用SMO,正確率提高到60%

      設定如下:
      weka.classifiers.meta.AttributeSelectedClassifier -E "weka.attributeSelection.PrincipalComponents -R 0.95 -A 5" -S "weka.attributeSelection.Ranker -T -1.7976931348623157E308 -N -1" -W weka.classifiers.functions.SMO -- -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K "weka.classifiers.functions.supportVector.PolyKernel -E 1.0 -C 250007" -calibrator "weka.classifiers.functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4"

      刪除
    2. 感謝布丁大的回覆,

      關於步驟方面,還請您看是否正確
      1.)我是先input訓練用的資料
      2.)然後用SMO去做訓練
      3.)點選supplied test set,選擇測試用的資料
      4.)按start或是result list 右鍵Re-evaluate model on current test set

      第二個問題是當我進行第二個步驟時,用SMO辨識率80多跟辨識率100的model來當訓練集會有差嗎?
      是否可以解釋成如果辨識率80%,那測試時是拿這80%正確的資料去test,還是在test中有80%正確20%錯誤去test呢?

      感恩>_< 沒想到大大當天就回我了,真的感動

      刪除
    3. To 李大俠,

      每次執行start或Re-evaluate...的時候都是獨立的操作
      所以你第二步做了什麼,跟後面的事情完全無關

      話說,包括你跟上面的提問者,我發現沒有一個人照我文章的方式在操作嘛
      最大的特色就是你們每個人都想要用test set來評估正確率
      這是很多資料探勘教科書的做法,但跟我這篇著重預測的做法並不相同

      因此,上面的問題幾乎都是不知道如何操作Weka而已
      每個人都像是無頭蒼蠅一樣按來按去,然後再問這樣按對不對
      這樣子我很難回答你們的問題

      如果是不知道Weka怎麽操作,請看書:「王者歸來: WEKA機器學習與大數據聖經」
      或是Weka MOOC錄影教學:https://www.youtube.com/user/WekaMOOC
      相信會比亂亂按會更快知道你到底要幹嘛好

      刪除
    4. To 布丁大,

      關於步驟的部分的確有照您的方法走,結果也是可以的,
      至於我上面提到的步驟是從國外youtube學來的,結果也是一樣的,
      所以才會想問問看這樣是否正確><

      另外布丁大可以回答一下第二個問題嗎Q_Q 感謝感謝

      刪除
    5. To 李大俠,

      你的問題是你不知道什麼是機器學習,不瞭解機器學習中的model的意思,所以才會問這樣的問題,也看不懂我在前面說「所以你第二步做了什麼,跟後面的事情完全無關」就已經回答了你第二個問題了。我可以再講一次:沒有差,因為你的操作跟後面的步驟完全無關

      這個問題很大,不是三言兩語可以講完的
      請上課:http://blog.pulipuli.info/2017/10/classification-and-prediction-bayesnet.html

      至於傳統機器學習的操作,都是以一個train data來建模,用test data評估成效
      這個做法也跟我這篇要做的事情完全不同
      如果你拿這樣兩個資料來問我對不對,從這篇的角度來看,不對
      要評估模型正確率,用train data搭配cross vaildation就可以了
      這份課堂教學步驟更完整:http://blog.pulipuli.info/2017/10/classification-and-prediction-bayesnet.html

      如果你拿著train data跟test data在做機器學習
      那你不是要預測,你只是在練習功課(有正確解答)
      要練習功課請去找你的老師問怎麼做,我的做法跟你老師講的做法一定不同

      刪除

留言工具: