九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
聚類分析:創(chuàng)建,可視化以及可解釋性

作者:Maarten Grootendorst

編譯:ronghuaiyang

導(dǎo)讀

本文探索了聚類分析,聚類的可視化以及通過探索特征進(jìn)行聚類的可解釋性。

盡管我們已經(jīng)看到大量的監(jiān)督機(jī)器學(xué)習(xí)技術(shù)被應(yīng)用,但這些方法通常存在一個(gè)大問題,需要標(biāo)記的數(shù)據(jù)。幸運(yùn)的是,有許多非監(jiān)督方法用于將數(shù)據(jù)聚類到以前不可見的組中,從而可以從你的客戶中提取新的見解。

本文將指導(dǎo)你了解客戶聚類的來龍去脈。注意,我不僅將向你展示使用哪個(gè)sklearn包,而且更重要的是,如何使用它們,以及應(yīng)該注意什么。

與往常一樣,數(shù)據(jù)相對簡單,它包含來自電信公司的客戶信息,通常用于預(yù)測客戶流失:

聚類算法

目前有許多無監(jiān)督聚類算法,盡管它們在某些情況下都有顯著的優(yōu)勢,但我將討論兩種常用的算法。

k-Means聚類

根據(jù)我的經(jīng)驗(yàn),這是迄今為止最常用的數(shù)據(jù)聚類算法。k-意味著從選擇k個(gè)隨機(jī)中心開始,你可以自己設(shè)置。然后,根據(jù)數(shù)據(jù)點(diǎn)的歐氏距離,將所有數(shù)據(jù)點(diǎn)分配到最近的中心。接下來,計(jì)算新的中心并更新數(shù)據(jù)點(diǎn)(參見下面的gif)。這個(gè)過程是連續(xù)的,直到聚類在迭代之間沒有變化為止。

在上面的例子中,三個(gè)聚類中心的起點(diǎn)非常接近。這通常不能很好地工作,因?yàn)樗茈y找到聚類。相反,你可以使用k-means++來改進(jìn)中心的初始化。它從一個(gè)初始中心開始,并確保所有后續(xù)中心都足夠遠(yuǎn)。這優(yōu)化了中心的選擇和創(chuàng)建。

然后,你可以使用elbow方法確定最優(yōu)聚類的個(gè)數(shù)k。在選擇聚類個(gè)數(shù)的范圍時(shí),你希望找到收益遞減點(diǎn)。你可以通過繪制x軸上的聚類數(shù)量和y軸上的慣量(簇內(nèi)平方和)來實(shí)現(xiàn)這一點(diǎn)。然后通過拐點(diǎn)找到k:

import seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansscores = [KMeans(n_clusters=i+2).fit(df).inertia_ for i in range(10)]sns.lineplot(np.arange(2, 12), scores)plt.xlabel('Number of clusters')plt.ylabel('Inertia')plt.title('Inertia of k-Means versus number of clusters')

你可以看到橘色矩形上的轉(zhuǎn)折。因此,我們選擇使用k-means生成k=4個(gè)聚類。

需要注意的一點(diǎn)是,由于k-Means通常使用歐氏距離來計(jì)算距離,由于維數(shù)詛咒,它不能很好地處理高維數(shù)據(jù)集。這一詛咒在一定程度上表明,高維歐幾里德距離沒有什么意義,因?yàn)樗鼈兺ǔ7浅=咏?/p>

我們使用的數(shù)據(jù)是高維的,因?yàn)槲覀冇?7個(gè)特性。

一個(gè)解決方案是使用cos距離,它在高維空間中工作得更好。由于余弦距離和歐幾里德距離對于歸一化向量是線性一致的,我們可以簡單地對數(shù)據(jù)進(jìn)行歸一化。

