:::

Weka的K Means分群演算法使用教學:SimpleKMeans / Clustering with Weka: SimpleKMeans

image

用資料探勘的分群演算法來為樣本分群是一種基本的分析方式。本篇就以「Data mining with WEKA, Part 2: Classification and clustering」這篇為例子,介紹如何使用K Means演算法來分群。


Weka下載 / Weka Download

2016-12-05_145933

Weka的全名是「Waikato Environment for Knowledge Analysis」,Waikato是紐西蘭北邊的行政區。

Weka是資料探勘領域相當知名的開放原始碼自由軟體,已經有許多文章介紹如何安裝與使用Weka,例如「資料探勘軟體Weka之安裝篇」。我這篇就不細講如何安裝Weka,只列出Weka相關連結供大家方便下載:

分群範例資料下載 / Clustering Example Data Download

2016-12-05_152156

Data mining with WEKA, Part 2: Classification and clustering」這篇只有介紹如何操作Weka,卻沒有提供關鍵的範例資料bmw-browsers.arff。

後來我在Weka Tutorials找到這篇教學使用的檔案,讓我在這裡備份如下:

bmw-browsers.arff 這個資料集來自汽車品牌BMW代理商的真實資料。代理商保存了過去的銷售資訊,包括誰買了BMW、觀賞BMW、瀏覽的BMW樓層等資訊。從資料內容來看,bmw-browsers.arff 中有9項屬性(特徵),總共100筆資料。屬性介紹如下:

  • CustomerID:顧客編號,資料類型為數字。
  • Dealership:是否有代理,0表示沒有,1表示有。
  • Showroom:顧客是否有看展示間,0表示沒有,1表示有。
  • ComputerSearch:顧客是否有用電腦搜尋,0表示沒有,1表示有。
  • M5:顧客是否有看BMW M5四門跑車,0表示沒有,1表示有。
  • 3Series:顧客是否有看BMW 3系列轎車,0表示沒有,1表示有。
  • Z4:顧客是否有看BMW Z4雙座敞篷跑車,0表示沒有,1表示有。
  • Financing:顧客是否符合貸款資格,0表示沒有,1表示有。
  • Purchase:顧客是否真的購車,0表示沒有,1表示有。

在實際進行分群的時候,我們會將辨識客戶的第一個屬性「CustomerID」排除在外。但是在最後分群儲存結果時,我們還是可以看到該客戶被分到哪一群裡面。


K Means分群教學 / Clustering Tutorial

接下來就讓我們實際操作看看吧。

1. 載入資料 / Loading Data

image

開啟Weka主程式「Weka GUI Chooser」,選擇「Explorer」。

image

在Weka Explorer中,點選左上角的「Open file…」。

image

選擇剛剛下載的「bmw-browsers.arff」。

image

資料已經成功載入Weka。

2. 進入分群功能 / Switch to Cluster Panel

image

接下來我們從「Preprocess (預處理)」切換到「Cluster (分群)」。

image

這是Weka的分群介面,但是大部分設定都只在上面的部分。

3. 選擇分群演算法 / Choose Clustering Algorithm

image

接下來我們要先選擇分群演算法,請點下左上角的「Choose」。

image

選擇K Means的演算法「SimpleKMeans」。

image

現在上面分群演算法切換成SimeleKMeans了。

4. 設定分群數量 / Change Number of Clusters

K Means演算法中,最終要分的組數是一個很關鍵的設定。Weka分群的預設數量是2群,很多研究會使用3群或5群。理想上應該是依據樣本資料的類型或是研究目的來決定群數,但對很多初探型的研究來說非常困難。有興趣可以看一下「深入淺出Mahout K-means (PART 5) 如何決定群聚的數量 Conopy」這篇的討論。

在本例中使用的分群數量是5群,以下我們就看看怎麼在Weka中調整分群數量。

image

在演算法這個位置按下滑鼠左鍵。

image

接著會跳出演算法的設定對話視窗。從裡面找到分群數量設定「numClusters」,把它從預設值2改成5。然後按下「OK」按鈕。

image

