:::

分群與分類的整合應用:無監督分類器 / Building an Unsupervised Classification: Integrating Cluster and Classification in Weka

image

最近有讀者問到要怎麼在建立的分群結果之後,對後面新增的資料再依照前面的規則新增分群標籤。這就讓我想起來資料探勘課本裡面常常提到的一個機器學習議題:無監督式的監督學習 (Unsupervised Supervised Learning),或是成為不需訓練目標的分類法 (Classification wihtout labels),這篇就叫它作無監督分類器(Unsupervised Classification)。這個做法大多都是將分群結果作為分類的目標標籤,再以此建立分類模型。這種做法聽起來難度挺高的,不過實際在Weka中,我們只要動點巧思,不用寫任何程式,就可以實作這個高級分類技巧。這篇就來介紹一下如何實作無需監督的分類器吧。


資料集 / Dataset

2017-10-16_143150

這次用來練習的資料是我在「分類與預測:貝式網路」的課程中使用的資料集「加拿大工作條件(含測試集)」。我使用試算表轉ARFF工具,將試算表檔案轉換成訓練集(train set)跟測試集(test set),並且刪去原本的訓練目標:在訓練集中刪去class,在測試集中,將class修改。

這個細節比較複雜,請先下載我整理好的訓練集與測試集,再來看看我是怎麼做的:

這裡的兩個檔案都是ARFF格式,不是我之前介紹時都會使用的試算表CSV格式。這是因為這篇是Weka的進階技巧,我希望讀者應該要試著學習認識ARFF格式。你可以用任何支援Unicode的純文字編輯器來開啟ARFF檔案,我推薦使用Notepad++

以下讓我們來看看這兩個檔案。

訓練集的內容 / Train set contents

2017-10-16_144101

這是訓練集的內容,可以看到它有以「@attribute」開頭的16個特徵,個別是「合約期間」、「第1年調薪」、「第2年調薪」,直到「健保補助」等等。

原本訓練集中的class屬性已經被移除了。稍後我們會使用分群來建立新的「cluster」屬性,作為分類器的分類目標。

測試集的內容 / Test set contents

image

這是測試集的內容。值得注意的是,測試集比訓練集更多了一個屬性「cluster」,共有17個屬性。這個「cluster」屬性的設定如下:

@attribute cluster {cluster1,cluster2,cluster3,cluster4}

由於cluster是類別屬性(nominal),我們必須指定cluster可能會出現的標籤類型:cluster1,cluster2,cluster3,cluster4。至於如何決定要設定的標籤類型,我們後面操作時會回來修改。

資料集準備好、Weka也已經安裝好的話,我們就要來操作看看囉。


1. 載入檔案 / Load file

首先開啟Weka。

image

進入Explorer。

image

用Open file按鈕開啟訓練集檔案「train_set-加拿大工作條件(含測試集).arff」。


2. 增加分群結果 / Add Cluster

image

在Filter底下按下Choose。

image

選擇weka.filters.unsupervised.attribute.AddCluster

image

在粗體字AddCluster的地方按滑鼠左鍵。

image

點下clusterer旁邊的Choose。

image

選擇自動決定分群數量的層疊K平均分群演算法:weka.clusterers.CascadeSimpleKMeans

如果你沒找到「CascadeSimpleKMeans」選項,那就是你還沒安裝cascadeKMeans套件。請照「安裝套件」這篇的做法來安裝cascadeKMeans套件吧。

層疊K平均分群演算法中預設會產生2~10群的結果。其做法是進行多次的K平均法,每次設定分群數量k=2、k=3、k=4….、k=10,然後計算分群品質的CH指標 (Calinski-Harabasz),以此決定最佳的分群數量。關於層疊K平均演算法跟CH指標,請看「資料聚類:分群」這篇。

當然,你也可以選擇其他的分群演算法。

image

設定好AddCluster過濾器之後,按下「OK」退出。

image

按下「Apply」。

image

這裡可以看到新增了「cluster」屬性,而該屬性內有4種標籤,個別是「cluster1」、「cluster2」、「cluster3」跟「cluster4」。

至此為止,我們完成了分群的階段。


3. 解釋分類結果 / Explain Labels

