Weka的K Means分群演算法使用教學:SimpleKMeans / Clustering with Weka: SimpleKMeans
用資料探勘的分群演算法來為樣本分群是一種基本的分析方式。本篇就以「Data mining with WEKA, Part 2: Classification and clustering」這篇為例子,介紹如何使用K Means演算法來分群。
Weka下載 / Weka Download
Weka的全名是「Waikato Environment for Knowledge Analysis」,Waikato是紐西蘭北邊的行政區。
Weka是資料探勘領域相當知名的開放原始碼自由軟體,已經有許多文章介紹如何安裝與使用Weka,例如「資料探勘軟體Weka之安裝篇」。我這篇就不細講如何安裝Weka,只列出Weka相關連結供大家方便下載:
- Weka官方網站:http://www.cs.waikato.ac.nz/~ml/weka/
- Weka下載:http://www.cs.waikato.ac.nz/~ml/weka/downloading.html
- 有分成Windows版本、Mac OS X版本、Linux版本,其中Windows版本又分成64位元與32位元,還有是否包含Java運作環境(JRE)的版本。
- Weka 3.8版本,Windows 64位元、含Java運作環境版本:http://prdownloads.sourceforge.net/weka/weka-3-8-0jre-x64.exe
分群範例資料下載 / Clustering Example Data Download
「Data mining with WEKA, Part 2: Classification and clustering」這篇只有介紹如何操作Weka,卻沒有提供關鍵的範例資料bmw-browsers.arff。
後來我在Weka Tutorials找到這篇教學使用的檔案,讓我在這裡備份如下:
- bmw-browsers.arff http://learnersdesk.weebly.com/uploads/7/4/1/9/7419971/bmw-browsers.arff
- 備份:GitHub、Google Drive、Box、OneDrive、Mega、MediaFire
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
開啟Weka主程式「Weka GUI Chooser」,選擇「Explorer」。
在Weka Explorer中,點選左上角的「Open file…」。
選擇剛剛下載的「bmw-browsers.arff」。
資料已經成功載入Weka。
2. 進入分群功能 / Switch to Cluster Panel
接下來我們從「Preprocess (預處理)」切換到「Cluster (分群)」。
這是Weka的分群介面,但是大部分設定都只在上面的部分。
3. 選擇分群演算法 / Choose Clustering Algorithm
接下來我們要先選擇分群演算法,請點下左上角的「Choose」。
選擇K Means的演算法「SimpleKMeans」。
現在上面分群演算法切換成SimeleKMeans了。
4. 設定分群數量 / Change Number of Clusters
K Means演算法中,最終要分的組數是一個很關鍵的設定。Weka分群的預設數量是2群,很多研究會使用3群或5群。理想上應該是依據樣本資料的類型或是研究目的來決定群數,但對很多初探型的研究來說非常困難。有興趣可以看一下「深入淺出Mahout K-means (PART 5) 如何決定群聚的數量 Conopy」這篇的討論。
在本例中使用的分群數量是5群,以下我們就看看怎麼在Weka中調整分群數量。
在演算法這個位置按下滑鼠左鍵。
接著會跳出演算法的設定對話視窗。從裡面找到分群數量設定「numClusters」,把它從預設值2改成5。然後按下「OK」按鈕。
回到主畫面,分群數量變成-N 5了。
5. 排除不需要的屬性 / Ignore attributes
剛剛有講到,在分群的時候,我們應該先把客戶的辨識資料「CustomerID」移除掉。這個功能可以從「Ignore attributes」進去。
選擇「CustomerID」屬性,按下「Select」。這樣待會分群時就可以忽略掉這個屬性了。
6. 進行分群與解釋結果 / Start Clustering and Interpret Results
設定完成之後,就按下左邊的「Start」按鈕吧。
很快的,第一個分群結果就出來了。
我們從右邊的「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」,但其實還是有辦法可以看到顧客與分群結果的對應。
在左下角的「Result list」中選擇剛剛分群的結果,按右鍵開啟「Visualize cluster assignments (產生分群結果圖表)」。
在「Weka Clusterer Visualize」對話視窗中點下「Save」按鈕。
這時候會將分群結果儲存成arff檔案,請選擇一個位置保存它吧。
- 分群結果 bmw-browsers-result.arff:http://pulipulichen.github.io/blogger/posts/2016/12/bmw-browsers-result.arff
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格式轉換成試算表格式也不困難,看看以下怎麼操作吧。
首先選取包含「@data」上面的文字。
刪除掉。
再來把檔案另存新檔,記得將副檔名存為「csv」。
接著我們就可以用Excel來開啟這個csv檔案了。
- 分群結果 bmw-browsers-result.csv:http://pulipulichen.github.io/blogger/posts/2016/12/bmw-browsers-result.csv
結語 / In Closing
網路上介紹分群的文章很多,為什麼我還要多此一舉寫這樣的一篇呢?這是因為雖然單純的演算法介紹或是原理介紹的文章雖多,但是一步一步操作Weka的教學卻很少,而且更少人在講分群之後怎麼看到樣本跟分群結果的對應。所以我想還是把它們整理一下,未來要介紹怎麼用K Means分群的時候也比較方便。
然而K Means分群演算法最大的問題在於如何決定分群數量K,而Weka中有另一個改良式的分群方法叫做XMeans,可以讓人先決定分群的區間,像是最少5最多10,然後由演算法決定最佳的分群數量。以這個例子來說,XMeans給出的最佳分群數量就是6群。但是這樣子的分群結果不一定容易解釋,就看個人如何取捨了。
將Weka的Cluster結果畫成表格的工具
回覆刪除http://codepen.io/pulipuli/full/woXqOX/
將arff轉換成csv的工具
回覆刪除http://codepen.io/pulipuli/full/gLJLPK/
bmw-browsers_output.arff.csv
回覆刪除https://docs.google.com/spreadsheets/d/1zvk1XCfKSkW5ZvMDQUX3aZq-w3zSVItBjWKxxPyjGxQ/edit?usp=sharing
請問這個範例資料可以做關聯分析嗎?
回覆刪除你好,
刪除如果你問是能不能做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
而本篇用的資料集是忽略時間因素,把使用者個人最終結果統計成量化數值,這樣子再來做計算
分群跟分類演算法大多都不考慮時間,只有關聯式規則會考慮時間先後順序
請問要怎麼驗證這模型的好壞,如何使用cluster中的test set功能?
回覆刪除To 李孟倫,
刪除一般來說,可以看標準差來檢視各群是否足夠集中,另外也可以用視覺化功能Visualize cluster assignments來看分群的結果是不是很明顯地分開來
其他的評估方法我沒用過,也很少看人提起,也許可以研究看看?
您好
刪除假如說我有100筆資料,拿80筆作分群,分為五類,剩下20筆,我想把這20筆放進去已經分好了的五群,
請問要如何實現?
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
完成
做法可以看這篇
刪除http://blog.pulipuli.info/2017/10/building-unsupervised-classification.html
作者已經移除這則留言。
回覆刪除請問Clusterer output的每一Cluster與屬性的數值是如何計算呢?
回覆刪除To libniz,
刪除http://blog.pulipuli.info/2017/09/clustering.html
原理請看這篇的投影片中的k平均法介紹
您好:
回覆刪除想跟您請教,我有用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
Weka的K-means預設使用Normalize正規化,最大值化成1,最小值化成0。
刪除因此編號4分群正規化的質心為0.5742,原本最大值為245,最小值為7
(245-7)*0.5742 + 7 =143.6596
謝謝布丁大大!!!!!!!!!!!!!!!!!!!!!!!!
刪除立馬來去實作,感謝您
加油,試算看看吧
刪除您好, 想請教下, WEKA的 SimpleKMeans 是使用 Lloyd's Algorithm 嗎? 還是其他的?
回覆刪除https://www.wikiwand.com/zh-tw/K-%E5%B9%B3%E5%9D%87%E7%AE%97%E6%B3%95
刪除最常用的演算法使用了疊代最佳化的技術。它被稱為k-平均演算法而廣為使用,有時也被稱為Lloyd演算法(尤其在電腦科學領域)。
看來是了
好, 多谢!
刪除不客氣
刪除你好
回覆刪除使用視覺化功能顯示結果
想請問結果圖中有看出分群結果 但結果中的x是什麼意思呢
謝謝
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
https://imgur.com/ECQzxVw
刪除那我想請問說圖中的框框該怎麼解釋呢
可否說明你是如何操作而得到這張圖的呢?
刪除你好 選class to clusters evaluation 之後進行start
刪除是因為這步驟導致嗎
謝謝
你好,
刪除那個是指分群結果跟class不符合的案例
0 1 2 <-- assigned to cluster
0 50 0 | Iris-setosa
47 0 3 | Iris-versicolor
14 0 36 | Iris-virginica
以cluster 2為例,此分群中包含了39個實例(instance),其中3個其實是Iris-versicolor,另外36個是Iris-virginica。
Weka認為cluster 2就是佔大多數的Iris-virginica,至於裡面3個Iris-versicolor就是錯的,以方塊表示。
https://lh3.googleusercontent.com/-T0MBkiH6EpA/Wyy0jB1EoDI/AAAAAAADweI/vGiMDXiQ9ewAL06mexXKAA6G_GfvvtJqQCHMYCw/s0/2018-06-22_16-33-53.png
紅框中的是被分群為cluster 2的案例
橘框的是3個分群分錯的案例
了解 謝謝
刪除不客氣
刪除請問序列相關數據的分群,比如測量100人的試藥前與三天(共四天)的血糖變化,然後對於四天不同的曲現走勢進行分組分析,Kmean是否為可行的方法?或是有什麼建議。謝謝。
回覆刪除To eason,
刪除我一直在想要怎麽回答這個問題。
會用到分群,表示這是一個非監督式學習的問題,你可能沒有明確的分組答案。但這個問題的分組又很明確:上升、持平、下降。至多可以再細分「前後高、中間低」、「前後低、中間高」等類型分組。這部分比較像是時間序列分析。
如果分組很明確,那接下來就變成監督式學習的問題。根據你重視的角度不同,能使用的分析技術也不同。
如果你重視預測,那就是分類 (預測性分析)https://blog.pulipuli.info/2019/10/weka-practice-data-mining-with-weka.html#postcataweka-practice-data-mining-with-weka.html0_anchor5
如果你重視解釋,那就是關聯規則探勘 (比較性分析)https://blog.pulipuli.info/2019/10/weka-practice-data-mining-with-weka.html#postcataweka-practice-data-mining-with-weka.html0_anchor3
大概是這個方向吧。
有人詢問「用BMW的數據做Kmeans時,不需要資料降維嗎?謝謝」
回覆刪除他應該是針對這篇K-Means的教學在提問
這篇教學來自於Data mining with WEKA, Part 2: Classification and clustering
https://developer.ibm.com/articles/os-weka2/
在該教學中並沒有採用降維的處理,所以我在介紹的時候也沒提到降維這件事情
回到問題本身,要不要將資料降維呢?
我認為這個問題並沒有確定的答案
降維帶來的好處是忽略無關特徵、保留關鍵特徵
缺點是造成原始資料的失真
如果在資料特徵數量不多的情況下,例如BMW資料集僅會用到8個特徵
那很很難讓人認為有降維的必要性
相反地,如果特徵數量非常多,例如文字探勘時常常採用Bag-of-words作為特徵,特徵數量將會數以千計時
嘗試使用降維處理來降低整體特徵數量,提高建模的效率,那就是一個可以考慮的手段
儘管如此,降維只是一種概念,實際上降低維度的處理手法相當多
從最常見的PCA主成份分析,到K-means,其實都是降維的方法之一
因此即使決定要採用降維處理,接下來要怎麼做,仍有許多討論的空間,並沒有明確的答案。
請根據實際面對的問題來做判斷吧。
Google雲端硬碟的分享連結調整了格式,我把這篇的連結更新了,請有需要的同學自行取用。
回覆刪除