from sklearn import preprocessingnormalized_vectors = preprocessing.normalize(df)scores = [KMeans(n_clusters=i+2).fit(normalized_vectors).inertia_ for i in range(10)]sns.lineplot(np.arange(2, 12), scores)plt.xlabel('Number of clusters')plt.ylabel('Inertia')plt.title('Inertia of Cosine k-Means versus number of clusters')plt.savefig('intertia_cosine_kmeans.jpg', dpi=300)

k-Means在計(jì)算上非常昂貴。更快的替代方法是MiniBatchKMeans和BIRCH。這兩種方法生成聚類的速度都更快,但是這些聚類的質(zhì)量通常低于k-Means生成的聚類。

DBSCAN

還可以根據(jù)數(shù)據(jù)點(diǎn)的密度進(jìn)行聚類。一個(gè)例子是基于密度的帶噪聲的空間聚類(DBSCAN),如果數(shù)據(jù)點(diǎn)的密度足夠大,DBSCAN就會對它們進(jìn)行聚類。DBSCAN通過掃描鄰域來識別聚類并擴(kuò)展它們。如果它找不到任何要添加的點(diǎn),它就會繼續(xù)移動(dòng)到一個(gè)新點(diǎn),希望找到一個(gè)新的聚類。任何缺少足夠鄰居聚類的點(diǎn)都被歸為噪聲:

與k-means的不同之處在于,DBSCAN不需要指定聚類的數(shù)量。DBSCAN的兩個(gè)主要參數(shù)是組成聚類的最小點(diǎn)數(shù)(minPts)和鄰域大小(eps)。

您通常不希望 minPts非常小,因?yàn)闀蓙碜栽肼暤木垲?。根?jù)經(jīng)驗(yàn),最好將 minPts設(shè)置為數(shù)據(jù)中特征的數(shù)量。eps優(yōu)化起來有點(diǎn)困難,可能需要k-distance圖才能找到正確的值。使用小值通常是首選。

DBSCAN的另一個(gè)替代方案是光學(xué),它具有與DBSCAN類似的性能,但不需要顯式地設(shè)置 eps。

評估聚類

下一步是執(zhí)行實(shí)際的聚類,并嘗試解釋聚類的質(zhì)量及其內(nèi)容。

輪廓評分

要開始評估聚類,首先需要了解構(gòu)成一個(gè)良好聚類的要素。盡管存在許多用于評估聚類的定義和方法,但最常用的方法之一是計(jì)算輪廓評分。

坤坤評分根據(jù)簇之間和簇內(nèi)的距離來衡量簇之間的可分性。它計(jì)算平均簇內(nèi)距離( a ),這是簇內(nèi)部的平均距離,以及最接近的其他簇的平均距離( b),這是每個(gè)樣本和距離它最近的簇之間的距離。則樣本的輪廓系數(shù)為 (b-a)/max(a,b)。

讓我們計(jì)算一下前面提到的所有方法的輪廓分?jǐn)?shù):

from sklearn.metrics import silhouette_score# Prepare modelskmeans = KMeans(n_clusters=4).fit(df)normalized_vectors = preprocessing.normalize(df)normalized_kmeans = KMeans(n_clusters=4).fit(normalized_vectors)min_samples = df.shape[1]+1 dbscan = DBSCAN(eps=3.5, min_samples=min_samples).fit(df)# Print resultsprint('kmeans: {}'.format(silhouette_score(df, kmeans.labels_, metric='euclidean')))print('Cosine kmeans:{}'.format(silhouette_score(normalized_vectors, normalized_kmeans.labels_, metric='cosine')))print('DBSCAN: {}'.format(silhouette_score(df, dbscan.labels_, metric='cosine')))

基于余弦的k-Means優(yōu)于k-Means,這并不奇怪,因?yàn)槲覀冊跀?shù)據(jù)中有大量的特征(27個(gè))。有趣的是,DBSCAN同樣執(zhí)行得很好。

