:::

自動決定最佳化分群數量:層疊K平均分群法 / Determin the Optimal Number of Clusters: Cascade K-means

image

在資料探勘課程常教的K平均法雖然好用,但它最大的問題在於,到底該如何決定分群數量K呢?幸好我們還有其他的分群演算法可以選擇。Weka中另一個分群演算法層疊K平均分群法(Cascade K-means)採用建立大量不同分群數量的做法,評估每一次分群結果的Calinski-Harabasz指標(CH指標),找出組內距離最短、組間距離最長的最佳分群數量。我在資料聚類:分群分群與分類的整合應用:無監督分類器都有使用層疊K平均分群法來自動決定分群數量,這篇就讓我們在Weka中使用層疊K平均分群法來進行分群,並使用Weka分群結果分析器來試著解釋分群結果吧。


資料集 / Data set

image

image

請下載CSV格式檔案,待會會用到。

這份資料集包含了47筆資料,除了第一欄「工作編號」之外,其他欄位則是個別調查了「合約期間」、「第1年調薪   第2年調薪   第3年調薪   生活津貼調整  每週工時」、「退休金規劃   待命薪資」、「工作轉換補助  允許進修」、「法定假日」、「帶薪年假」、「殘廢補助」、「牙醫補助」、「喪事補助」、「健保補助」等16個變項的結果。

有些變項是數值的連續變項,像是調薪;有些變項是類別變項,像是生活津貼調整、退休金規劃。裡面也很多缺漏值,以「?」表示。

我們能夠從這樣混亂的資料中看出什麼模式嗎?這種時候,你需要的就是分群技術了。

環境配置 / Environment: Weka

安裝Weka / Install Weka

image

我們將使用免費的資料探勘工具Weka來進行分群,在這裡使用的是Weka 3.8版。

套件安裝:層疊K平均分群法 / Install package: cascadeKMeans

image

Weka預設並沒有內建層疊K平均分群法,我們必須要透過Weka的套件安裝功能來新增層疊K平均分群法:

中文環境 / File encoding

最後,因為資料本身含有中文字,所以必須修改Weka的設定使其能夠正常顯示中文。

環境準備好了之後,我們就要來操作Weka進行分群囉。


Step 1. 載入資料 / Open file

image

開啟Weka,在Weka GUI Chooser中,選擇Explorer。

image

按下左上角的「Open file…」。

image

現在Files of Type選擇「CSV data files (*.csv)」,這時候才能顯示CSV格式的檔案,然後按下右下角的「Open」。

image

如果看到左下角的Attributes有正常載入17個特徵變項,就代表檔案順利開啟了。這個階段也就到這邊為止。


Step 2. 分群 / Cluster

接著我們要來為資料進行分群。

分群設定 / AddCluster

image

請按下Filter底下的Choose。

image

選擇「weka.filters.unsupervised.attribute.AddCluster」。

image

用滑鼠左鍵點下粗體字「AddCluster」,進入AddCluster的設定。

AddCluster設定 / AddCluster configuration

image

在clusterer的右邊按下「Choose」,選擇「weka.clusterers.CascadeSimpleKMeans」。

image

在ignoredAttributeIndices裡面輸入1,表示「編號1的特徵(也就是工作編號)不納入分群中」。

image

按下clusterer旁邊的粗體字「CascadeSimpleKMeans」,開啟進階設定。

CascadeSimpleKMeans設定 / CascadeSimpleKMeans configuration

image

在CascadeSimpleKMeans設定中,最重要的就是「maxNumClusters」(最大分群數量)跟「minNumClusters」(最小分群數量)。層疊K平均分群法會在最大分群數量和最小分群數量之間選擇一個最佳的分群數量。你可以在這裡調整分群數量的範圍,否則層疊K平均分群法會採用預設值,從2到10個分群數量之間選擇最佳分群數量。

image

層疊K平均分群法設定完成後,按下「OK」退出。

image

再按「OK」退出AddCluster的設定。

套用分群 / Apply

image

AddCluster設定完成之後,按下右上角的「Apply」。

image

Weka會建立一個額外的屬性「cluster」來記錄分群結果。讓我們在左下角的Attributes找到最後一個屬性「cluster」,點選它,右邊Selected attribute就會顯示該屬性的細節。可以看到分群結果跑出了4個分群。也就是Weka把這47筆資料分成了4群。

儲存分群結果 / Save

image

接著按下右上角的「Save…」。

image

Files of Type選擇「CSV file: comma separated files (*.csv)」,換一個檔案名稱,然後按下「Save」。

image

這樣就保存了分群結果囉。這樣就順利完成這個階段的操作了。


Step 3. 解釋分群 / Explain cluster result

前面分群結果跑出了4個分群,但這4個分群代表什麼意思呢?我們可以藉助Weka分群結果分析器來解讀分群結果。

接下來就讓我們來看看怎麽操作這個工具吧。

開啟檔案 / Open file

image

請在選擇檔案的地方上傳剛剛取得的分群結果檔。

image

下面的Result就會顯示分群結果的分析表格。

分群結果 / Statistic Result

image

先讓我們來看看Statistic Result表格。

該表格首先先列出筆數,可以看到第3群筆數最多、第2群筆數最少。

藉著可以看到全部資料與每個分群在每個變項的平均數與標準差。若該群的平均值高於全部資料的平均值,則會以綠底表示,否則會以紅底表示。如果該群為全部分群中平均數最高的一群,則會加上綠色框。例如第4群的「合約期間」平均數為2.6667,為四個分群中最高的一群,以綠色框表示。第1群的「第1年調薪」平均值為2.97,為四個分群中最低的一群,以紅框表示。

分群比較表 / Compare Clusters

image

最後的分群比較表更進一步摘要了前面的Statistic Result表格。分群比較表挑出了連續變項的變項,將各分群的變項分成「大於全部資料均值」跟「小於全部資料均值」兩種。以第1群來說,僅有「每週工時」大於全部資料均值,其他變項皆小於全部資料均值。若該變項的均值是為全部分群中最高或最低,則會加上「*」跟顏色表示。例如第1群的「每週工時」為各分群最高的一群,則以「每週工時*」表示。

藉著我們要來仔細審視前面的分群結果中各分群的特性。這裡需要用到推論統計來檢定是不是該分群的此變項真的明顯比較多或比較少。如果是數值的連續變項,應採用變異數分析搭配多重比較;如果是類別變項,應採用卡方獨立性檢定。我們看看下面的做法吧。

比較連續變項:單因子變異數分析 / ANOVA

image

在Result標題下方,按下「NUMERRIC VARIABLES」按鈕,下載所有連續變項的資料。

image

這份資料會抓取所有連續變項的值,然後將變項名稱改為編號「var0」、「var1」等等,最後一個變項則是分群結果「cluster」。我們要把這個資料丟到SPSS去做變異數分析與多重比較。做法可以參考商管研究資料分析 單變量變異數分析這個投影片 (竟然一時間找不到中文的教學文章?之後有時間我再寫一份吧)。

image

將因子設為「cluster」,依變數清單加入所有變數,多重比較檢定(Post Hot檢定)勾選「Scheffe」之後進行分析。

image

分析結果發現var0、var1、var2、var6、var8、var9、var11皆達顯著,表示這些變項之間有明顯的差異。藉著我們要一個一個檢視每個變項的多重比較結果,例如以「var11: 法定假日」為例,多重比較結果表格如下:

image

觀察有星號的結果,可發現第4群的法定假日數量顯著的大於第1群,其他兩群沒明顯差別。

image

回來看看法定假日的分群結果,第4群的12.1429的確明顯大於第1群的10.2呢。

其他變項的分析方法也是以此類推進行。

比較類別變項:卡方獨立性檢定 / Chi-Square test of independence

接下來要針對類別變項進行檢定。

image

在分群結果左邊的變項中,如果是類別變項,就會出現一個下載按鈕,請點選它下載該變項與分群的列聯表。

image

先下載「帶薪年假」變項來做分析吧。

image

接下來要用卡方獨立性檢定計算器進行分析,將CSV檔案上傳之後,下面就會顯示分析結果了。

image

分析結果顯示,不同分群的帶薪年假有顯著的不同,第1群的帶薪年假偏少,第4群偏多,第3群大多都是平均。

其他類別變項的分析也依此類推。

命名分群 / Label clusters

基於上面的分群結果,我們必須要為每個分群訂一個的名稱,賦予其意義。實際上還要結合理論與研究目的來命名,但這裡我就簡單點,照資料特性來命名好了:

  • 第1群的每週工時最長,但合約期短、調薪低、假日少,什麼都少。就叫它「短期工作」好了。
  • 第2群的每週工時較短,每年調薪較多,假日也比較多,筆數最少。就叫它「優質工作」好了,質優量少呢。
  • 第3群筆數最多,雖然第2年跟第3年調薪較少,但是其他的待遇尚可,可惜每週工時較長。就叫它「普通工作」好了,有好有壞呢。
  • 第4群筆數較少,每週工時最短,但假日最多、每年調薪也尚可。就叫它「輕鬆工作」好了,不求錢多、但求清閒呢。