回到主畫面,分群數量變成-N 5了。

5. 排除不需要的屬性 / Ignore attributes

image

剛剛有講到,在分群的時候,我們應該先把客戶的辨識資料「CustomerID」移除掉。這個功能可以從「Ignore attributes」進去。

image

選擇「CustomerID」屬性,按下「Select」。這樣待會分群時就可以忽略掉這個屬性了。

6. 進行分群與解釋結果 / Start Clustering and Interpret Results

image

設定完成之後,就按下左邊的「Start」按鈕吧。

image

很快的,第一個分群結果就出來了。

image

我們從右邊的「Clusterer output」裡面找到「Cluster centroids」,來看一下分群最後結果的各群特性。

分群結果如下:

Cluster#
Attribute            Full Data      0          1          2          3          4
                       (100)       (26)       (27)        (5)       (14)       (28)
==================================================================================
Dealership              0.6     0.9615     0.6667          1     0.8571          0
Showroom               0.72     0.6923     0.6667          0     0.5714          1
ComputerSearch         0.43     0.6538          0          1     0.8571     0.3214
M5                     0.53     0.4615      0.963          1     0.7143          0
3Series                0.55     0.3846     0.4444        0.8     0.0714          1
Z4                     0.45     0.5385          0        0.8     0.5714     0.6786
Financing              0.61     0.4615     0.6296        0.8          1        0.5
Purchase               0.39          0     0.5185        0.4          1     0.3214

