【機(jī)器學(xué)習(xí)】聚類算法使用小結(jié)
聚類算法使用小結(jié)
k-means
原理
優(yōu)點
缺點
sklearn 調(diào)參
凝聚聚類
原理
優(yōu)點
缺點
DBSCAN
原理
優(yōu)點
缺點
sklearn 調(diào)參
高斯混合聚類
原理
優(yōu)點
缺點
MeanShift
原理
調(diào)參
很多時候,我們在開展業(yè)務(wù)時,會很明確的知道需要挖掘哪種類型的目標(biāo)客戶:是否會購買產(chǎn)品的客戶、是否會潛在流失的客戶、是否是投訴用戶、是否是欺詐用戶等,然后針對性的做營銷等。
例如,當(dāng)發(fā)現(xiàn)某類群體是初生母親,那么向這類群體推廣母嬰用品,再合適不過了。很多電商后臺系統(tǒng)都具有類似的篩選標(biāo)簽功能,以精準(zhǔn)定位待管理的用戶。
實際工作中,客戶往往會直接丟一堆無標(biāo)簽的數(shù)據(jù)過來,讓你分析這堆數(shù)據(jù)的(潛在)用戶有什么特征或群體屬性,這時候,聚類算法就有用武之地了。
所謂物以類聚,人以群分,聚類就是要把“臭味相投“的數(shù)據(jù)(人/物)聚在一起。
聚類算法的常見應(yīng)用場景:
1、客群劃分:高價值客戶,一般客戶,易流失客戶等,以使用不同的運營策略
2、推薦系統(tǒng):給相似用戶推薦相似商品,如”購買過該商品的用戶還瀏覽了xxx“
3、異常點檢測:即離群點判別,如金融反欺詐、網(wǎng)絡(luò)攻擊等場景;異常的數(shù)據(jù)暗示了異常的行為
聚類算法和分類預(yù)測算法的建模流程大同小異,都包括數(shù)據(jù)清洗、特征工程、模型構(gòu)建、效果評估,由于聚類算法沒有l(wèi)abel作為參照物,在特征工程、效果評估上面會相對分類預(yù)測模型就顯得更加麻煩,但更有意思。
下面,我對項目中經(jīng)常用到的一些聚類算法做個簡單的總結(jié)。
k-means
原理
k-means 可以說是最簡單的聚類算法了(但是看sklearn里面的k-means算法源碼實現(xiàn)發(fā)現(xiàn)并不簡單orz)。
算法首先隨機(jī)選取K個質(zhì)心,對每一個樣本,分別計算該樣本到這K個質(zhì)心的距離,然后將該樣本歸到距離最短的簇(群)中。將簇中所有樣本的均值作為新的質(zhì)心,再將每個樣本分配到最近的簇中,一直迭代直至達(dá)到指定的迭代次數(shù)或者質(zhì)心不在發(fā)生變化時,算法結(jié)束。
優(yōu)點
簡單直接高效 收斂賊快:算法運行效率高,(業(yè)界用的多不是沒有原因的) 結(jié)果可解釋性較強(qiáng)(效果好的情況下)
缺點
基于樣本中心作為質(zhì)心注定了k-means會對異常值、噪聲敏感:比如一個超大個的體重拉高了群體的體重 追求類(群)內(nèi)平方和最小也決定了其只能處理凸型數(shù)據(jù),對復(fù)雜形狀的數(shù)據(jù)無能為力,大多數(shù)時候聚類結(jié)果還是比較粗糙的。 無法處理離散型數(shù)據(jù) 需要指定聚類的個數(shù)(很多時候并不知道數(shù)據(jù)應(yīng)該分成幾類/簇/群才是最好的) 需要指定初始點(初始點的選定對聚類結(jié)果影響較大)
類/簇(cù)/群,根據(jù)上下文,指的是一個意思
sklearn 調(diào)參
class sklearn.cluster.KMeans(n_clusters=8, *, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated',
verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')
sklearn 里的kmeans 比較重要的參數(shù)有兩個,n_clusters(聚類個數(shù)) 和 init(質(zhì)心初始化方法)。
n_clusters的選定需要把業(yè)務(wù)和數(shù)據(jù)結(jié)合起來調(diào)整,或者你覺得這個數(shù)據(jù)大概可以分成10個類,可以從5-15類都試下,挑個效果最好的。
但有時效果最好的其業(yè)務(wù)解釋性并不一定好,還有的時候?qū)?shù)據(jù)分成6類效果是最好的,但業(yè)務(wù)部門說了我就要5類...
init的值其實對聚類結(jié)果影響蠻大的,初始值選的不好可能無法得到有效的聚類結(jié)果。
kmeans 對init的初始化有三種方法:random,k-means++,或者傳入一個ndarray向量,默認(rèn)是使用k-means++方法來初始化質(zhì)心,其核心思想是:初始化的聚類中心之間的相互距離要盡可能的遠(yuǎn),一般選擇默認(rèn)參數(shù)就行。
凝聚聚類
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, *, affinity='euclidean', memory=None, connectivity=None,
compute_full_tree='auto', linkage='ward', distance_threshold=None)
原理
凝聚聚類是一種自底向上的聚類方法:首先將每個樣本當(dāng)做一個聚類,然后合并距離最近或者最相似的兩個類,直到滿足某種停止準(zhǔn)則。
從單個樣本多個群向上聚類到幾個群的過程,形象化表述為自底向上
最核心的點是在如何衡量兩個類的距離或者相似度。找了些相關(guān)資料,發(fā)現(xiàn)定義相似度的方法還是蠻多的,這里列舉幾個。
單鏈:兩個不同的簇中,離得最近的兩個點之間的距離作為簇間的距離,取距離值最小的兩個簇進(jìn)行合并,即MIN()
全鏈:兩個不同的簇中,離得最遠(yuǎn)的兩個點之間的距離作為簇間的距離,取距離值最小的兩個簇進(jìn)行合并,即MAX()
平均鏈:每個簇中所有點之間的平均距離,取點平均距離值最小的的兩個簇進(jìn)行合并,即AVERAGE
方差:使得所有簇中的方差增加最小的方式合并,這通常會得到大小差不多相等的簇(對應(yīng)sklearn中的ward)
優(yōu)點
能夠處理具有復(fù)雜形狀(非凸型)的數(shù)據(jù) 無需指定聚類的個數(shù)(sklearn 中的 AgglomerativeClustering 將聚類的數(shù)量作為算法的停止準(zhǔn)則)