到這裡為止,我們做完了解釋分群的操作囉。


Step 4. 查看每筆資料的分群結果:篩選器 / View each instance in clusters

接下來我們要仔細觀察每一筆資料到底被分到哪一群去。因為這個CSV是以萬國碼UTF8編碼,因此不建議大家使用Excel開啟,Excel只認得早期的Big5編碼,開起來會變成亂碼。我推薦使用LibreOffice CalcGoogle試算表來進行下面步驟。以下我用Google試算表來介紹。

匯入檔案到Google試算表 / Import CSV to Google Spreadsheet

image

點下Weka結果分群分析器中的「NEW SPREEEDSHEET」,或是開啟這個連結,以建立一個新的Google試算表:

image

選擇「檔案」中的「匯入」。

image

選擇「上傳」,然後「從您的電腦中選取檔案」,選擇剛剛的分群結果。

image

使用預設設定即可,按下「匯入」吧。接下來要等待一段時間,請耐心等候。

image

現在我們可以看到分群結果已經順利匯入到Google試算表。你可以查看下面的範例:

使用過濾器 / Filter

image

接著我們要開啟工具列的過濾器。

image

開啟過濾器之後,會看到欄跟列的名稱都有綠色底色,表示現在是在過濾器的檢視畫面。

image

讓我們找到最後一欄「cluster」,點下「cluster」右方的過濾器漏斗圖示,選擇我們要觀看的分群。舉例來說,我們對「優質工作」這個分群非常感興趣,因此我們現在只想看第2群cluster2,那就只保留cluster2打勾,其他分群取消打勾,然後按下「確定」。

image

這樣就會留下7筆皆為cluster2的資料,這些就是被分為「優質工作」的工作內容。

到這裡為止,我們完成了整個層疊K平均分群法的分群操作與結果解釋囉。


結語:沒有最佳的分群數量 / Conclusion: What is the optimal number of clusters?

這篇展示了使用層疊K平均分群法自動決定分群數量,然後使用Weka分群結果分析器來解釋分群結果,最後使用Google試算表來看到分群的細節。看到這裡,大家應該覺得很安心,這樣應該就夠了吧。

image

可惜的是,層疊K平均分群法幫你決定的分群數量,不一定是最佳的分群。層疊K平均分群法只會使用Calinski-Harabasz指標(CH指標)來找出最佳分群數量,但真正的最佳分群結果,其實是能夠用於解釋你研究結果、回答你的研究問題、讓你更容易理解資料的結果。

image

舉例來說,我在Weka的K Means分群演算法使用教學:SimpleKMeans中使用的BMW購買行為資料中,若使用層疊K平均分群法來分群,它只會找出2群,完全令人不知該從何解釋起。但原本例子中使用固定的分群數量「5」群,最後就能找出易於解釋的分群結果。

從這裡就可以看到,層疊K平均分群法幫你決定的分群結果並非萬靈丹,只有你能夠解釋的結果才是好的分群結果。

image

如果不滿意層疊K平均分群法預設的2到10個分群數量的話,我會建議將資料分成特徵數量相同的群數。如果蒐集了三個特徵,那就分成3群。這樣可能可以看到每一群都有大於或小於某特徵平均值的結果。但如果特徵數量太多,那也不要超過7個為宜。因為7個以上的分群通常難以解釋,也不易讓人理解。