分群結果只會有「cluster1」這樣的代號。至於這個代號代表什麼意思,我們就需要進一步的解釋。最簡單的方式就是丟到分群比較表看看囉。

image

先按右上角的「Save」,將分群結果儲存起來。

image

使用Weka分群結果分析器來看看結果,可以看到各個分群結果的一些特性:

  • 第1群的筆數最多,每週工時長、薪水也多,就叫它「高階工作」好了。
  • 第2群的每週工時最少,合約期間也較短,叫它作「短期工作」好了。
  • 第3群的加薪低、工時短,就叫它作「臨時工作」好了。
  • 第4群的合約期間長、法定假日也長,而且每週工時也不多,就叫它「輕鬆工作」好了。

這裡我只是展示一個簡單的解釋方法。有心的讀者可以試著在這一步合併第2群跟第3群為,可能會讓後面的分類預測更為準確。不過如何解釋分群、調整分群結果,這本來就是一門高深的學問。這裡我只是展示最簡單的做法,所以維持4個分群,繼續以下的操作。


4. 修改測試集 / Modifiy test set

前面我們得知了分群結果有4種標籤,接下來我們要修改測試集的內容,使其配合分類模型。

image

讓我們用純文字編輯器開啟測試集檔案「test_set-加拿大工作條件(含測試集).arff」,找到「@attribute cluster」。因為前面的分群結果得到了4種標籤,我們也必須在這裡設定對應的標籤內容:

@attribute cluster {cluster1,cluster2,cluster3,cluster4}

儲存檔案。這樣就完成編輯測試集檔案的階段。


5. 建立分類模型 / Building classification model

image

回到Weka中,切換到Classify標籤。

image

按下Classifier底下的「Choose」,選擇我們要使用的分類器,例如支持向量機「weka.classifiers.functions.SMO」。我試了幾個分類器,支持向量機的表現最好。有心的讀者也可以選用其他分類器。

image

按下「Start」,建立分類結果。正確率是85%,從混淆矩陣(Confusion Matrix)裡面可以看到cluster2全部分類錯誤,其他類別分類大致正確。

image

在分類結果上按右鍵,選擇「Save model」儲存模型。

至此我們將分類模型建立好了,未來就能用這個模型來做預測。


6. 預測 / Prediction

接下來我們要來對測試集進行預測,看看測試集的10筆資料會被歸類到那個標籤。

image

回到「Preprocess」頁籤,用「Open file」開啟測試集檔案「test_set-加拿大工作條件(含測試集).arff」。

image

切換到「Classifiy」頁籤,在Test options中選擇「Supplied test set」,按下「Set」按鈕。

image

用「Open file」開啟測試集資料檔「test_set-加拿大工作條件(含測試集).arff」,然後按下「Close」。

image

按下「More options」。

image

在Output predictions選擇PlainText,按下OK退出。

image

在左下角Result list空白處點滑鼠右鍵,選擇「Load model」,選擇剛剛儲存的模型。

image

在結果上再按一次滑鼠右鍵,選擇「Re-evaluate model on current test set」。

image

在右邊的Classifier output中的Predictions on user test set可以看到預測結果。舉例來說,第一筆資料被預測為cluster3,可視為「臨時工作」;最後一筆資料被預測為cluster4,也就是「輕鬆工作」。

至此,我們完成了預測的工作,這樣就完成了整個無監督分類器的流程了。如果後續要輸出成CSV檔案的話,請參考「用Weka分類模型來預測未知案例」這篇的做法。


小結 / In closing

這篇介紹如何使用Weka來實作無需監督的分類器,其做法是整合了「資料聚類:分群」跟「分類與預測:貝式網路」中提到的技術。我們不需要像傳統監督式分類法那樣先決定分類標籤,而是使用自動決定分群數量的演算法來歸納可能的標籤,然後試著從分群結果來定義該標籤。最後就用分群結果來建立分類模型,以此預測未知的資料。

就這樣,滑鼠點幾下,我們就可以跨越非監督與監督演算法之間的隔閡,只要有資料就能夠進行預測了。

你真的需要無監督分類器嗎? / Why do you need unsupervised classifier?

乍看之下,這篇感覺好像做了很厲害的技術。不過先不論技術本身,我們更應該先問一個問題:什麼情況下,我們會須要用這種無監督的分類器預測呢?

