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

缺點(diǎn)
每次只合并兩個(gè)簇,計(jì)算復(fù)雜度高,不適用于大數(shù)據(jù)量的聚類 只能基于已有的數(shù)據(jù)聚類,無(wú)法對(duì)新的數(shù)據(jù)進(jìn)行預(yù)測(cè),只做當(dāng)前數(shù)據(jù)的觀察
DBSCAN
原理
DBSCAN(density-based spatial clustering of applications with noise),翻譯過(guò)來(lái)就是:具有噪聲的基于密度的空間聚類應(yīng)用。
它能夠?qū)W習(xí)和識(shí)別數(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)點(diǎn)
無(wú)需指定聚類的個(gè)數(shù) 可以處理復(fù)雜形狀的數(shù)據(jù) 抗噪聲,能夠識(shí)別噪聲點(diǎn)
缺點(diǎn)
簇之間的密度不均勻時(shí),聚類效果可能不好。(比如某個(gè)簇,密度較大,另一個(gè)簇密度較稀疏,當(dāng)調(diào)大鄰域內(nèi)最小樣本點(diǎn)時(shí),密度較稀疏的簇會(huì)變化較快。) 跟凝聚聚類一樣,無(wú)法對(duì)新的數(shù)據(jù)進(jìn)行預(yù)測(cè)
sklearn 調(diào)參
該算法在大多數(shù)數(shù)據(jù)集上面都能夠獲得不錯(cuò)的效果,但是調(diào)參過(guò)程有時(shí)非??部馈jP(guān)鍵是目前對(duì)復(fù)雜形狀的聚類評(píng)估效果并不理想。關(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)
原理
算法假定每個(gè)聚類的簇都符合高斯分布(正態(tài)分布),樣本數(shù)據(jù)呈現(xiàn)的分布就是各個(gè)聚類的分布的疊加,所以稱為高斯混合。
該算法首先指定高斯混合成分個(gè)數(shù)K(這里K就是要聚類的個(gè)數(shù)),隨機(jī)給每一個(gè)分布的均值和方差(協(xié)方差)賦初始值。對(duì)每一個(gè)樣本,計(jì)算其在各個(gè)高斯分布下的后驗(yàn)概率(EM中的E步),再根據(jù)最大似然估計(jì),將每個(gè)樣本對(duì)該高斯分布的概率作為權(quán)重來(lái)計(jì)算加權(quán)均值和方差(協(xié)方差)(EM中的M步),用更新之后的值替換原來(lái)的初始值,直至模型滿足停止條件(比如迭代次數(shù)),算法結(jié)束。
優(yōu)點(diǎn)
只要給定的成分個(gè)數(shù)足夠多,理論上可以任意逼近任何連續(xù)的概率分布
缺點(diǎn)
計(jì)算量較大 其實(shí)真實(shí)數(shù)據(jù)好多不服從正太分布,對(duì)于一些復(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ù)聚類算法,無(wú)需指定聚類的數(shù)目。主要涉及兩個(gè)概念Mean(均值)、Shift(偏移)。
其算法思想很簡(jiǎn)單,首先隨機(jī)選取初始迭代點(diǎn),將該點(diǎn)到附近區(qū)域內(nèi)所有點(diǎn)分別組成向量求和取平均偏移量,移動(dòng)該點(diǎn)至平均偏移向量末端,作為新的迭代點(diǎn),不斷移動(dòng),直至滿足指定條件,算法結(jié)束。
調(diào)參
MeanShift這個(gè)算法有稍微嘗試了下,但是好像效果相對(duì)其他聚類算法不突出,用的不多。
高維可視化PCA、TSNE
很多時(shí)候,即使非常熟悉業(yè)務(wù),也做了很多的數(shù)據(jù)探索,你也很難判斷應(yīng)該選擇哪種聚類模型。
如果每個(gè)模型都試一遍的話,時(shí)間成本太高,而將(高維)數(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)計(jì)上不相關(guān)。
這里以sklearn里的iris數(shù)據(jù)集為例,數(shù)據(jù)屬性為:花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度、花瓣寬度四個(gè)特征,將這四個(gè)特征標(biāo)準(zhǔn)化處理后用PCA降維得到下圖:

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

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

