【火爐煉AI】機(jī)器學(xué)習(xí)027-項(xiàng)目案例:用聚類算法建立客戶細(xì)分模型
(本文所使用的Python庫(kù)和版本號(hào): Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
客戶細(xì)分是市場(chǎng)營(yíng)銷成功的前提檐春,我們從市場(chǎng)中獲取的數(shù)據(jù)一般都沒(méi)有標(biāo)記妹孙,要想對(duì)這些市場(chǎng)數(shù)據(jù)進(jìn)行客戶細(xì)分,將客戶劃分簇群兼贸,這也是一種典型的無(wú)監(jiān)督學(xué)習(xí)問(wèn)題怨咪。
本項(xiàng)目擬用各種不同的聚類算法來(lái)建立客戶細(xì)分模型牍颈,并比較這些聚類算法在這一問(wèn)題上的優(yōu)虐插勤。
1. 準(zhǔn)備數(shù)據(jù)集
本項(xiàng)目案例所使用到的原始數(shù)據(jù)集來(lái)源于: UCI大學(xué)數(shù)據(jù)集泳挥,這個(gè)數(shù)據(jù)集來(lái)源于一個(gè)批發(fā)商然痊,一共包含有440個(gè)樣本數(shù)據(jù),每個(gè)樣本數(shù)據(jù)包含有8列屉符,但是其中的6列作為features玷过,此處由于是無(wú)監(jiān)督學(xué)習(xí),不需要標(biāo)記筑煮,故而只需要其中的六列數(shù)據(jù)辛蚊,這些數(shù)據(jù)的說(shuō)明如下表所示。
對(duì)于這6個(gè)features真仲,數(shù)據(jù)集已經(jīng)告訴我們這6列的min,max mean等信息袋马,我把它們整理成一個(gè)表格,如下所示:
數(shù)據(jù)集的加載可以采用pd.read_csv函數(shù)來(lái)完成秸应,代碼可以參考我的github,下面我們隨便選擇兩個(gè)feature虑凛,將其繪制到二維平面圖上,看看這些數(shù)據(jù)點(diǎn)的分布情況软啼,比如下圖:
2. 構(gòu)建均值漂移聚類模型
本項(xiàng)目用均值漂移算法來(lái)構(gòu)建模型桑谍,模型的構(gòu)建和訓(xùn)練過(guò)程和我以前的文章【火爐煉AI】機(jī)器學(xué)習(xí)022-使用均值漂移聚類算法構(gòu)建模型一樣,如下代碼祸挪,只不過(guò)該代碼還打印出聚類后簇群的數(shù)量锣披,并把每一種簇群的質(zhì)心點(diǎn)位置打印出來(lái)。
# 構(gòu)建均值漂移聚類模型
from sklearn.cluster import MeanShift, estimate_bandwidth
bandwidth=estimate_bandwidth(dataset,quantile=0.8,
n_samples=len(dataset))
meanshift=MeanShift(bandwidth=bandwidth,bin_seeding=True)
meanshift.fit(dataset) # 使用評(píng)估的帶寬構(gòu)建均值漂移模型贿条,并進(jìn)行訓(xùn)練
labels=meanshift.labels_
cluster_num=len(np.unique(labels))
centroids=meanshift.cluster_centers_
# 下面打印出簇群種類雹仿,和質(zhì)心位置信息
print('Number of Clusters: {}'.format(cluster_num))
print('\t'.join([col_name[:5] for col_name in col_names]))
for centroid in centroids:
print('\t'.join(str(int(x)) for x in centroid))
-------------------------------------輸---------出--------------------------------
Number of Clusters: 8
Fresh Milk Groce Froze Deter Delic
9632 4671 6593 2570 2296 1248
40204 46314 57584 5518 25436 4241
16117 46197 92780 1026 40827 2944
22925 73498 32114 987 20070 903
112151 29627 18148 16745 4948 8550
36847 43950 20170 36534 239 47943
32717 16784 13626 60869 1272 5609
8565 4980 67298 131 38102 1215
--------------------------------------------完-------------------------------------
由此可見(jiàn),均值漂移算法自動(dòng)將本項(xiàng)目的數(shù)據(jù)集劃分為8個(gè)不同類別整以,那么怎么查看聚類算法的效果圖了胧辽?我先自定義了一個(gè)顯示函數(shù),用于展示各種不同聚類算法在不同數(shù)據(jù)集上的聚類效果公黑,這個(gè)函數(shù)有一定的通用性邑商,不僅可以可以用于均值漂移算法摄咆,還可以用于其他的各種聚類算法。如下為代碼和運(yùn)行結(jié)果人断。
def visual_cluster_effect(cluster,dataset,title,col_id):
assert isinstance(col_id,list) and len(col_id)==2,'col_id must be list type and length must be 2'
labels=cluster.labels_ # 每一個(gè)樣本對(duì)應(yīng)的簇群號(hào)碼
# print(labels.shape) # (440,) 440個(gè)樣本
markers=['.',',','o','v','^','<','>','1','2','3','4','8'
,'s','p','*','h','H','+','x','D','d','|']
colors=['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple',
'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']
# 將數(shù)據(jù)集繪制到圖表中
plt.figure()
for class_id in set(labels):
one_class=dataset[class_id==labels]
print('label: {}, smaple_num: {}'.format(class_id,len(one_class)))
plt.scatter(one_class[:,0],one_class[:,1],marker=markers[class_id%len(markers)],
c=colors[class_id%len(colors)],label='class_'+str(class_id))
plt.legend()
# 將中心點(diǎn)繪制到圖中
centroids=meanshift.cluster_centers_
# print(centroids.shape)# eg (8, 6) 8個(gè)簇群豆同,6個(gè)features
plt.scatter(centroids[:,col_id[0]],centroids[:,col_id[1]],marker='o',
s=100,linewidths=2,color='k',zorder=5,facecolors='b')
plt.title(title)
plt.xlabel('feature_0')
plt.ylabel('feature_1')
plt.show()
使用這個(gè)函數(shù),我們可以看到本聚類算法在數(shù)據(jù)集上的表現(xiàn)含鳞,如下代碼中影锈,我們主要查看Fresh vs milk這一類產(chǎn)品的聚類效果。
visual_cluster_effect(meanshift,dataset,'MeanShift-X=fresh,y=milk',[0,1]) # X=fresh蝉绷, y=milk
-------------------------------------輸---------出--------------------------------
label: 0, smaple_num: 428
label: 1, smaple_num: 3
label: 2, smaple_num: 1
label: 3, smaple_num: 1
label: 4, smaple_num: 3
label: 5, smaple_num: 1
label: 6, smaple_num: 1
label: 7, smaple_num: 2
--------------------------------------------完-------------------------------------
visual_cluster_effect(meanshift,dataset,'MeanShift-X=grocery,y=delica',[2,5]) # X=grocery鸭廷, y=delicassen
從上面的圖中我們很難看出模型到底是好還是壞,那我們就用指標(biāo)來(lái)判斷吧熔吗,前面我們學(xué)習(xí)過(guò)輪廓系數(shù)辆床,可以用來(lái)評(píng)估模型的優(yōu)虐,如下是評(píng)價(jià)代碼桅狠。
# 使用輪廓系數(shù)評(píng)估模型的優(yōu)虐
from sklearn.metrics import silhouette_score
si_score=silhouette_score(dataset,meanshift.labels_,
metric='euclidean',sample_size=len(dataset))
print('si_score: {:.4f}'.format(si_score))
-------------------------------------輸---------出--------------------------------
si_score: 0.6548
--------------------------------------------完-------------------------------------
########################小**********結(jié)###############################
1讼载,本文的數(shù)據(jù)集基本上都是已經(jīng)處理過(guò)的,我們只需要加載后即可使用中跌。
2咨堤,構(gòu)建均值漂移算法的模型和訓(xùn)練該模型非常簡(jiǎn)單,但是里面額quantile參數(shù)可能需要進(jìn)行優(yōu)化才能得到最佳值漩符。
3一喘,為了查看本聚類算法在數(shù)據(jù)集上的表現(xiàn)優(yōu)虐,我們先通過(guò)數(shù)據(jù)可視化嗜暴,將聚類之后的簇群以及簇群質(zhì)心繪制到圖標(biāo)中凸克,這是一個(gè)多features數(shù)據(jù)集,故而數(shù)據(jù)的可視化只能一次取其中的兩列來(lái)查看闷沥。
4萎战,另外,我們還用輪廓系數(shù)來(lái)評(píng)估模型的好壞舆逃,此處模型的輪廓系數(shù)為0.6548蚂维,貌似不是太差,但也不是太好颖侄,看來(lái)還有優(yōu)化空間鸟雏,或者,我們可以采用其他算法來(lái)構(gòu)建模型览祖,比如前面我們學(xué)習(xí)到的K-means,DBSCAN炊琉,凝聚層次聚類等展蒂,看看其輪廓系數(shù)又活。
#################################################################
注:本部分代碼已經(jīng)全部上傳到(我的github)上,歡迎下載锰悼。
參考資料:
1, Python機(jī)器學(xué)習(xí)經(jīng)典實(shí)例柳骄,Prateek Joshi著,陶俊杰箕般,陳小莉譯