然而,盡管客觀的度量方法是首選的,但我認(rèn)為,當(dāng)涉及到無監(jiān)督聚類時(shí),可視化地檢查聚類是評估它們的最佳方法之一。不要盲目地遵循客觀標(biāo)準(zhǔn)。你一定要看到一下到底發(fā)生了什么!

因此,下一步是在2d和3d中可視化聚類的方法。

可視化聚類

為了聚類可視化,可以使用最流行的降維方法之一,即PCA和t-SNE。

PCA

PCA的工作原理是利用正交變換將相關(guān)特征轉(zhuǎn)換為一組線性無關(guān)特征的值。剩下的是包含最大可能方差的特征。

然后,我們可以用3d的方式可視化我們的數(shù)據(jù):

tsne_3d_df = prepare_tsne(3, df, kmeans.labels_)tsne_3d_df['normalized_kmeans'] = normalized_kmeans.labels_tsne_3d_df['dbscan'] = dbscan.labels_plot_animation(tsne_3d_df, 'kmeans', 'kmeans')plot_animation(tsne_3d_df, 'normalized_kmeans', 'normalized_kmeans')plot_animation(tsne_3d_df, 'dbscan', 'dbscan')

雖然PCA可能成功地降低了數(shù)據(jù)的維數(shù),但它似乎沒有非常直觀地可視化聚類。這種情況經(jīng)常發(fā)生在高維數(shù)據(jù)中,它們通常聚集在同一個(gè)點(diǎn)上,PCA提取這些信息。

我們可以使用一種稱為t-SNE的算法,它專門用來創(chuàng)建數(shù)據(jù)的直觀表示/可視化。

t-SNE

t-SNE是一種可視化高維數(shù)據(jù)的算法。它使用點(diǎn)之間的局部關(guān)系來創(chuàng)建低維映射,從而捕獲非線性結(jié)構(gòu)。

它首先創(chuàng)建一個(gè)概率分布(即,高斯函數(shù)),它規(guī)定了相鄰點(diǎn)之間的關(guān)系。然后,利用學(xué)生t分布構(gòu)造一個(gè)盡可能接近該分布的低維空間?,F(xiàn)在您可能想知道為什么在這個(gè)步驟中使用學(xué)生t分布。高斯分布有一個(gè)短尾巴,它把附近的點(diǎn)擠壓在一起。如果你用的是學(xué)生t分布比尾巴長點(diǎn)更有可能被分開。

讓我們在3d中實(shí)現(xiàn)t-SNE,看看我們是否可以更好地可視化聚類:

tsne_3d_df = prepare_tsne(3, df, kmeans.labels_)tsne_3d_df['normalized_kmeans'] = normalized_kmeans.labels_tsne_3d_df['dbscan'] = dbscan.labels_plot_animation(tsne_3d_df, 'kmeans', 'kmeans')plot_animation(tsne_3d_df, 'normalized_kmeans', 'normalized_kmeans')plot_animation(tsne_3d_df, 'dbscan', 'dbscan')

Euclidean k-Means (LEFT), Cosine k-Means (MIDDLE), DBSCAN, (RIGHT)

t-SNE為數(shù)據(jù)提供了更直觀的可視化表示。從動(dòng)畫中可以看出,cos k-Means和DBSCAN似乎都創(chuàng)建了邏輯聚類。

解釋聚類

現(xiàn)在我們已經(jīng)對客戶進(jìn)行了細(xì)分,如果我們知道每個(gè)聚類的獨(dú)特之處就好了。這將幫助我們了解我們擁有哪些類型的客戶。

一種方法是簡單地繪制所有變量并查看聚類之間的差異。然而,當(dāng)處理超過10個(gè)變量時(shí),這種方法就會失敗,因?yàn)樗茈y可視化和解釋:

解決方案是選擇變量的子集,在一定程度上,這些變量在定義聚類時(shí)非常重要。這里我想演示兩種方法,一種是平均組間的方差,另一種是通過預(yù)測建模來提取特征的重要性。

聚類內(nèi)部和聚類之間的變量的方差