缺點
每次只合并兩個簇,計算復(fù)雜度高,不適用于大數(shù)據(jù)量的聚類 只能基于已有的數(shù)據(jù)聚類,無法對新的數(shù)據(jù)進(jìn)行預(yù)測,只做當(dāng)前數(shù)據(jù)的觀察
DBSCAN
原理
DBSCAN(density-based spatial clustering of applications with noise),翻譯過來就是:具有噪聲的基于密度的空間聚類應(yīng)用。
它能夠?qū)W習(xí)和識別數(shù)據(jù)密集區(qū)域,并將密度高的區(qū)域劃分為簇,密度低的區(qū)域作為簇間的分隔。
class sklearn.cluster.DBSCAN(eps=0.5, *, min_samples=5, metric='euclidean',
metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)
優(yōu)點
無需指定聚類的個數(shù) 可以處理復(fù)雜形狀的數(shù)據(jù) 抗噪聲,能夠識別噪聲點
缺點
簇之間的密度不均勻時,聚類效果可能不好。(比如某個簇,密度較大,另一個簇密度較稀疏,當(dāng)調(diào)大鄰域內(nèi)最小樣本點時,密度較稀疏的簇會變化較快。) 跟凝聚聚類一樣,無法對新的數(shù)據(jù)進(jìn)行預(yù)測
sklearn 調(diào)參
該算法在大多數(shù)數(shù)據(jù)集上面都能夠獲得不錯的效果,但是調(diào)參過程有時非??部?。關(guān)鍵是目前對復(fù)雜形狀的聚類評估效果并不理想。關(guān)注參數(shù):eps,min_samples。
高斯混合聚類

class sklearn.mixture.GaussianMixture(n_components=1, *, covariance_type='full', tol=0.001, reg_covar=1e-06, max_iter=100,
n_init=1, init_params='kmeans', weights_init=None,
means_init=None, precisions_init=None, random_state=None, warm_start=False, verbose=0, verbose_interval=10)
原理
算法假定每個聚類的簇都符合高斯分布(正態(tài)分布),樣本數(shù)據(jù)呈現(xiàn)的分布就是各個聚類的分布的疊加,所以稱為高斯混合。
該算法首先指定高斯混合成分個數(shù)K(這里K就是要聚類的個數(shù)),隨機(jī)給每一個分布的均值和方差(協(xié)方差)賦初始值。對每一個樣本,計算其在各個高斯分布下的后驗概率(EM中的E步),再根據(jù)最大似然估計,將每個樣本對該高斯分布的概率作為權(quán)重來計算加權(quán)均值和方差(協(xié)方差)(EM中的M步),用更新之后的值替換原來的初始值,直至模型滿足停止條件(比如迭代次數(shù)),算法結(jié)束。
優(yōu)點
只要給定的成分個數(shù)足夠多,理論上可以任意逼近任何連續(xù)的概率分布
缺點
計算量較大 其實真實數(shù)據(jù)好多不服從正太分布,對于一些復(fù)雜數(shù)據(jù)出現(xiàn)偏差的可能性還是挺高。
MeanShift
class sklearn.cluster.MeanShift(*, bandwidth=None, seeds=None, bin_seeding=False,
min_bin_freq=1, cluster_all=True, n_jobs=None, max_iter=300)
原理
MeanShift是一種非參數(shù)聚類算法,無需指定聚類的數(shù)目。主要涉及兩個概念Mean(均值)、Shift(偏移)。
其算法思想很簡單,首先隨機(jī)選取初始迭代點,將該點到附近區(qū)域內(nèi)所有點分別組成向量求和取平均偏移量,移動該點至平均偏移向量末端,作為新的迭代點,不斷移動,直至滿足指定條件,算法結(jié)束。
調(diào)參
MeanShift這個算法有稍微嘗試了下,但是好像效果相對其他聚類算法不突出,用的不多。
高維可視化PCA、TSNE
很多時候,即使非常熟悉業(yè)務(wù),也做了很多的數(shù)據(jù)探索,你也很難判斷應(yīng)該選擇哪種聚類模型。
如果每個模型都試一遍的話,時間成本太高,而將(高維)數(shù)據(jù)可視化,則能指導(dǎo)我們選擇聚類模型的方向。
數(shù)據(jù)可視化首先是將高維數(shù)據(jù)降到低維(一般二維),然后基于低維數(shù)據(jù)進(jìn)行可視化,常用的方法有兩種:PCA 和TSNE。
PCA是一種被廣泛應(yīng)用的數(shù)據(jù)壓縮、數(shù)據(jù)降維方法,該方法以方差最大的方向作為坐標(biāo)軸方向?qū)?shù)據(jù)旋轉(zhuǎn)以保留主要信息,旋轉(zhuǎn)后的特征在統(tǒng)計上不相關(guān)。
這里以sklearn里的iris數(shù)據(jù)集為例,數(shù)據(jù)屬性為:花萼長度、花萼寬度、花瓣長度、花瓣寬度四個特征,將這四個特征標(biāo)準(zhǔn)化處理后用PCA降維得到下圖:

PCA在旋轉(zhuǎn)時沒有用到任何類別信息,降維后的數(shù)據(jù)相對于原數(shù)據(jù)相當(dāng)于新的數(shù)據(jù)變換,一般很難對圖中的兩個軸做出解析。
還有一類用于可視化的算法稱為流式學(xué)習(xí)算法,TSNE是其中的一種,降維效果奇好,其思想是找到數(shù)據(jù)的一個二維表示,盡可能地保持原數(shù)據(jù)點之間的距離,讓在原始特征空間中距離較近的點更加靠近,相距較遠(yuǎn)的點更加遠(yuǎn)離。
t-SNE重點關(guān)注距離較近的點,而不是保持距離較遠(yuǎn)的點之間的距離。換句話說,它試圖保存那些表示哪些點比較靠近的信息,這里同樣使用iris數(shù)據(jù)進(jìn)行可視化:

t-SNE在稍大數(shù)據(jù)量的時候效率很低。
如果要聚類的數(shù)據(jù)比較大,可以考慮抽樣可視化。
如果數(shù)據(jù)形狀復(fù)雜,這時候基于指標(biāo)的效果評估并不好,可以考慮基于抽樣數(shù)據(jù)聚類,然后基于聚類結(jié)果建立分類模型。
這里pca和tsne可視化iris數(shù)據(jù)的效果區(qū)分度不是很明顯,其實從使用經(jīng)驗來看,數(shù)據(jù)量在千以上的情況下,同一份數(shù)據(jù)使用tsne進(jìn)行可視化,數(shù)據(jù)的區(qū)分度比pca要好很多,這是因為pca需要對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理,使得大部分?jǐn)?shù)據(jù)都集中在一個很小的范圍內(nèi),但是數(shù)據(jù)量越大tsne的處理速度越慢,很無奈。
無監(jiān)督模型的特征選擇
無監(jiān)督模型的特征選擇,sklearn上還沒有相關(guān)的API,其實挺麻煩的:應(yīng)該使用何種評判標(biāo)準(zhǔn)來認(rèn)為這個特征是對聚類算法有效的?[本身就是無監(jiān)督]
網(wǎng)上有一些方法,比如基于遺傳算法、模式相似性判斷、復(fù)相關(guān)系數(shù)之類的,也有提到可以參考有監(jiān)督學(xué)習(xí)的wrapper方法進(jìn)行特征選擇,感覺還蠻有意思,感興趣的可自行查找相關(guān)資料。
效果評估
聚類結(jié)果的效果評估的核心原理都基本一樣,通過類內(nèi)距離和類間距離判斷,類內(nèi)距離越小,類間距離越大說明聚類效果越好,如輪廓系數(shù)(Silhouette Coefficient)。
但不能盲目相信指標(biāo),尤其是針對任意形狀的簇,雖然指標(biāo)效果很差,但是實際未必。很多時候,你用某個指標(biāo)評估聚類效果,如果指標(biāo)值非常好,那說明模型用對了,如果指標(biāo)值表現(xiàn)很差,那很有可能是評估方法選錯了。
目前沒看到靠譜的實踐方法。
總結(jié)
參考各種算法,對聚類的效果示意圖:

也可以加一下老胡的微信 圍觀朋友圈~~~
推薦閱讀
(點擊標(biāo)題可跳轉(zhuǎn)閱讀)
老鐵,三連支持一下,好嗎?↓↓↓
