當前位置:
首頁 > 最新 > KMeans中自動K值的確認方法

KMeans中自動K值的確認方法

1 前言

聚類常用於數據探索或挖掘前期,在沒有做先驗經驗的背景下做的探索性分析,也適用於樣本量較大情況下的數據預處理等方面工作。例如針對企業整體用戶特徵,在未得到相關知識或經驗之前先根據數據本身特點進行用戶分群,然後再針對不同群體做進一步分析;例如將連續數據做離散化,便於做後續分類分析應用。

KMeans是聚類方法中非常常用的方法,並且在正確確定K的情況下,KMeans對類別的劃分跟分類演算法的差異性非常小,這也意味著KMeans是一個準確率非常接近實際分類的演算法。本文將討論如下基於自動化的方法確立K值。

本案例是《Python數據分析與數據化運營》中「7.11案例-基於自動K值的KMeans廣告效果聚類分析」的一部分,其ad_performance.txt和源代碼chapter7_code2.py位於「附件-chapter7」中,該附件可以在可從http://www.dataivy.cn/book/python_book.zip或https://pan.baidu.com/s/1kUUBWNX下載。

2 實現思路

K值的確定一直是KMeans演算法的關鍵,而由於KMeans是一個非監督式學習,因此沒有所謂的「最佳」K值。但是,從數據本身的特徵來講,最佳K值對應的類別下應該是類內距離最小化並且類間距離最大化。有多個指標可以用來評估這種特徵,比如平均輪廓係數、類內距離/類間距離等都可以做此類評估。基於這種思路,我們可以通過枚舉法計每個K下的平均輪廓係數值,然後選出平均輪廓係數最大下的K值。

3 核心過程

假設我們已經擁有一份預處理過的數據集,其中的異常值、缺失值、數據標準化等前期工作都已經完成。下面是完成自動K值確定的核心流程:

該步驟的主要實現過程如下:

定義初始變數score_list和silhouette_int。score_list用來存儲每個K下模型的平局輪廓係數,方便在最終列印輸出詳細計算結果;silhouette_int的初始值設置為-1,每個K下計算得到的平均輪廓係數如果比該值大,則將其值賦值給silhouette_int。

提示:對於平均輪廓係數而言,其值域分散式[-1,1]。因此silhouette_int的初始值可以設置為-1或比-1更小的值。

使用for循環遍歷每個K值,這裡的K的範圍確定為從2-10.一般而言,用於聚類分析的K值的確定不會太大。如果值太大,那麼聚類效果可能不明顯,因為大量信息的都會被分散到各個小類之中,會導致數據的碎片化。

通過KMeans(n_clusters=n_clusters, random_state=0)建立KMeans模型對象model_kmeans,設置聚類數為循環中得到的K值,設置固定的初始狀態。

對model_kmeans使用fit_predict得到其訓練集的聚類標籤。該步驟其實無需通過predict獲得標籤,可以先使用fit方法對模型做訓練,然後使用模型對象model_kmeans的label_屬性獲得其訓練集的標籤分類。

使用metrics.silhouette_score方法對數據集做平均輪廓係數得分檢驗,將其得分賦值給silhouette_tmp,輸入參數有兩個:

X:為原始輸入的數組或矩陣

cluster_labels:訓練集對應的聚類標籤

接下來做判斷,如果計算後的得分大於初始化變數的得分,那麼:

將最佳K值存儲下來,便於後續輸出展示

將最好的平均輪廓得分存儲下來,便於跟其他後續得分做比較以及輸出展示

將最好的模型存儲下來,這樣省去了後續再做最優模型下fit(訓練)的工作

將最好的聚類標籤存儲下來,這樣方便下面將原始訓練集與最終標籤合併

每次循環結束後,將當次循環的K值以及對應的評論輪廓得分使用append方法追加到列表。

最後列印輸出每個K值下詳細信息以及最後K值和最優評論輪廓得分,返回數據如下:

上述結果顯示了不同K下的平均輪廓得分。就經驗看,如果平均輪廓得分值小於0,意味著聚類效果不佳;如果值大約0且小於0.5,那麼說明聚類效果一般;如果值大於0.5,則說明聚類效果比較好。本案例在K=4時,得分為0.5697,說明效果較好。

對於上述得到的結果,將最優K值下得到的KMeans模型的結果,可以通過各類別的類內、外數據的對比以及配合雷達圖或極坐標圖做分析解釋。

各聚類類別顯著特徵對比

4 引申思考

注意,即使在數據上聚類特徵最明顯,也並不意味著聚類結果就是有效的,因為這裡的聚類結果用來分析使用,不同類別間需要具有明顯的差異性特徵並且類別間的樣本量需要大體分布均衡。而確定最佳K值時卻沒有考慮到這些「業務性」因素。

案例中通過平均輪廓係數的方法得到的最佳K值不一定在業務上具有明顯的解讀和應用價值。如果最佳K值的解讀無效怎麼辦?有兩種思路:

擴大K值範圍,例如將K的範圍調整為[2,12],然後再次運算看更大範圍內得到的K值是否更加有效並且能符合業務解讀和應用需求。

得到平均輪廓係數「次要好」(而不是最好)的K值,再對其結果做分析。

對於不同類別的典型特徵的對比,除了使用雷達圖直觀的顯示外,還可以使用多個柱形圖的形式,將每個類別對應特徵的值做柱形圖統計,這樣也是一個非常直觀的對比方法。具體參考下圖:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python那些事 的精彩文章:

螞蟻爬桿問題

TAG:Python那些事 |