聚類任務(wù)中變量重要性的一個(gè)假設(shè)是,如果按聚類排序的變量的平均值彼此之間存在顯著差異,那么該變量在創(chuàng)建聚類時(shí)可能很重要。

我們首先簡單地根據(jù)生成的聚類聚合數(shù)據(jù),并檢索每個(gè)變量的平均值:

from sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()df_scaled = pd.DataFrame(scaler.fit_transform(df))df_scaled['dbscan'] = dbscan.labels_df_mean = (df_scaled.loc[df_scaled.dbscan!=-1, :].groupby('dbscan').mean())

DBSCAN生成的聚類中每個(gè)變量的均值

我忽略了-1集群,因?yàn)樗籇BSCAN定義為噪聲。為了便于可視化,數(shù)據(jù)在0和1之間縮放。

接下來,我簡單地計(jì)算每個(gè)變量聚類間均值的方差,并選取方差最大的前7個(gè)變量:

results = pd.DataFrame(columns=['Variable', 'Var'])for column in df_mean.columns[1:]: results.loc[len(results), :] = [column, np.var(df_mean[column])]selected_columns = list(results.sort_values('Var', ascending=False,).head(7).Variable.values) + ['dbscan']tidy = df_scaled[selected_columns].melt(id_vars='dbscan')sns.barplot(x='dbscan', y='value', hue='variable', data=tidy)

現(xiàn)在你可以更清楚地看到聚類之間的差異。例如,在cluster 0中,你可以看到每個(gè)人都沒有Internet服務(wù),而大多數(shù)其他聚類都包含具有Internet服務(wù)的特征。此外,我們可以看到聚類2只包含光纖和電話服務(wù)的人員,這意味著這兩種服務(wù)要么一起購買,要么屬于同一個(gè)包。

:在比較變量時(shí),我沒有考慮標(biāo)準(zhǔn)差、偏度和峰度等重要因素。上面的方法只是選擇變量的第一步。

隨機(jī)森林特征選取

最后,我們可以使用聚類作為目標(biāo)變量,然后應(yīng)用隨機(jī)森林來了解哪些特征在聚類的生成中是重要的。這種方法需要更多的工作,因?yàn)槟惚仨殭z查模型的準(zhǔn)確性,才能準(zhǔn)確地提取重要的特征。

在這個(gè)例子中,我將跳過這一步,因?yàn)槲覀兲幚淼氖遣黄胶獾哪繕?biāo)和多個(gè)類:

from sklearn.ensemble import RandomForestClassifierX, y = df.iloc[:,:-1], df.iloc[:,-1]clf = RandomForestClassifier(n_estimators=100).fit(X, y)data = np.array([clf.feature_importances_, X.columns]).Tcolumns = list(pd.DataFrame(data, columns=['Importance', 'Feature']) .sort_values('Importance', ascending=False) .head(7).Feature.values)tidy = df_scaled[columns+['dbscan']].melt(id_vars='dbscan')sns.barplot(x='dbscan', y='value', hue='variable', data=tidy)

我們可以看到,與我們之前做的方差分析相比,選擇了類似的特征。由于這種方法需要更多的驗(yàn)證工作,我建議使用前面描述的方差方法。

總結(jié)

希望本文能夠幫助你開始理解聚類算法背后的原則,以及最重要的是如何應(yīng)用它們。

英文原文:https://towardsdatascience.com/cluster-analysis-create-visualize-and-interpret-customer-segments-474e55d00ebb

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
泛癌分析時(shí)候的大樣本量多分組建議選擇tSNE而不是PCA
R語言數(shù)據(jù)挖掘?qū)嵺`——聚類分析的常用函數(shù)
R語言中不同類型的聚類方法比較
ggplot修飾單細(xì)胞降維聚類圖+scpubr包作圖
R語言聚類分析--cluster, factoextra
Python實(shí)現(xiàn)LRFM模型分析客戶價(jià)值
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服