這種情況會發生在你的資料分成兩個階段取得的時候。

第一階段,你取得了訓練集的資料。但是你不知道要怎麽對這些資料下標籤(label)、分類它,所以你試著使用分群演算法來把它們分成一群一群,並試著解釋分群的特性、給予每筆資料具體的標籤,完成了訓練集。再以此建立預測模型。

第二階段,你陸續收到了其他資料,這些都是測試集。接著就用第一階段訓練集建立的預測模型,將測試集分類給予標籤。這個流程就跟普通的分類預測是一樣的。

仔細看看,你在第一階段中去解釋資料、給予資料標籤的這些事情,其實就是一種建立監督資料的過程。雖然我們使用了無監督機器學習的分群演算法來給予標籤,但實際上我們仍然是在給予標籤。

舉例來說,圖書館員給予書本一個分類號,這是人工;分群演算法將書本分到cluster1,這是電腦做的事情。這兩者都是在做給標籤的動作。然而,人工需要許多規則、標準才能給予標籤,也可能會發生標籤規則不一致的情況,但是人工給予的標籤可信度高、也比較容易解釋。後者給的標籤是透過固定的分群演算法,比較有跡可循,速度也比較快,但是也常常因為演算法過於複雜、資料維度過高,導致難以解釋標籤的意義。前者就是傳統的分類問題,後者則是這篇所講的無監督的分類器。兩者並沒有絕對的優劣,應該視情況跟需求來選擇作法。

此外,無監督分類器的缺點在於其分類規則完全決定於訓練集的資料。如果後來的測試集發生了訓練集本身不會發生的狀況,甚至出現了新的特徵或可以視為明顯區隔的一群,這些在無監督分類器裡面都無法察覺,預測結果僅止於一開始建立分群的那幾類。遇到這種情況,那就最好是回歸到單純的分群,把所有資料再來分群看看,並解釋分群結果。

最後,我還是必須提醒讀者,雖然無監督分類器看起來好像很厲害,但仍應該依據實際需求來決定是否使用這個做法。不要讓技術支配了人,而是要依據需求來選擇技術。共勉之。

總共2 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 嗨布丁您好,
    謝謝你非常詳細的操作介紹
    但我有一個小小的疑問,
    如果依上面這樣的分群操作
    成果不會受到資料不平衡的影響嗎?
    (例如:男性的數據比數較多,所以cluster基本分類都會偏向男性)

    回覆刪除
    回覆
    1. 你好,

      與其說是資料會不平衡...
      不如說,如果某個屬性中,單一值佔的比例過高,會造成該屬性沒有區別價值(因為大部分的案例都一樣)
      最後分群結果會以其他屬性為主

      至於那個單一值佔比過高的屬性,就只是很剛好的分散在各個分群中而已

      ----

      如果有問題的話,不妨就自己動手驗證看看吧

      https://docs.google.com/spreadsheets/d/13Hw_jDT8wmyca41o5Zbi2zxMz89cLxdMBtPF9hFfvt0/edit?usp=sharing
      這裡有10筆資料,裡面有三種屬性:gender、age、income
      gender中male佔了80%,非常高
      age則是平衡的各為1、2
      income則更加分散,分成1、2、3

      用這樣的資料集來做K-Means分群,分成3群後,結果如下:
      https://docs.google.com/spreadsheets/d/1M9hHVMrKy6rsB8_DCkl5AHwgRtbg1w4WvFCdg7YmwYs/edit?usp=sharing

      - 數量最少的cluster3只有2筆案例,它的age跟income都是1,男女各半
      - 數量次少的cluster2有3筆案例,它會主要是age為1、income較高、男生的情況
      - 數量最多的cluster1有5筆案例,它的age跟income都偏中上,男生4位,女生1位

      就結果來說,age跟income會成為分群主要的依據
      佔比最高的性別比例,在各分群中的分佈,看起來都跟整體差不多,因此也就不太特別

      ----

      換個例子來說明,你在一所男子高中裡隨機挑選一個班級,班級裡面男生佔比例很大
      但這件事情非常理所當然,並不令人意外

      因為你挑的是男子高中

      刪除