熱線電話:13121318867

登錄
首頁精彩閱讀手中無y,心中有y——聚類算法的正確建模方式
手中無y,心中有y——聚類算法的正確建模方式
2021-12-10
收藏
手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

CDA數據分析師 出品

作者:CDA教研組

編輯:JYD

聚類算法是屬于無監督機器學習方法;機器學習里把算法分為有監督無監督的算法,所謂有監督,即我想研究的數據集有目標數據,白話點就是建模里大家常說的那個y,如我想基于公司數據庫已經有的相關數據集訓練一個模型,用來預測客戶是否會流失,從數據庫中得到的數據集里是有一個特征(一列)是客戶是否流失的,可能1代表流失,0代表不會流失;但業務的初期或者數據庫中沒有該特征,即手中無y,那該怎么辦?如對客戶進行價值分群,此時對于這種目標明確,但確實缺少y這一列這種分析需求,可考慮聚類算法來實現。

首先簡單闡述一下聚類算法的思想,其邏輯是計算觀測值之間的距離,然后根據距離來進行分組(簇),目的是組內之間的距離盡可能小,而組與組之間的距離大(即差異大)來達到分類(分組)的目的,得到的結果可以用來做數據挖掘。

回到我們的標題,我們說聚類算法是無監督機器學習,沒有y,那怎么還說心中要有y呢?我們看下面的一個例子。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖1

如圖1給出一些彈珠,我們的需求是將這些不同差異的彈珠做聚類分析,可這些彈珠不同的差異太多了在不同的角度上,如果你心里沒有目的,是很難將這些彈珠做好聚類分群的。

如果我們的目的是根據彈珠的體積大小這個目的進行分群的話,可能會聚成三類,即圖2里的大中小三種體積;

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖2

如果我們的需求是根據彈珠的透明程度,可能會分成圖3所示的2類:透明的一類和不透明的一類;

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖3

那如果我們的關注點是彈珠的顏色,可能會成為圖4所示的幾類,紅色系、黃色系、藍色系和紫色系等;

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖4

上面的例子我們可以看到,即使對于同一筆資料,根據需求的不同,聚類分群的結果也不太一樣,如果一個商業需求,分析師沒有目的或者會錯需求的話,那挖掘出來的結果大概率是不會滿意的。

聚類算法要解決三個問題:

1.如何表示觀測值之間的相似性

2.如何根據這些相似性將類似的觀測值分到同一個類

3.對所有的觀測值分好類之后,如何對每一個類(群、組、簇這些說法都可)進行特征描述

對于第一個問題,怎么計算觀測值之間的相似性呢,計算距離,常見的計算距離方法有曼哈頓距離、歐式距離。

圖5是曼哈頓距離的公式和演示

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖5

曼哈頓距離,即算直角距離,如圖5中object1和object2兩個觀測點的虛線(直角)距離就是曼哈頓距離,R是指相應特征的范圍;圖6是一個計算的例子。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖6

兩個觀測值,分別有年紀和收入兩個維度,對其使用曼哈頓距離計算其距離為0.4。

下面要講的另外一種距離是歐式距離,歐式距離我們很早就接觸過,比如兩個點在二維坐標軸上x(x1,x2)和y(y1,y2)他們的歐式距離平方就是(x1-y1)^2+(x2-y2)^2;

圖7是歐式距離的公式,歐式距離是Minkowski距離的一種推廣。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖7

這就是使用計算距離的公式來表示觀察與觀察之間的相似性。

那么第二個問題:如何根據這些相似性將類似的觀測值分到同一個類?這就是涉及到聚類的算法。

聚類算法根據樣本的不同處理會有很多種方法,這里會介紹層次聚類和基于劃分聚類里的kmeans聚類(該兩種聚類商業上經常用)。

層次聚類,也有譯成系統聚類,指的是形成類相似度層次圖譜,便于直觀的確定類之間的劃分。該方法可以得到較理想的分類,但是難以處理大量樣本。

層次聚類的算法步驟是:

1.計算點與點之間的距離

2.將最近的兩個觀測點聚為一類,將其看做一個整體(類)計算與其他類之前的距離

3.一直重復上述過程,直至所有的觀測被聚為一類

如圖8是系統聚類的一個聚類過程演示:首先計算點與點之間的距離,如我們計算點1和點3之間的距離,發現其兩個點相對來說較近,我們把該兩個點化為一類叫類1,我們發現點2和點5距離第二近,所以也合并起來歸為一個類2,接著計算發現,點4與點5較為近,但是點5已經和點2合并了,所以呢點4、點2和點5合并成類3,接著點與點的距離矩陣告訴我們點1和點2的距離為第四近,但是點2、5、4已經是類3了,點1也屬于類1,所以類1和類3合并成類4,類4再和點6合并為最后的類5。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖8

分層聚類到底分幾個類呢,往往是通過層次樹(樹形圖)來結合業務來決定的,圖9是上面演示聚類結果的層次樹。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖9

層次樹的x軸是觀測點,y軸是距離,聚類分析的目的是組內之間的距離小,組與組之間的距離盡可能大(差異明顯),從y軸畫一條平行于x軸的直線,如我在y軸0.1到0.15之間畫一條平行x軸的直線,與層次圖有4個交點,意思是說分成了4個類(組),且這時組間距離是最大的(有4個交點的上平行線和下平行線之間的距離),1和3分成一組,2和5分成1組,4,6單獨一個組,這時算法角度給出的最優分組,但是也要結合業務場景,比如算法角度給出分成20組組間差異最大,但是分成20個群進行針對性營銷顯然大部分業務是不合適的。

我們剛才說,近的點劃分到一個類,那么怎么計算類與類之間的距離?如果把各觀測點圈在一個橢圓里的話,即怎么去計算兩個橢圓的距離?

計算類與類之間的距離方法也有很多,如平均鏈接法、重心法、Ward最小方差法;下面只介紹用的頻率高的Ward最小方差法。

所謂Ward最小方差法,是思想是使各個觀測之間的離差平方和最小。

圖10是該方法的計算公式,其特點是較少受到異常值的影響,適用范圍廣。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖10

圖11數據演示怎么計算各觀測之間的離差平方和

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖11

以上圖為例,一開始如果將AB合成一組,那么此時SS的值是

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

如果將CD合成一個組,其SS值是

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

當合并成3組時,如果是AB、CD和E的組合,那么SS的值是1+4+0=5,以同樣的計算方式,可以得到不同的分組情況和相應的SS值,如下圖。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式
手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

我們找出SS值最小的分組,上圖看到分成4群即AB分成一類,C、D、E單獨一類離差平方和最?。?),分成3群時最小的SS值是3.5,其他情況下的分群數量最小SS值也可看出。

接下來我們講層次聚類的建模流程。

1. 針對業務需求,我們select到相關的數據集,通常要經過處理才能進行分析:

a) 缺失值

b) 異常值(極大或極?。?/span>

c) 分類變量需要轉化為啞變量(0/1數值)

d) 分類變量類別過多

當然有些算法允許有缺失值、異常值等資料,如決策樹,但聚類不支持這些情況,所以要處理。

2.要做變量標準化

變量的量綱的不一樣引起計算距離的偏差,因此要統一,統一的方式有兩種方法:

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

3.不同維度的變量,相關性盡量低

圖12演示了大部分公司業務普遍性的變量分類模式,如圖12,將數據分成購買記錄數據(如消費頻率、消費的間隔周期等)、消費習慣行為等數據(如消費的區域)、第三方行為數據(如網絡瀏覽偏好等)。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖12

4.層次聚類演示和確定聚類

層次聚類的一大優點是可以結合聚類可視化來對聚類結果進行業務上的理解和驗證,圖13是幾個省份的經濟數據聚類結果,肉眼觀察,如果你分成4的話,那上海、廣東是單獨一類,天津、廣西、福建、遼寧、河北是另外一類,浙江、江蘇、山東、是第四類,那么現在看看算法的聚類跟我看左圖的肉眼觀察是否一致,如果一致,那說明算法在解釋上也是很好的;

不過看右邊的樹形圖展示,其兩類是建議的,即福建、遼寧、河北、天津、廣西是一類,其他省份為另外一類,因為這樣劃分類與類之間的距離最長(差異最大),這里根據你的聚類觀察結合業務需求分成4類,或者根據算法的建議分成2類且能在商業情景下能夠得到解釋也可(這里根據當時各省的情況,上海跟山東劃分一類應該不合理的,上海是一線城市,這里分成4類合適點)。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖13

值得一提的是層次分類可以得到較為理想的分類數量,但是難處理大量樣本數據。所以我們需要講另外一種聚類方法。

第二種要講的聚類是叫kmeans聚類,也就是我們常說的k均值聚類。

Kmeans聚類的算法步驟:

1.選擇數據,初始化中心點

2.將離中心點較近的點劃分到相應的類

3.更新類的中心

4.重新將離數據近的點劃分到相應的類

5.反復進行上面3,4步驟,直到分類的結果不再變化

圖14是該算法一個簡單的演示。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖14

首先在我需要分類的數據上隨機選5個中心點(即K=5),然后計算觀測點與中心點的距離,劃分到相應的中心點所屬的群里,接著不用第一次設置的中心點,現在重新設置5個中心點的位置,繼續計算觀測點與現在中心點的位置,基于遠近劃分到相應的5個不同群中,反復重復這種設置中心點,劃分數據這種操作,直到數據的劃分情況不再發生變動。

Kmeans聚類的建模流程同層次聚類一樣,即

1.預先處理變量的缺失值、異常值

2.變量標準化

3.不同維度的變量,相關性盡量低

4.確定合適的分群個數

不過在K值選擇上主要推薦輪廓系數(Silhouette Coefficient),并結合以下注意事項:

  • 分群結果的穩定性
  • 重復多次分群,看結果是否穩定
  • 分群結果是否有好解釋的商業意義

圖15是輪廓系數的公式

樣本輪廓系數

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

整體輪廓系數

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖15

其中a(i)表示觀測i到同一類內觀測點距離的均值,b(i)表示觀測點i到不同類內所有點距離的均值的最小值,S(i)表示觀測i的輪廓系數,若a(i)小于b(i)則說明該觀測點在聚類的類中是合理的,此時a(i)/b(i)的值趨向于0,那么S(i)越接近1,聚類的效果越好;若a(i)大于b(i),說明觀測點還不如在別的類中,聚類的效果不好,此時b(i)/a(i)的值趨向于0,從而S(i)趨向于-1,若a(i)=b(i),則不能判斷觀測點i在哪個類效果中較好,此時S(i)為0,S(i)的值域-1到1,其值越小表示聚類的效果越差,其值越大代表聚類效果好,將所以觀測點的輪廓系數值相加求均值,就可以得到整個已聚類數據集的輪廓系數,同樣,衡量其聚類好壞的標準與單個觀測點的輪廓系數的衡量方式是一致的。

不過這里還需注意一下,Kmeans處理大量樣本聚類有優勢,但聚類的結果展示上不如層次聚類有好理解和可解釋性,所以使用kmeans聚類后,所做的聚類事后分析,往往要借助決策樹形圖來輔助理解。

5.聚類事后分析

聚類分好后需要拿來給營銷相關人員看,這就需要分類的結果可解釋性好:里面到底是怎么根據不同維度來將數據分群的,然后跟業務經驗得到驗證;這里借助決策樹的可視化(決策樹圖)來實現,我們知道決策樹有監督的學習方法,這里的處理就是把上面聚類算法得到的類別看成目標y,根據之前的各維度特征來使用決策樹算法。如圖16是一個先聚類后再用決策樹的一個可視化結果展示。

手中無y,心中有y——<a href='/map/julei/' style='color:#000;font-size:inherit;'>聚類</a>算法的正確建模方式

圖16

怎么看決策樹的可視化圖呢,從上到下,最上面的叫根節點,其中value是一個含四個元素的列表,意思是分成4類,往下的剪頭叫拆分,直到不能再拆分的每個“矩形”叫葉子節點,中間銜接的“矩形”叫決策節點;

那怎么從決策樹形圖看出分類結果的好壞以及對每個群進行描述達到可解釋的目的?

我們看value里是否其中一個元素的數值要遠遠大于其他的,如在第三層,value=18750遠遠大于47,1060,29,意思是說有18750個點被劃分到了class為2的類里,這一層其他class類的劃分情況也是很“干凈”的,所以決策樹在第三層的時候(劃分4類)分類效果就很好了;

那么怎么解讀呢,比如class2的用戶群特點是:不用柜臺(TBM<-0.07)、也不用ATM POS機(ATM POS<=-0.374),那么顯然這類客戶什么都不用,說明在該銀行業務當中,class2這類群體是流失客戶,再看看class0這類群體特征:不用柜臺,但是用POS機,很可能是這些喜歡方便,取款金額頻繁,取款金融少等這些特點的人群,其他兩個類同樣可以根據這種樹形圖來解釋。

回答第三個問題,對所有的觀測值分好類之后,如何對每一個類進行特征描述?

聚類的結果要詳細的作描述性統計,甚至作抽樣的客戶訪談,以了解客戶的真實情況,因此讓業務人員滿足客戶管理的目標,是聚類的終極目的。

上述建模流程是聚類的一般性流程,其實就應用角度來說,快速聚類兩種運用場景是:

1. 發現異常情況:如果不對數據進行任何形式的轉換,只是經過中心標準化或級差標準化就進行快速聚類,會根據數據分布特征得到聚類結果。這種聚類會將極端數據聚為幾類。這種方法適用于統計分析之前的異常值剔除,對異常行為的挖掘,比如監控銀行賬戶是否有洗錢行為、監控POS機是有從事套現、監控某個終端是否是電話卡養卡客戶等等。

2. 將個案數據做劃分:出于客戶細分目的的聚類分析一般希望聚類結果為大致平均的幾大類,因此需要將數據進行轉換,這種方法適用場景包括客戶消費行為聚類、客戶積分使用行為聚類等等。

文章的最后,我們再來總結一下本文的內容,就算法角度,講了層次聚類和kmeans聚類,就建模層面來說,通常的流程是:變量歸一化=>分布轉換=>主成分=>聚類,歸一化我們是希望剔除掉不同量綱,范圍的影響(因為要計算距離),而分布轉換這個步驟是因為我們希望將客戶均勻的分為若干類,在變量上,我們希望不同維度下的變量,相關性程度較低,對于多維的數據集來說,可以使用主成分分析來將變量進行降維;而使用聚類算法得到分群數量需要進行事后分析,來跟業務經驗進行驗證,達到可解釋且可進行客戶畫像的目的。

如果應用需求是發現異常情況下的聚類,其流程為變量歸一化=>主成分=>聚類,因為這種需求會根據數據分布特征得到聚類結果,未分布轉換情況下,這種聚類會將極端數據聚為幾類,從而幫助我們對異常行為進行挖掘。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