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,顯示圖片到螢幕上。