Python数据挖掘与机器学习,快速掌握聚类算法和关联分析
生活随笔
收集整理的這篇文章主要介紹了
Python数据挖掘与机器学习,快速掌握聚类算法和关联分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
摘要:前文數(shù)據(jù)挖掘與機器學習技術入門實戰(zhàn)與大家分享了分類算法,在本文中將為大家介紹聚類算法和關聯(lián)分析問題。分類算法與聚類到底有何區(qū)別?聚類方法應在怎樣的場景下使用?如何使用關聯(lián)分析算法解決個性化推薦問題?本文就為大家揭曉答案。
本次直播視頻精彩回顧,戳這里!演講嘉賓簡介:韋瑋,企業(yè)家,資深IT領域?qū)<?講師/作家,暢銷書《精通Python網(wǎng)絡爬蟲》作者,阿里云社區(qū)技術專家。
以下內(nèi)容根據(jù)演講嘉賓視頻分享以及PPT整理而成。
本文將圍繞一下幾個方面進行介紹:1. 聚類問題應用場景介紹2. K-Means算法介紹與實現(xiàn)3. 使用K-Means算法對公司客戶價值進行自動劃分案例實戰(zhàn)4. 關聯(lián)分析問題應用場景介紹5. Apriori算法介紹6. FP-Growth算法介紹7. 使用關聯(lián)分析算法解決個性化推薦問題8. 作業(yè)練習:使用關聯(lián)分析算法解決超市商品貨品擺放調(diào)整問題
一. 聚類問題應用場景介紹
聚類問題主要用于解決沒有明確分類映射關系的物品歸類問題,即無監(jiān)督學習。分類算法必須需要訓練數(shù)據(jù),訓練數(shù)據(jù)包含物品的特征和類別(label, 也可以被稱作標簽),這相當于對這些數(shù)據(jù)建立了映射規(guī)則,這種映射規(guī)則可以通過機器學習相應的算法來建立,當需要對新的數(shù)據(jù)進行分類時,就可以直接調(diào)用模型,對數(shù)據(jù)進行相應的處理來實現(xiàn)分類。那么當沒有歷史數(shù)據(jù)的時候要對現(xiàn)存的物品進行歸類,就需要使用聚類算法解決。比如,聚類算法可以實現(xiàn)公司客戶價值自動劃分,網(wǎng)頁自動歸類等。
二. K-Means算法介紹與實現(xiàn)
K-Means算法是一種經(jīng)典的聚類算法,也稱作K均值聚類算法,先為大家介紹K-Means算法的原理。假設建立一個坐標系,這個坐標系的橫坐標是價格,縱坐標是評論。然后根據(jù)每個物品的這兩項特征將物品放置在該坐標系中,那么如何將這些物品劃分為k類,此處k為自定義。例如,可以定義k為2,即將所有物品劃分為兩類。首先,隨機選擇兩類的中心點AB,這兩個點稱為聚類中心。初始的聚類中心是隨機選擇,很大概率上并不是真正的類中心,因此這兩點會在后續(xù)的聚類過程中不斷調(diào)整,直至趨于真正的聚類中心。其次,分別計算各個物品距兩個聚類中心AB的距離,將其劃分至距離較近的聚類中心點一類。例如,點1距A的距離小于點1距B的距離,因此將點1劃分至A類。如此,初步將所有點劃分為兩類,接著需要對每類的聚類中心進行調(diào)整。這個階段,需要對每一類計算重心位置,將這類的聚類中心移動到該重心位置,得到兩類的新聚類中心A’ B’。然后再一次計算各個物品距兩個新的聚類中心A’ B’的距離,進行距離比較,得到新的聚類結(jié)果。按照這樣的方法不斷迭代,不斷的向正確結(jié)果靠攏,最終聚類過程會收斂,得到的聚類中心不再變化,便已經(jīng)得到最終的聚類結(jié)果,也就是將物品分成了兩類。按照上述過程,K-Means的步驟大致如下:1. 初始化聚類中心(隨機選擇);2. 計算樣本點到各聚類中心的距離;3. 將樣本點歸為距離較近的聚類中心一類;4. 移動聚類中心到類別的重心位置,調(diào)整聚類中心; 5. 重復234步驟,直到聚類中心不再改變。?
那么K-Means算法如何實現(xiàn)?在Python中實現(xiàn)K-Means算法其實是相對容易的,首先需要導入K-Means模型,導入模型后可以設置聚類的個數(shù),然后直接使用fit_predict來實現(xiàn)聚類過程,具體代碼如下:from sklearn.cluster import KMeans kms=KMeans(n_clusters=3) y=kms.fit_predict(x)接下來就使用K-Means算法來解決公司客戶價值自動劃分的問題。
三. 使用K-Means算法對公司客戶價值進行自動劃分案例實戰(zhàn)
開始聚類時,公司的客戶只是具有某些特征,沒有具體的分類標準。那么可以直接根據(jù)特征進行聚類,得出聚類結(jié)果后再分析研究這些類別的真實含義。假設初始時存在部分客戶的數(shù)據(jù)如下,包含客戶年齡,平均每次消費金額,平均消費周期等數(shù)據(jù)。
現(xiàn)需要對上述客戶進行聚類,以幫助公司快速區(qū)別出普通客戶,VIP客戶和超級VIP客戶。在有其他歷史數(shù)據(jù)的情況下,可以將這些用戶的特征和客戶類型建立起映射關系,通過機器學習訓練便可以得到未知的客戶類型。但在沒有歷史數(shù)據(jù)的情況下,這就是典型的聚類問題。具體代碼如下:#通過聚類分析客戶價值 import pandas as pda import numpy as npy import matplotlib.pylab as pyl fname="D:\\我的教學\\Python\\阿里云系列直播\\第4次直播代碼\\company.csv" dataf=pda.read_csv(fname,encoding="gbk") x=dataf.as_matrix() from sklearn.cluster import KMeans kms=KMeans(n_clusters=3) y=kms.fit_predict(x) print(y) #年齡-消費金額圖,消費時間-消費金額圖,年齡-消費時間圖 for i in range(0,len(y)):if(y[i]==0):print(str(i)+"大眾客戶")pyl.subplot(2,3,1)#年齡-消費金額圖pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"*r")pyl.subplot(2,3,2)#消費時間-消費金額圖pyl.plot(dataf.iloc[i:i+1,2:3].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"*r")pyl.subplot(2,3,3)#年齡-消費時間圖pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,2:3].as_matrix(),"*r")elif(y[i]==1):print(str(i)+"超級VIP客戶")pyl.subplot(2,3,1)#年齡-消費金額圖pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"sy")pyl.subplot(2,3,2)#消費時間-消費金額圖pyl.plot(dataf.iloc[i:i+1,2:3].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"sy")pyl.subplot(2,3,3)#年齡-消費時間圖pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,2:3].as_matrix(),"sy")elif(y[i]==2):print(str(i)+"VIP客戶")pyl.subplot(2,3,1)#年齡-消費金額圖pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"pb")pyl.subplot(2,3,2)#消費時間-消費金額圖pyl.plot(dataf.iloc[i:i+1,2:3].as_matrix(),dataf.iloc[i:i+1,1:2].as_matrix(),"pb")pyl.subplot(2,3,3)#年齡-消費時間圖pyl.plot(dataf.iloc[i:i+1,0:1].as_matrix(),dataf.iloc[i:i+1,2:3].as_matrix(),"pb") pyl.show()首先加載客戶數(shù)據(jù)文件 company.csv,從中讀取客戶數(shù)據(jù),然后導入K-Means模型,這里設置聚類成3類,然后將聚類結(jié)果通過圖像來分析,但當聚類有多個特征值時,繪圖分析會有一定的難度。例如在本例中有3個特征值,在作圖時就需要將特征值兩兩組合,對年齡-消費金額圖、消費周期-消費金額圖、年齡-消費周期分別進行分析。在作圖之前,可以將毫無關聯(lián)的特征值組合刪除,例如這里可以將年齡-消費周期圖剔除。若無法判斷,也可以全部繪制再根據(jù)圖像分析。在繪圖時,將預測出的類別作為客戶分類標準,例如如果某兩個客戶被分到標簽為0這一類,此時并不了解預測出的標簽0類有何實際意義,但可以認為這兩個客戶是一類。接下來在每個類別中分別繪制上述三種圖像,這里將同一類別中的圖像采用一種顏色以作區(qū)分。做出圖像結(jié)果如下:
得出圖像后,因為分布雜亂的圖像表明這兩個特征值之間是沒有實際關聯(lián)的,可以將其篩去,留下層次分明的圖像分析。觀察圖像可以發(fā)現(xiàn)年齡-消費周期圖非常雜亂,和上述猜想相同,可以刪去。而年齡-消費金額圖中,藍色點客戶顯示年齡相對較小,消費金額也較少,偏向于普通用戶,紅色點客戶年齡不定,但消費金額普遍較高,偏向于VIP客戶,而綠色點客戶年齡較大,消費非常高,屬于超級VIP客戶。如果圖一中的類別分析可靠,那么可以將這些類別應用于圖二中繼續(xù)驗證。在圖二消費周期-消費金額圖中,藍色點客戶消費周期不定,消費金額不高,符合普通客戶的特征,紅色點客戶消費周期偏短,消費金額中等,屬于VIP客戶,而綠色點客戶消費周期短,消費金額高,符合超級VIP客戶的特征。分析得出用戶類別后,便可以對所有公司客戶進行自動劃分,基于劃分的結(jié)果,可以為超級VIP客戶提供一些福利,如生日祝福等,加強營銷的粘性。
四. 關聯(lián)分析問題應用場景介紹
關聯(lián)分析是一種用于分析物體之間關聯(lián)程度的一種方式,關聯(lián)分析常見的應用場景有:分析物品之間的關聯(lián)程度、個性化推薦、超市貨品擺放調(diào)整等。例如在超市貨品擺放時,可以根據(jù)用戶購買商品時的記錄,計算商品之間的關聯(lián)程度,將關聯(lián)程度高的商品擺放在一起。接下來為大家介紹兩種關聯(lián)分析算法。
五. Apriori算法介紹
Apriori算法是一種基礎的關聯(lián)分析算法,但效率較低,不建議用于商業(yè)場景。Apriori算法的原理如下:
假設如今有一批商品的購買記錄,ABCDE分別代表不同的商品,每一行代表某一用戶的商品購買記錄。首先對各商品進行依次掃描,例如商品A在所有4條商品記錄中出現(xiàn)3次,那么商品A的支持度即為3/4,計算出的支持度表明了該產(chǎn)品在所有購買記錄中出現(xiàn)的概率大小,顯然概率越大,支持度越高。同理,計算出BCDE的支持度分別為3/4、3/4、3/4、1/4。接下來需要設置閾值來篩選出關聯(lián)度較高的商品數(shù)據(jù),這里假設取1/2,那么就先將E篩除,留下商品ABCD,此時便產(chǎn)生頻繁一項集{{A},{B},{C},{D}}。然后將頻繁一項集中的集合兩兩組合,得到候選項集{{AB},{AC},{AD},{BC},{BD},{CD}},計算每個項集的支持度。例如項集AB在所有4條商品記錄中出現(xiàn)2次,那么AB的支持度即為2/4。同理得出AC,AD,BC,BD,CD的支持度分別為3/4,2/4,2/4,2/4,3/4,2/4。在閾值為1/2的情況下只留下AC和BD。如此便可以繼續(xù)生成候選集ABCD,支持度為2/4,可以篩去。得到AC和BD的關聯(lián)程度最高,這意味著,如果某一客戶購買了商品A,那么給該客戶推薦商品C成功率更大,類似的,如果客戶購買了商品B,那么商品D可能也更受該用戶青睞。Apriori算法為什么效率較低呢?從上述過程可以看到每一次計算候選集的支持度時都需要返回至歷史記錄中進行掃描,因此處理復雜,耗時嚴重。
六. ?FP-Growth算法介紹
相比Apriori算法,FP-Growth算法是一種效率比較高的關聯(lián)分析算法,更適用于商業(yè)應用。下面為大家介紹FP-Growth算法的原理。假設仍然取上述例子,ABCDE分別代表不同的商品,現(xiàn)在有如圖所示的產(chǎn)品購買歷史記錄,每一行代表某一用戶的商品購買記錄,現(xiàn)在來分析各商品間的關聯(lián)關系。
首先仍然需要進行第一次掃描,得到商品ABCDE出現(xiàn)的次數(shù),也就是支持度,分別為5,3,5,7,2。然后篩除支持度較小的商品,這里篩除商品E。接下來按次數(shù)大小進行排序創(chuàng)建項頭表(此處項頭表中的順序也可以為DCAB),為創(chuàng)建FP樹做準備。在FP樹中,公用元素要盡量多,以加快后續(xù)查找時的檢索速度。FP樹的根節(jié)點可以設置為null,將項頭表中的數(shù)據(jù)按照順序添加至FP樹中。
接下來只需要再遍歷一次購買記錄,將所有記錄插入到初始的FP樹中即可。但在插入之前,需要將每一條記錄按照項頭表中的大小順序進行重排。例如第一條記錄ABCD,改為DACB或者DCAB(根據(jù)初始的項頭表而定),第四條記錄BCD,改為DCB。歷史記錄排序完成后,將每一條記錄從根節(jié)點開始插入至樹中。例如,第一條記錄DACB,與初始FP樹公用,因此不用插入。第二條記錄AC,同樣從根節(jié)點開始,第一個節(jié)點和初始根節(jié)點不共用,因此建立新的節(jié)點,插入記錄AC,且出現(xiàn)次數(shù)都為1。第三條記錄DCB,第一個節(jié)點D是可以公用的,后續(xù)節(jié)點CB不共用,因此在節(jié)點D下建立新節(jié)點CB,此時CB的次數(shù)也都為1。第七條記錄DC插入時,已經(jīng)有公用的節(jié)點了,就直接將除初始節(jié)點之外的其他節(jié)點支持度加1即可,這里D的支持度不變,C的支持度從1變成2。那么這里只需要進行一次掃描,就可以將所有歷史記錄插入到建立的FP樹中。FP樹建立完成后便可以進行頻繁項集的挖掘。
在頻繁項集挖掘時,要按照項頭表中支持度從小到大的順序進行,如此越向后挖掘,公用節(jié)點越多。因此首先對B點進行挖掘,找出所有以B節(jié)點結(jié)尾的分支,將這些分支組成的樹取出,找出其中的父節(jié)點D,A,C,刪除支持度較小的C,得到B的條件模式基D:3和A:2。將B與條件模式基中的節(jié)點進行組合,得到頻繁項集{DB},{AB},{DAB},取每個項集中支持度較小的條件模式基支持度作為該項集的支持度,如DB的支持度取D的支持度3,AB的支持度取A的支持度2,,DAB的支持度取A的支持度2。
同理,對C進行挖掘,取出含節(jié)點C的部分樹,得到C的條件模式基為D:4和A:2。以及頻繁項集為{DC}4,{AC}2,{DAC}2。
以及對A進行挖掘得到的條件模式基為D:4,頻繁項集為{DA}4。支持度最高的D點不需要進行挖掘。最后將所有頻繁項集合并,得到最終各點的頻繁項集{DC}4, {DA}4, {DB}3, {AC}2, {DAC}2, {AB}2, {DAB}2。如此便可判斷出D與C和A的關聯(lián)度最高,和B關聯(lián)度也較高。若用戶購買了商品D,可以向其推薦商品C和A,或者商品B。在FP-Growth算法中,只需要進行兩次掃描便可完成關聯(lián)度分析,所以相比Apriori算法性能更佳。
七. 使用關聯(lián)分析算法解決個性化推薦問題
先用Apriori算法來解決一個課程的個性化推薦問題。假設現(xiàn)在有如下所示相關數(shù)據(jù),每一行代表每一位客戶購買的書籍信息,需要分析出課程之間的關聯(lián)性,將關聯(lián)度較高的課程推薦給相關的用戶使購買轉(zhuǎn)化率最高。
首先使用Apriori算法來解決這個推薦問題。在實現(xiàn)過程中,值得注意的是需要將輸入數(shù)據(jù)進行轉(zhuǎn)化,將課程記錄轉(zhuǎn)化為矩陣形式,如下圖所示,具體應用代碼如下:
from apriori import * import pandas as pda filename="D:/Python35/data/lesson_buy.xls" dframe=pda.read_excel(filename,header=None) change=lambda x:pda.Series(1,index=x[pda.notnull(x)]) mapok=map(change,dframe.as_matrix()) data=pda.DataFrame(list(mapok)).fillna(0) #設置置信度閾值和支持度閾值 surpport=0.2 cfd=0.3 print(find_rule(data,surpport,cfd))得到關聯(lián)結(jié)果如下,其中support為支持度,confidence為置信度。在本例中,若客戶購買機器學習,那么便有較大的概率會購買Python爬蟲,這具有一定的實際意義。Apriori算法的實現(xiàn)代碼在網(wǎng)上有開源資源,若有需要可自行閱讀。
現(xiàn)在使用FP-Growth算法解決超市貨品的推薦問題。假設現(xiàn)在有如下所示相關二維列表數(shù)據(jù),分析這些商品間的關聯(lián)度。具體實現(xiàn)代碼來源于github,此處也附上:import FP_Grow_tree sample=[['milk','eggs','bread','chips'],['eggs','popcorn','chips','beer'],['eggs','bread','chips'],['milk','eggs','bread','popcorn','chips','beer'],['milk','bread','beer'],['eggs','bread','beer'],['milk','bread','chips'],['milk','eggs','bread','butter','chips'],['milk','eggs','butter','chips'] ] sample1=[[u'牛奶',u'雞蛋',u'面包',u'薯片'],[u'雞蛋',u'爆米花',u'薯片',u'啤酒'],[u'雞蛋',u'面包',u'薯片'],[u'牛奶',u'雞蛋',u'面包',u'爆米花',u'薯片',u'啤酒'],[u'牛奶',u'面包',u'啤酒'],[u'雞蛋',u'面包',u'啤酒'],[u'牛奶',u'面包',u'薯片'],[u'牛奶',u'雞蛋',u'面包',u'黃油',u'薯片'],[u'牛奶',u'雞蛋',u'黃油',u'薯片'] ] #print(sample1) ##參數(shù)說明 sample為事務數(shù)據(jù)集 []為遞歸過程中的基,support為最小支持度 support=3 ff=FP_Grow_tree.FP_Grow_tree(sample1,[],support) ##打印頻繁集 ff.printfrequent()關聯(lián)結(jié)果如下所示。類似的,這種關聯(lián)度分析可以使用于超市商品的貨架擺放等問題,增加用戶的購買轉(zhuǎn)化率。
八. 作業(yè)練習:使用關聯(lián)分析算法解決超市商品貨品擺放調(diào)整問題
假如有一個超市的商品購買記錄數(shù)據(jù)集,需要分析各商品之間的關聯(lián)程度以調(diào)整貨品擺放。數(shù)據(jù)集格式如下所示,ListNoPosIDCashierID為不同用戶的購買記錄ID,各商品下F表示未購買,T表示購買。請分別使用Apriori算法和FP-Growth算法實現(xiàn)關聯(lián)分析,并比較兩種算法的耗時。這里也提供一份一位同學所寫的優(yōu)秀作業(yè)代碼供大家參考,具體數(shù)據(jù)集和參考代碼點擊這里下載。
本文作者:聒小小噪
原文鏈接總結(jié)
以上是生活随笔為你收集整理的Python数据挖掘与机器学习,快速掌握聚类算法和关联分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NLP的ImageNet时代已经到来
- 下一篇: Python数据挖掘与机器学习技术入门实