聚類分析(cluster analysis)是常見的數據挖掘手段,其主要假設是數據間存在相似性。而相似性是有價值的,因此可以被用于探索數據中的特性以產生價值。常見應用包括:
用戶分割:將用戶劃分到不同的組別中,并根據簇的特性而推送不同的廣告欺詐檢測:發現正常與異常的用戶數據,識別其中的欺詐行為
如上圖,數據可以被分到紅藍綠三個不同的簇(cluster)中,每個簇應有其特有的性質。顯然,聚類分析是一種無監督學習,是在缺乏標簽的前提下的一種分類模型。當我們對數據進行聚類后并得到簇后,一般會單獨對每個簇進行深入分析,從而得到更加細致的結果。
常見的聚類方法有不少,比如K均值(K-Means),譜聚類(Spectral Clustering),層次聚類(Hierarchical Clustering),大部分機器學習參考書上都有介紹,此處不再贅述。今天主要探討實際聚類分析時的一些技巧。
01 如何選擇適合的聚類算法
聚類算法的運算開銷往往很高,所以最重要的選擇標準往往是數據量。
但數據量上升到一定程度時,如大于10萬條數據,那么大部分聚類算法都不能使用。最近讀到的一篇對比不同算法性能隨數據量的變化[1]很有意思。在作者的數據集上,當數據量超過一定程度時僅K均值和HDBSCAN可用。
我的經驗也是,當數據量超過5萬條數據以后,K均值可能是比較實際的算法。但值得注意的是,K均值的效果往往不是非常好,我曾在如何正確使用「K均值聚類」?中對K均值進行過總結:
因此不難看出,K均值算法最大的優點就是運行速度快,能夠處理的數據量大,且易于理解。但缺點也很明顯,就是算法性能有限,在高維上可能不是最佳選項。
一個比較粗淺的結論是,在數據量不大時,可以優先嘗試其他算法。當數據量過大時,可以試試HDBSCAN。僅當數據量巨大,且無法降維或者降低數量時,再嘗試使用K均值。
一個顯著的問題信號是,如果多次運行K均值的結果都有很大差異,那么有很高的概率K均值不適合當前數據,要對結果謹慎的分析。
另一種替代方法是對原始數據進行多次隨機采樣得到多個小樣本,并在小樣本上聚類,并融合結果。比如原始數據是100萬,那么從中隨機采樣出100個數據量等于1萬的樣本,并在100個小數據集上用更為復雜的算法進行聚類,并最終融合結果。
此處需要注意幾點問題:
隨機采樣的樣本大小很重要,也不能過小。需要足夠有代表性,即小樣本依然可以代表總體的數據分布。如果最終需要劃分很多個簇,那么要非常小心,因為小樣本可能無法體現體量很小的簇。
在融合過程中要關注樣本上的聚類結果是否穩定,隨機性是否過大。要特別注意不同樣本上的簇標號是否統一,如何證明不同樣本上的簇結果是一致的。
因此我的經驗是,當數據量非常大時,可以優先試試K均值聚類,得到初步的結果。如果效果不好,再通過隨機采樣的方法構建更多小樣本,手動融合模型提升聚類結果,進一步優化模型。
02 聚類分析時需要使用什么變量?
這個是一個非常難回答的問題,而且充滿了迷惑性,不少人都做錯了。舉個簡單的例子,我們現在有很多客戶的商品購買信息,以及他們的個人信息,是否該用購買信息+個人信息來進行聚類呢?
未必,我們需要首先回答最重要的一個問題:我們要解決什么問題?
如果我們用個人信息,如性別、年齡進行聚類,那么結果會被這些變量所影響,而變成了對性別和年齡的聚類。所以我們應該先問自己,“客戶購物習慣”更重要還是“客戶的個人信息”更重要?
如果我們最在意的是客戶怎么花錢,以及購物特征,那就應該完全排除客戶的個人信息(如年齡性別家庭住址),僅使用購買相關的數據進行聚類。這樣的聚類結果才是完全由購買情況所驅動的,而不會受到用戶個人信息的影響。
那該如何更好的利用客戶的個人信息呢?這個應該被用在聚類之后。當我們得到聚類結果后,可以對每個簇進行分析,分析簇中用戶的個人情況,比如高凈值客戶的平均年齡、居住區域、開什么車。無關變量不應該作為輸入,而應該得到聚類結果后作為分析變量。
一般情況下,我們先要問自己,這個項目在意的是什么?很多時候個人信息被錯誤的使用在了聚類當中,聚類結果完全由個人信息所決定(比如男性和女性被分到了兩個簇中),對于商業決策的意義就不大了。一般來說,應該由商業數據驅動,得到聚類結果后再對每個簇中的用戶個人信息進行整合分析。
但值得注意的是,這個方法不是絕對的。在聚類中有時候也會適當引入個人信息,也可以通過調整不同變量的權重來調整每個變量的影響。
03 如何分析變量的重要性?
首先變量選擇是主觀的,完全依賴于建模者對于問題的理解,而且往往都是想到什么用什么。因為聚類是無監督學習,因此很難評估變量的重要性。介紹兩種思考方法:
考慮變量的內在變化度與變量間的關聯性:一個變量本身方差很小,那么不易對聚類起到很大的影響。如果變量間的相關性很高,那么高相關性間的變量應該被合并處理。直接采用算法來對變量重要性進行排序:比如 Principal Feature Analysis [2],網上有現成的代碼 [3]。
另一個雞生蛋蛋生雞的問題是,如果我用算法找到了重要特征,那么僅用重要特征建模可以嗎?這個依然不好說,我覺得最需要去除的是高相關性的變量,因為很多聚類算法無法識別高相關性,會重復計算高相關性特征,并夸大了其影響,比如K均值。
04 如何證明聚類的結果有意義?如何決定簇的數量?
聚類分析是無監督學習,因此沒有具體的標準來證明結果是對的或者錯的。一般的判斷方法無外乎三種:
人為驗證聚類結果符合商業邏輯。比如我們對彩票客戶進行聚類,最終得到4個簇,其中分為:
“高購買力忠實客戶”:花了很多錢的忠實客戶,他們可能常年購買且花費不菲
“普通忠實客戶”:常年購買,但每次的購買額度都不大
“刺激性消費單次購買者”:只購買了幾次,但是一擲千金
“謹慎的單次購買者”:只購買了幾次,每次買的都很謹慎
我們可以用通過商業邏輯來解釋聚類結果,結果應該大致符合行業專家的看法。最終你的聚類結果需要回歸到現實的商業邏輯上去,這樣才有意義。
預先設定一些評估標準,比如簇內的緊湊度和簇間的疏離度,或者定義好的函數如Silhouette Coefficient。一般來說設定一個好的評估標準并不容易,所以不能死板的單純依賴評估函數。
通過可視化來證明不同簇之間的差異性。因為我們一般有超過兩個變量,所以會需要先對數據進行壓縮,比如很多流形學習的方法多維縮放(multi-dimensional scaling)。
以下圖為例,我把數據分成了四個簇,并用T-SNE壓縮到二維并繪制出來。從直觀上看,不同簇間有了一定區別。類似的可視化也可以在變量間兩兩繪制,或者直接畫pairplot。
所以如何定義一個好的聚類結果?我認為應該符合幾個基本標準:
符合商業常識,大致方向上可以被領域專家所驗證可視化后有一定的區別,而并非完全隨機且交織在一起如果有預先設定的評估函數,評估結果較為優秀
因此決定簇的數量也應該遵循這個邏輯,適當的數量應該滿足以上三點條件。如果某個簇的數量過大或者過小,那可以考慮分裂或者合并簇。
當然,聚類作為無監督學習,有很多模棱兩可的地方。但應時時牢記的是,機器學習模型應服務商業決策,脫離問題空談模型是沒有意義的。
-
數據挖掘
+關注
關注
1文章
406瀏覽量
24287 -
聚類算法
+關注
關注
2文章
118瀏覽量
12145 -
聚類分析
+關注
關注
0文章
16瀏覽量
7424
原文標題:【集客經營】干貨:如何對用戶進行「聚類分析」?
文章出處:【微信號:xiacoinfo,微信公眾號:資治通信】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論