這個分群結果中的數值是平均值,越靠近0表示越多人沒有這個屬性,越靠近1表示越多人有這個屬性。根據該篇文章的解釋,我們可以為這5群結果進行以下的描述:

  • Cluster 0 (26人):本群可以稱為「夢想者(Dreamers)」,他們什麼都想要,但是卻不買。
  • Cluster 1 (27人):這群是「M5的愛好者(M5 Lovers)」,因為他們傾向於直接走向M5,並且忽略3系列或Z4。儘管如此,他們購買率並不高,只有52%。也許代理商可以安排更多M5的銷售人員來提升M5的銷量。
  • Cluster 2 (5人):該群因為人數太少而可以被稱為「可忽略 (Throw Away)」,而且他們的行為也看不太出特色。
  • Cluster 3 (14人):本組可稱為「BMW寶寶 (BMW Babies)」,因為他們最後總能夠買車並且符合貸款資格。本群可以看到一些有趣的事情:他們看起來會到處去看不同的車子,然後轉向去用電腦搜尋代理商有的車子,最後傾向於購買M5或是Z4,而不是3系列。這一群讓代理商知道他們應該考慮在各樓層安排電腦搜尋站,或是讓M5或Z4在搜尋結果中更加突出。只要客戶決定要購車時,他們就能很快地完成購車手續。
  • Cluster 4 (28人:本組可稱為「BMW入門 (Starting Out With BMW)」,因為他們只看3系列,而總是不看更貴的M5。他們總是走進展示間直接選擇,而不是到處去看車,也不仰賴電腦搜尋結果。只有50%的人符合貸款資格,而僅有32%的人最後完成交易。這個意思是說,這些購買他們第一輛BMW的顧客很明確地知道他們要的類型,也就是3系列,而且他們也希望容易貸款來購買。代理商可以考慮降低貸款標準或是降低3系列的價格。

在實務操作上,如果分組最後的結果讓你覺得難以解釋的話,可以試著回到「4. 設定分組數量」改變分組數量,也許不同的分法會讓你看到不同的觀點。

7. 匯出結果 / Save Output

最後,我們會想要知道那些顧客是被分在那些組裡面。雖然前面我們在分群時排除了可辨識顧客資料的「CustomerID」,但其實還是有辦法可以看到顧客與分群結果的對應。

image

在左下角的「Result list」中選擇剛剛分群的結果,按右鍵開啟「Visualize cluster assignments (產生分群結果圖表)」。

image

在「Weka Clusterer Visualize」對話視窗中點下「Save」按鈕。

image

這時候會將分群結果儲存成arff檔案,請選擇一個位置保存它吧。

image

arff格式是純文字檔案,我們可以用Notepad++來開啟。分群結果跟原本的bmw-browsers.arff看起來很像,但是多了兩個屬性:

  • Instance_number:實體編號,類型是數字。
  • Cluster:分群結果。因為我們設定分成5群,所以資料只會有cluster0、cluster1、cluster2、cluster3、cluster4這五種。

而我們在意的只有第二個屬性「CustomerID」跟最後的屬性「Cluster」。從@data之後的資料就能看到CustomerID對應的分群結果,每一行代表一位客戶。舉例來說,客戶編號1對應到cluster 0,客戶編號4對應到cluster 3。

8. 將arff轉換成csv / Convert arff format to csv format

對很多人來說arff格式的檔案很不容易處理,大家還是比較習慣用試算表工具,如Excel來處理資料。要將arff格式轉換成試算表格式也不困難,看看以下怎麼操作吧。

image

首先選取包含「@data」上面的文字。

2016-12-05_172307

刪除掉。

image

再來把檔案另存新檔,記得將副檔名存為「csv」。

image

接著我們就可以用Excel來開啟這個csv檔案了。


結語 / In Closing

網路上介紹分群的文章很多,為什麼我還要多此一舉寫這樣的一篇呢?這是因為雖然單純的演算法介紹或是原理介紹的文章雖多,但是一步一步操作Weka的教學卻很少,而且更少人在講分群之後怎麼看到樣本跟分群結果的對應。所以我想還是把它們整理一下,未來要介紹怎麼用K Means分群的時候也比較方便。

image

然而K Means分群演算法最大的問題在於如何決定分群數量K,而Weka中有另一個改良式的分群方法叫做XMeans,可以讓人先決定分群的區間,像是最少5最多10,然後由演算法決定最佳的分群數量。以這個例子來說,XMeans給出的最佳分群數量就是6群。但是這樣子的分群結果不一定容易解釋,就看個人如何取捨了。

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

  1. 將Weka的Cluster結果畫成表格的工具
    http://codepen.io/pulipuli/full/woXqOX/

    回覆刪除
  2. 將arff轉換成csv的工具
    http://codepen.io/pulipuli/full/gLJLPK/

    回覆刪除
  3. bmw-browsers_output.arff.csv
    https://docs.google.com/spreadsheets/d/1zvk1XCfKSkW5ZvMDQUX3aZq-w3zSVItBjWKxxPyjGxQ/edit?usp=sharing

    回覆刪除
  4. 請問這個範例資料可以做關聯分析嗎?

    回覆刪除
    回覆
    1. 你好,

      如果你問是能不能做Apriori演算法那一種的關聯式分析
      或著是是像這篇這樣的循序樣式探勘
      用JavaScript實作的:http://blog.pulipuli.info/2011/01/sequential-pattern-mining-tool.html
      用R實作的:http://blog.pulipuli.info/2017/01/rarulessequences-sequential-pattern.html

      那是不行的!因為資料集的形態是不一樣的
      資料分析的選擇是要從資料的類型來選擇分析的技術

      關聯式規則分析技術所需要的資料包括:
      1. 使用者
      2. 使用者不同時段
      3. 使用者在不同時段操作的行為
      例如這張表:http://blog.pulipuli.info/2017/01/rarulessequences-sequential-pattern.html#postcatararulessequences-sequential-pattern.html0_anchor3

      而本篇用的資料集是忽略時間因素,把使用者個人最終結果統計成量化數值,這樣子再來做計算
      分群跟分類演算法大多都不考慮時間,只有關聯式規則會考慮時間先後順序

      刪除
  5. 請問要怎麼驗證這模型的好壞,如何使用cluster中的test set功能?

    回覆刪除
    回覆
    1. To 李孟倫,

      一般來說,可以看標準差來檢視各群是否足夠集中,另外也可以用視覺化功能Visualize cluster assignments來看分群的結果是不是很明顯地分開來
      其他的評估方法我沒用過,也很少看人提起,也許可以研究看看?

      刪除
    2. 您好
      假如說我有100筆資料,拿80筆作分群,分為五類,剩下20筆,我想把這20筆放進去已經分好了的五群,
      請問要如何實現?

      刪除
    3. To 李孟倫,

      看來你要做的不是分群,而是將分群結果整合到分類上

      做法概述如下:
      1. 載入80筆資料
      2. 用Filter的AddCluster,將80筆加上分群結果cluster
      2的做法看這篇:http://blog.pulipuli.info/2017/09/clustering.html
      3. 以cluster作為分類目標,建立分類模型
      4. 載入20筆資料,以該分類模型來進行預測,得知這20筆的預測結果
      3,4看這篇:http://blog.pulipuli.info/2017/04/weka-make-predictions-with-saved.html

      完成

      刪除
    4. 做法可以看這篇
      http://blog.pulipuli.info/2017/10/building-unsupervised-classification.html

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

    回覆刪除
  7. 請問Clusterer output的每一Cluster與屬性的數值是如何計算呢?

    回覆刪除
    回覆
    1. To libniz,

      http://blog.pulipuli.info/2017/09/clustering.html
      原理請看這篇的投影片中的k平均法介紹

      刪除
  8. 您好:
    想跟您請教,我有用weka預處理做好了正規化進行k-mean分群(因原先資料各項數值有明顯差異,故需以正規化後再進行分群),但是現在我要怎麼把已經正規化的數字(0-1)回推回原來的數值,可否給我一盞明燈,感謝您!!

    k-mean跑出的值:
    Final cluster centroids:
    Cluster#
    Attribute Full Data 0 1 2 3 4
    =============================================================================
    W-1 0.0625 0.0328 0.2075 0.0011 0.0157 0.5742


    weka預處理後的值:
    min 最大 7
    max 最小 245
    mean 平均 21.874
    std 標準差 22.867

    回覆刪除
    回覆
    1. Weka的K-means預設使用Normalize正規化,最大值化成1,最小值化成0。
      因此編號4分群正規化的質心為0.5742,原本最大值為245,最小值為7
      (245-7)*0.5742 + 7 =143.6596

      刪除
    2. 謝謝布丁大大!!!!!!!!!!!!!!!!!!!!!!!!
      立馬來去實作,感謝您

      刪除
  9. 您好, 想請教下, WEKA的 SimpleKMeans 是使用 Lloyd's Algorithm 嗎? 還是其他的?

    回覆刪除
    回覆
    1. https://www.wikiwand.com/zh-tw/K-%E5%B9%B3%E5%9D%87%E7%AE%97%E6%B3%95
      最常用的演算法使用了疊代最佳化的技術。它被稱為k-平均演算法而廣為使用,有時也被稱為Lloyd演算法(尤其在電腦科學領域)。

      看來是了

      刪除
  10. 你好
    使用視覺化功能顯示結果
    想請問結果圖中有看出分群結果 但結果中的x是什麼意思呢
    謝謝

    回覆刪除
    回覆
    1. Weka的視覺化功能挺多的,如果可以的話,我建議你使用下面的「上傳圖片」功能,把你想問的畫面擷個圖上傳來問,我比較能夠確定你在問的是什麼。

      https://lh3.googleusercontent.com/-AUb8FNzdtAs/Wyh5c4G5wpI/AAAAAAADwTQ/aV42Lo66QB0BBg9wD6PNMWkE9jzRBWFMgCHMYCw/s0/2018-06-19_11-32-45.png

      不過沒意外的話,你應該是指上面的圖
      x是指該案例(instance)在散佈圖中x軸值跟y軸值的所在位置
      Weka的散佈圖x軸跟y軸可以自由選擇
      以這張圖來說
      X軸 X: Instance_number
      Y軸 Y: sepallength

      刪除
    2. https://imgur.com/ECQzxVw
      那我想請問說圖中的框框該怎麼解釋呢

      刪除
    3. 可否說明你是如何操作而得到這張圖的呢?

      刪除
    4. 你好 選class to clusters evaluation 之後進行start
      是因為這步驟導致嗎
      謝謝

      刪除

留言工具: