K-means
Ch8 K-means分群 (非監督式學習)
K-means屬於非監督式學習,用於分群問題。隨機挑選K個點,將所有點劃分於這K個點中最靠近的點進行分群,接著重新計算各群中各點的平均為新的K個中心點,所有點再依照新的中心點分群,不斷重複直到K個中心點不再移動。利用物以類聚的概念進行分群,表示同一群的資料點應該越靠近。
8-1 K-means分群的運作過程
K-means分群的運作過程,如下。
Step1)隨機挑選K個點為中心點。
Step2)找到所有點到這K個中心點的距離,每一個點被分到最接近的中心點。
Step3)重新計算每一群內各點的平均值為新的中心點。
Step4)重複Step2與Step3,直到中心點不再移動,或移動距離很短、或重複找中心點達到指定次數。
將以下12個點使用K-means分成兩群。
隨機挑選(5, 4)與(7, 7)為中心點,分成兩群,距離中心點越近者分成同一群,以斜線表示兩群的範圍。
重新計算中心點,假設以(3.5, 3.5)與(6.4, 6.2)為中心點分成兩群,以斜線表示兩群的範圍。
重新計算中心點,假設以(2.5, 2.5)與(6.2, 5.1)為中心點分成兩群,以斜線表示兩群的範圍。
重新計算中心點,假設以(2, 2)與(6.2, 5.1)為中心點分成兩群,以斜線表示兩群的範圍。
重新計算中心點,可以發現還是以(2, 2)與(6.2, 5.1)為中心點,不再改變,到此完成使用K-means演算法分成兩群。
8-2 使用sklearn實作K-means分群
使用sklearn實作K-means分群,將每筆資料輸入K-means分群模型就可計算出每筆資料的所在群組。使用sklearn實作K-means分群的步驟如下。
(1)輸入資料
X = data
(2)建立模型
model = KMeans(init = "k-means++", n_clusters = 3)
參數init表示初始化中心點的方式,參數n_cluster表示要分成幾群。
(3)訓練模型與模型預測
model.fit(X)
model.predict(X)
8-3 使用K-means分群實作範例
8-3-1使用K-means對消費者進行分群
(8-3-1使用K-means對消費者進行分群.ipynb)
使用性別、居住地、收入與花費等對消費者分群,本範例測資來自於Kaggle網站,可以從以下網址下載ClusteringHSS.csv。
https://www.kaggle.com/harrimansaragih/clustering-data-id-gender-income-spending
Step1)匯入資料
匯入ClusteringHSS.csv到DataFrame。
程式說明
第1到4行:匯入函式庫。
第5行:讀取ClusteringHSS.csv轉換成DataFrame,變數df參考到此結果。
第6行:使用函式head顯示變數df的前五筆資料。
Step2)檢查資料
檢查資料是否有空值、資料維度大小、欄位名稱、第一筆資料內容與資料型別。
程式說明
第1行:使用函式isnull檢查資料是否有空值(NaN),如果欄位有空值就會回傳True,轉換成數值1,加總結果就會是空值個數。
第2到4行:使用shape顯示資料的筆數,函式keys顯示欄位名稱,iloc顯示指定範圍的資料內容。
第5行:顯示資料集df每個欄位的資料型別。
Step3)整理資料
刪除不需要的欄位。
程式說明
第1行:使用函式dropna刪除資料集df所有空值。
第2到5行:使用LabelEncoder將欄位Gender_Code與Region由文字轉換成數值。
第6行:對於分群沒有幫助,刪除欄位ID。
第7行:使用函式head顯示變數X的前五筆資料。
Step4)建立與訓練模型
使用KMeans建立模型與訓練模型。
程式說明
第1行:使用KMeans建立K-means分群,設定init為k-means++,表示選擇k-means++演算法,設定n_clusters為5,表示分成5群,指定給變數model。
第2到3行:輸入X到KMeans模型進行訓練,顯示這5群的中心點。
Step5)模型預測
輸入資料進行模型預測。
第1行:以X為輸入,使用函式predict進行模型預測。
Step6)資料表新增分群結果
在資料表新增分群結果欄位,並且進行分析。
程式說明
第1行:使用模型預估分群結果到資料集df的欄位「群」。
第2行:使用欄位「群」來群組化輸入資料,並求每一群的平均值。
Step7) 繪製散布圖
繪製收入、花費、所屬群組的散布圖。
程式說明
第1行:使用函式scatter繪製散佈圖,以X['Income']為X軸座標值,X['Spending']為Y軸座標值,設定顏色c為model.labels。
第2到4行:設定X座標軸標籤為Income,設定Y座標軸標籤為Spending,顯示散佈圖到螢幕上。
Step8)使用模組的屬性inertia_決定分群個數
模組的屬性inertia_表示每個樣本點距離該群中心點距離的平方和,當inertia_的值越小表示每個點距離該群中心點越近。當分群個數(n_clusers)越大時,則inertia_數值一定會越小,當分群個數大到某個值以後,inertia_數值下降幅度會越來越不明顯,就可以選用此臨界值當成分群個數。
程式說明
第1行:宣告變數iner為串列。
第2到5行:宣告迴圈變數i,由2到19每次遞增1,使用KMeans進行分群,迴圈變數i設定給參數n_clusters,將訓練資料X輸入模組進行訓練,取得模組屬性inertia_附加到變數iner。
第6行:設定X軸為數值2到19每次遞增1的整數值,Y軸為變數iner。
第7到10行:設定X軸標題為Number of Clusters,設定Y軸標題為inertia,設定X軸座標點為2到19每次遞增2,顯示繪圖結果到螢幕上。
Step9)重新分群
重新分成10個群,並繪製收入、花費、所屬群組的散布圖。
程式說明
第1行:使用KMeans建立K-means分群,設定init為k-means++,表示選擇k-means++演算法,設定n_clusters為10,表示分成10群,指定給變數model。
第2行:輸入X到KMeans模型進行訓練
第3行:使用函式scatter繪製散佈圖,以X['Income']為X軸座標值,X['Spending']為Y軸座標值,設定顏色c為model.labels。
第4到6行:設定X座標軸標籤為Income,設定Y座標軸標籤為Spending,顯示圖片到螢幕上。