【火爐煉AI】機(jī)器學(xué)習(xí)027-項(xiàng)目案例:用聚類算法建立客戶細(xì)分模型

【火爐煉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ō)明如下表所示。

image

對(duì)于這6個(gè)features真仲,數(shù)據(jù)集已經(jīng)告訴我們這6列的min,max mean等信息袋马,我把它們整理成一個(gè)表格,如下所示:

image

數(shù)據(jù)集的加載可以采用pd.read_csv函數(shù)來(lái)完成秸应,代碼可以參考我的github,下面我們隨便選擇兩個(gè)feature虑凛,將其繪制到二維平面圖上,看看這些數(shù)據(jù)點(diǎn)的分布情況软啼,比如下圖:

(X=fresh y=milk)的數(shù)據(jù)分布圖
(X=grocery, y=delicassen)的數(shù)據(jù)分布圖


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

--------------------------------------------完-------------------------------------

均值漂移算法在數(shù)據(jù)集(X=fresh,y=milk)的表現(xiàn)
visual_cluster_effect(meanshift,dataset,'MeanShift-X=grocery,y=delica',[2,5]) # X=grocery鸭廷, y=delicassen
均值漂移算法在數(shù)據(jù)集(X=grocery,y=delica)的表現(xiàn)

從上面的圖中我們很難看出模型到底是好還是壞,那我們就用指標(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著,陶俊杰箕般,陳小莉譯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耐薯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丝里,更是在濱河造成了極大的恐慌曲初,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杯聚,死亡現(xiàn)場(chǎng)離奇詭異臼婆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)幌绍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門颁褂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人傀广,你說(shuō)我怎么就攤上這事颁独。” “怎么了伪冰?”我有些...
    開(kāi)封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵奖唯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我糜值,道長(zhǎng)丰捷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任寂汇,我火速辦了婚禮病往,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骄瓣。我一直安慰自己停巷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布榕栏。 她就那樣靜靜地躺著畔勤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扒磁。 梳的紋絲不亂的頭發(fā)上庆揪,一...
    開(kāi)封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音妨托,去河邊找鬼缸榛。 笑死吝羞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的内颗。 我是一名探鬼主播钧排,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼均澳!你這毒婦竟也來(lái)了恨溜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤找前,失蹤者是張志新(化名)和其女友劉穎糟袁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纸厉,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系吭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颗品。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肯尺。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躯枢,靈堂內(nèi)的尸體忽然破棺而出则吟,到底是詐尸還是另有隱情,我是刑警寧澤锄蹂,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布氓仲,位于F島的核電站,受9級(jí)特大地震影響得糜,放射性物質(zhì)發(fā)生泄漏敬扛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一朝抖、第九天 我趴在偏房一處隱蔽的房頂上張望啥箭。 院中可真熱鬧,春花似錦治宣、人聲如沸急侥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坏怪。三九已至,卻和暖如春绊茧,著一層夾襖步出監(jiān)牢的瞬間铝宵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工按傅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捉超,地道東北人胧卤。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓唯绍,卻偏偏與公主長(zhǎng)得像拼岳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子况芒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容