以上就是使用層疊K平均分群法的整個做法。不知道這對學過K平均法分群的你來說,會有什麼想法呢?如果你能夠掌握這套方法,你會想要拿來分析什麼資料呢?對於分群的解釋,你是否有其他的看法呢?歡迎在下面留言處與我分享你的想法,或是在AddThis分享工具上按讚或分享到Facebook等社群媒體上。感謝你的耐心閱讀,讓我們下次見囉。

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

  1. 布丁老師早安,又來打擾您了
    有幾個小問題想跟您請教

    問題一:目前在用Cascade K-means進行分群時,發現同一筆資料因為操作順序的不同,所分出來的群數也會不同,不知道是那裡出了錯>"<
    操作方法一(同布丁老師講述的方法進行)
    1.開啟Weka,在Weka GUI Chooser中,選擇Explorer。
    2.按下左上角的「Open file…」。現在Files of Type選擇「CSV data files (*.csv)」,這時候才能顯示CSV格式的檔案,然後按下右下角的「Open」。
    3.按下Filter底下的Choose。
    4.選擇「weka.filters.unsupervised.attribute.AddCluster」
    5.進入AddCluster的設定。在clusterer的右邊按下「Choose」,選擇「weka.clusterers.CascadeSimpleKMeans」。
    6.在ignoredAttributeIndices裡面輸入1,表示「編號1的特徵(也就是工作編號)不納入分群中」
    7.按下clusterer旁邊的粗體字「CascadeSimpleKMeans」,開啟進階設定。
    8.設定「maxNumClusters」(10)跟「minNumClusters」(2)
    9.按下「OK」退出
    10.AddCluster設定完成之後,按下右上角的「Apply」
    11.「cluster」,點選它,分群結果跑出了10個分群。

    操作方式二.(直接從clusterer選擇CascadeSimpleKMeans)
    1.開啟Weka,在Weka GUI Chooser中,選擇Explorer。
    2.按下左上角的「Open file…」。現在Files of Type選擇「CSV data files (*.csv)」,這時候才能顯示CSV格式的檔案,然後按下右下角的「Open」。
    3.直接選接上方工具列”cluster”
    4. 在clusterer的下方按下「Choose」「weka.clusterers.CascadeSimpleKMeans」。
    5. 按下Choose旁邊的粗體字「CascadeSimpleKMeans」,開啟進階設定「maxNumClusters」(10)跟「minNumClusters」(2)
    6.在cluster mode 下方按下「Ignore attributes」開啟進階設定.點選第一欄後按下select(把第一欄id不列入分群)
    7.接著按下start進行,分群結果跑出了8個分群。

    問題二:Cascade K-means分群結果,會有各群的質心資料嗎?我完全找不到,是不是要用人工計算各群的平均呢?


    上列問題有點多,麻煩布丁老師解惑了,感謝您

    回覆刪除
    回覆
    1. 您好,

      您讀得很仔細,值得稱讚。

      沒錯,其實在Preprocess裡面,我少講了一個步驟
      在設定好AddCluster的Filter之後,還要在右下角將class設定為「No class」
      https://lh3.googleusercontent.com/-20bGwcxOC4I/WuBs03XlpsI/AAAAAAADtxk/i8WTa_KidKUx-T5XexYjwliJlbFFxRC9ACHMYCw/s0/2018-04-25_19-55-57.png
      這是因為在Preprocess中AddCluster的時候,除了設定的ignoredAttributeIndices之外,還會忽略被選為class的屬性(預設是最後一個屬性)
      但是在Cluster中,則只會看Ignore attributes

      因此在Preprocess中還要多一個步驟,這才是正確答案。

      刪除
  2. 謝謝布丁老師的稱讚....開心(撒花)..^^
    今天立馬再來試做一次,感謝老師解惑!



    回覆刪除
  3. 您好, 想请教下.
    weka 的 Cascade K-Means 会在结果中给出 K=某个数时的最大 CH 指数, 比如 highest CH for k=3: ....

    但能看到所有 每个k 所对应的 CH指数吗?

    回覆刪除
    回覆
    1. 要看到CK指標的話,請開啟Weka GUI Chooser > Program > LogWindow
      https://lh3.googleusercontent.com/-w4jZmj4SGH4/Wx4P0avVnLI/AAAAAAADwCQ/NjU8gzcRj1Us4ShUCDRyUg2xsMMotipkACHMYCw/s0/2018-06-11_13-59-24.png

      然後使用CascadeSimpleKMeans
      LogWindow就會出現計算結果
      https://lh3.googleusercontent.com/-gTy43qSJGFo/Wx4QEASWTlI/AAAAAAADwCY/sVKbbI8HYf8iRKfXMCOhBdhQdFkmZJJFgCHMYCw/s0/2018-06-11_14-00-27.png
      例如:
      cascade> k:2 CH:875.49 W:3.48 (unweighted:1506) B:3045 (unweighted:3045)
      cascade> k:3 CH:470.86 W:3.11 (unweighted:1345) B:1466 (unweighted:2932)
      所以k=2的時候,CH指標最高,最後選擇k=2

      刪除
    2. 您好,想请教下. 是就看最后一个 restart 吗? 也就是第10个.

      这最后一行的 max CH [......] 为什么和前面的CH最大值不一样,而且是并没有10个

      刪除
    3. 因為K-means是亂數選擇起始群心,可能會有不確定性,所以CascadeSimpleKMeans採用了多次重複執行K-means、取得最高CH指標作為代表的做法

      請看CascadeSimpleKMeans的說明

      NAME
      weka.clusterers.CascadeSimpleKMeans

      SYNOPSIS
      Cascade simple k means, selects the best k according to calinski-harabasz criterion. For more information see:

      T. Calinski, J. Harabasz (1974). A dendrite method for cluster analysis.

      OPTIONS
      seed -- The random number seed to be used.

      printDebug -- Print debugging information to the console

      initializeUsingKMeansPlusPlusMethod -- Initialize cluster centers using the probabilistic farthest first method of the k-means++ algorithm

      minNumClusters -- The minimum number of clusters to consider

      restarts -- The number of restarts to use

      debug -- If set to true, clusterer may output additional info to the console.

      manuallySelectNumClusters -- Manually select the number of clusters to use from the results generated

      doNotCheckCapabilities -- If set, clusterer capabilities are not checked before clusterer is built (Use with caution to reduce runtime).

      maxIterations -- Maximum number of iterations for k-means

      distanceFunction -- The distance function to use - only euclidean and manhattan are allowed

      maxNumClusters -- The maximum number of clusters to consider


      CascadeSimpleKMeans可以設定restarts的次數,預設是10
      https://lh3.googleusercontent.com/-IZfIeMDr5hM/Wx98liCoB-I/AAAAAAADwH4/aRLXf-cCZlwi-Em2JcuxZGPFREdZB-m_ACHMYCw/s0/2018-06-12_15-55-45.png

      Log中最後的max CH: [934.23 497.5 351.53 291.8 243.82 208.47 186.86 161.56 152.27]表示K=2 ~ K=10每一種分群方式restart 10次中最高CH指標
      K=2 ~ K=10只有9種組合,並不會有10種

      刪除
    4. 可是在您这张图中 https://lh3.googleusercontent.com/-gTy43qSJGFo/Wx4QEASWTlI/AAAAAAADwCY/sVKbbI8HYf8iRKfXMCOhBdhQdFkmZJJFgCHMYCw/s0/2018-06-11_14-00-27.png
      restart 10 的最大CH值为: k2: CH: 875.49, 而在最后这行 max CH里并没有这个数字?

      刪除
    5. https://lh3.googleusercontent.com/-gTy43qSJGFo/Wx4QEASWTlI/AAAAAAADwCY/sVKbbI8HYf8iRKfXMCOhBdhQdFkmZJJFgCHMYCw/s0/2018-06-11_14-00-27.png

      圖中只有restarts 9/10的後半部跟10/10的全部
      你看到的 k:2 CH:875.49 是最後一次的結果
      前面第二次有 k:2 CH:934.23,是最高值
      所以最後只會挑最高值出來比較

      自己跑一遍看看吧?

      刪除
  4. 老師好
    抱歉又來打擾您了,這次想要跟您請教的是Cascade K-means演算法它所依循的公式,一樣是以Calinski-Harabasz(CH)指標為判別方法嗎?
    另外就是想請教的是CH指標的公式,從您的教學簡報中了解是CH(K)=(trace B/(K-1))/(trace W/(N-K)) ,此公式的推導是否是從論文「 A dendrite method for cluster analysis 」而來呢,再麻煩老師您撥空回覆,謝謝!

    回覆刪除
    回覆
    1. 論文參考來源:
      Caliński, T., & Harabasz, J. (1974). A dendrite method for cluster analysis. Communications in Statistics, 3(1), 1-27. doi:10.1080/03610927408827101
      公式出現在第10頁

      以下我是從別人的報告中取出整理過的公式:
      CH(K)的公式
      https://lh3.googleusercontent.com/-2tktJCRD6nw/Wv6-Va_3ZAI/AAAAAAADvFI/gX82TTSYgYMqZmodaz10_97KXjafuyJdACHMYCw/s0/chk.png

      trace B的公式
      https://lh3.googleusercontent.com/-WKm5TuROVEw/Wv6-VFlrPRI/AAAAAAADvFA/xZGKsbYo74UALS-weYGTcF1-hFhJHPjmQCHMYCw/s0/traceB.png

      traceW的公式
      https://lh3.googleusercontent.com/-XAOw9erDF7M/Wv6-VHBC13I/AAAAAAADvFE/FeyAu5Dz3TQMCOxiK2jZI-WfJ_-0RNhmgCHMYCw/s0/traceW.png

      刪除