摘要:摘要前文數據挖掘與機器學習技術入門實戰與大家分享了分類算法,在本文中將為大家介紹聚類算法和關聯分析問題。比如,聚類算法可以實現公司客戶價值自動劃分,網頁自動歸類等。
摘要:前文數據挖掘與機器學習技術入門實戰與大家分享了分類算法,在本文中將為大家介紹聚類算法和關聯分析問題。分類算法與聚類到底有何區別?聚類方法應在怎樣的場景下使用?如何使用關聯分析算法解決個性化推薦問題?本文就為大家揭曉答案。
本次直播視頻精彩回顧,戳這里!
演講嘉賓簡介:
韋瑋,企業家,資深IT領域專家/講師/作家,暢銷書《精通Python網絡爬蟲》作者,阿里云社區技術專家。
以下內容根據演講嘉賓視頻分享以及PPT整理而成。
本文將圍繞一下幾個方面進行介紹:
聚類問題應用場景介紹
K-Means算法介紹與實現
使用K-Means算法對公司客戶價值進行自動劃分案例實戰
關聯分析問題應用場景介紹
Apriori算法介紹
FP-Growth算法介紹
使用關聯分析算法解決個性化推薦問題
作業練習:使用關聯分析算法解決超市商品貨品擺放調整問題
一. 聚類問題應用場景介紹聚類問題主要用于解決沒有明確分類映射關系的物品歸類問題,即無監督學習。分類算法必須需要訓練數據,訓練數據包含物品的特征和類別(label, 也可以被稱作標簽),這相當于對這些數據建立了映射規則,這種映射規則可以通過機器學習相應的算法來建立,當需要對新的數據進行分類時,就可以直接調用模型,對數據進行相應的處理來實現分類。那么當沒有歷史數據的時候要對現存的物品進行歸類,就需要使用聚類算法解決。比如,聚類算法可以實現公司客戶價值自動劃分,網頁自動歸類等。
二. K-Means算法介紹與實現K-Means算法是一種經典的聚類算法,也稱作K均值聚類算法,先為大家介紹K-Means算法的原理。
假設建立一個坐標系,這個坐標系的橫坐標是價格,縱坐標是評論。然后根據每個物品的這兩項特征將物品放置在該坐標系中,那么如何將這些物品劃分為k類,此處k為自定義。例如,可以定義k為2,即將所有物品劃分為兩類。首先,隨機選擇兩類的中心點AB,這兩個點稱為聚類中心。初始的聚類中心是隨機選擇,很大概率上并不是真正的類中心,因此這兩點會在后續的聚類過程中不斷調整,直至趨于真正的聚類中心。其次,分別計算各個物品距兩個聚類中心AB的距離,將其劃分至距離較近的聚類中心點一類。例如,點1距A的距離小于點1距B的距離,因此將點1劃分至A類。如此,初步將所有點劃分為兩類,接著需要對每類的聚類中心進行調整。這個階段,需要對每一類計算重心位置,將這類的聚類中心移動到該重心位置,得到兩類的新聚類中心A’ B’。然后再一次計算各個物品距兩個新的聚類中心A’ B’的距離,進行距離比較,得到新的聚類結果。按照這樣的方法不斷迭代,不斷的向正確結果靠攏,最終聚類過程會收斂,得到的聚類中心不再變化,便已經得到最終的聚類結果,也就是將物品分成了兩類。
按照上述過程,K-Means的步驟大致如下:1. 初始化聚類中心(隨機選擇);2. 計算樣本點到各聚類中心的距離;3. 將樣本點歸為距離較近的聚類中心一類;4. 移動聚類中心到類別的重心位置,調整聚類中心; 5. 重復234步驟,直到聚類中心不再改變。
那么K-Means算法如何實現?在Python中實現K-Means算法其實是相對容易的,首先需要導入K-Means模型,導入模型后可以設置聚類的個數,然后直接使用fit_predict來實現聚類過程,具體代碼如下:
from sklearn.cluster import KMeans kms=KMeans(n_clusters=3) y=kms.fit_predict(x)
接下來就使用K-Means算法來解決公司客戶價值自動劃分的問題。
三. 使用K-Means算法對公司客戶價值進行自動劃分案例實戰開始聚類時,公司的客戶只是具有某些特征,沒有具體的分類標準。那么可以直接根據特征進行聚類,得出聚類結果后再分析研究這些類別的真實含義。
假設初始時存在部分客戶的數據如下,包含客戶年齡,平均每次消費金額,平均消費周期等數據。
現需要對上述客戶進行聚類,以幫助公司快速區別出普通客戶,VIP客戶和超級VIP客戶。在有其他歷史數據的情況下,可以將這些用戶的特征和客戶類型建立起映射關系,通過機器學習訓練便可以得到未知的客戶類型。但在沒有歷史數據的情況下,這就是典型的聚類問題。具體代碼如下:
#通過聚類分析客戶價值 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()
首先加載客戶數據文件 company.csv,從中讀取客戶數據,然后導入K-Means模型,這里設置聚類成3類,然后將聚類結果通過圖像來分析,但當聚類有多個特征值時,繪圖分析會有一定的難度。例如在本例中有3個特征值,在作圖時就需要將特征值兩兩組合,對年齡-消費金額圖、消費周期-消費金額圖、年齡-消費周期分別進行分析。在作圖之前,可以將毫無關聯的特征值組合刪除,例如這里可以將年齡-消費周期圖剔除。若無法判斷,也可以全部繪制再根據圖像分析。在繪圖時,將預測出的類別作為客戶分類標準,例如如果某兩個客戶被分到標簽為0這一類,此時并不了解預測出的標簽0類有何實際意義,但可以認為這兩個客戶是一類。接下來在每個類別中分別繪制上述三種圖像,這里將同一類別中的圖像采用一種顏色以作區分。做出圖像結果如下:
得出圖像后,因為分布雜亂的圖像表明這兩個特征值之間是沒有實際關聯的,可以將其篩去,留下層次分明的圖像分析。觀察圖像可以發現年齡-消費周期圖非常雜亂,和上述猜想相同,可以刪去。而年齡-消費金額圖中,藍色點客戶顯示年齡相對較小,消費金額也較少,偏向于普通用戶,紅色點客戶年齡不定,但消費金額普遍較高,偏向于VIP客戶,而綠色點客戶年齡較大,消費非常高,屬于超級VIP客戶。如果圖一中的類別分析可靠,那么可以將這些類別應用于圖二中繼續驗證。在圖二消費周期-消費金額圖中,藍色點客戶消費周期不定,消費金額不高,符合普通客戶的特征,紅色點客戶消費周期偏短,消費金額中等,屬于VIP客戶,而綠色點客戶消費周期短,消費金額高,符合超級VIP客戶的特征。分析得出用戶類別后,便可以對所有公司客戶進行自動劃分,基于劃分的結果,可以為超級VIP客戶提供一些福利,如生日祝福等,加強營銷的粘性。
四. 關聯分析問題應用場景介紹關聯分析是一種用于分析物體之間關聯程度的一種方式,關聯分析常見的應用場景有:分析物品之間的關聯程度、個性化推薦、超市貨品擺放調整等。例如在超市貨品擺放時,可以根據用戶購買商品時的記錄,計算商品之間的關聯程度,將關聯程度高的商品擺放在一起。接下來為大家介紹兩種關聯分析算法。
五. Apriori算法介紹Apriori算法是一種基礎的關聯分析算法,但效率較低,不建議用于商業場景。Apriori算法的原理如下:
假設如今有一批商品的購買記錄,ABCDE分別代表不同的商品,每一行代表某一用戶的商品購買記錄。首先對各商品進行依次掃描,例如商品A在所有4條商品記錄中出現3次,那么商品A的支持度即為3/4,計算出的支持度表明了該產品在所有購買記錄中出現的概率大小,顯然概率越大,支持度越高。同理,計算出BCDE的支持度分別為3/4、3/4、3/4、1/4。接下來需要設置閾值來篩選出關聯度較高的商品數據,這里假設取1/2,那么就先將E篩除,留下商品ABCD,此時便產生頻繁一項集{{A},{B},{C},{D}}。然后將頻繁一項集中的集合兩兩組合,得到候選項集{{AB},{AC},{AD},{BC},{BD},{CD}},計算每個項集的支持度。例如項集AB在所有4條商品記錄中出現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。如此便可以繼續生成候選集ABCD,支持度為2/4,可以篩去。得到AC和BD的關聯程度最高,這意味著,如果某一客戶購買了商品A,那么給該客戶推薦商品C成功率更大,類似的,如果客戶購買了商品B,那么商品D可能也更受該用戶青睞。
Apriori算法為什么效率較低呢?從上述過程可以看到每一次計算候選集的支持度時都需要返回至歷史記錄中進行掃描,因此處理復雜,耗時嚴重。
相比Apriori算法,FP-Growth算法是一種效率比較高的關聯分析算法,更適用于商業應用。下面為大家介紹FP-Growth算法的原理。
假設仍然取上述例子,ABCDE分別代表不同的商品,現在有如圖所示的產品購買歷史記錄,每一行代表某一用戶的商品購買記錄,現在來分析各商品間的關聯關系。
首先仍然需要進行第一次掃描,得到商品ABCDE出現的次數,也就是支持度,分別為5,3,5,7,2。然后篩除支持度較小的商品,這里篩除商品E。接下來按次數大小進行排序創建項頭表(此處項頭表中的順序也可以為DCAB),為創建FP樹做準備。在FP樹中,公用元素要盡量多,以加快后續查找時的檢索速度。FP樹的根節點可以設置為null,將項頭表中的數據按照順序添加至FP樹中。
接下來只需要再遍歷一次購買記錄,將所有記錄插入到初始的FP樹中即可。但在插入之前,需要將每一條記錄按照項頭表中的大小順序進行重排。例如第一條記錄ABCD,改為DACB或者DCAB(根據初始的項頭表而定),第四條記錄BCD,改為DCB。歷史記錄排序完成后,將每一條記錄從根節點開始插入至樹中。例如,第一條記錄DACB,與初始FP樹公用,因此不用插入。第二條記錄AC,同樣從根節點開始,第一個節點和初始根節點不共用,因此建立新的節點,插入記錄AC,且出現次數都為1。第三條記錄DCB,第一個節點D是可以公用的,后續節點CB不共用,因此在節點D下建立新節點CB,此時CB的次數也都為1。第七條記錄DC插入時,已經有公用的節點了,就直接將除初始節點之外的其他節點支持度加1即可,這里D的支持度不變,C的支持度從1變成2。那么這里只需要進行一次掃描,就可以將所有歷史記錄插入到建立的FP樹中。FP樹建立完成后便可以進行頻繁項集的挖掘。
在頻繁項集挖掘時,要按照項頭表中支持度從小到大的順序進行,如此越向后挖掘,公用節點越多。因此首先對B點進行挖掘,找出所有以B節點結尾的分支,將這些分支組成的樹取出,找出其中的父節點D,A,C,刪除支持度較小的C,得到B的條件模式基D:3和A:2。將B與條件模式基中的節點進行組合,得到頻繁項集{DB},{AB},{DAB},取每個項集中支持度較小的條件模式基支持度作為該項集的支持度,如DB的支持度取D的支持度3,AB的支持度取A的支持度2,,DAB的支持度取A的支持度2。
同理,對C進行挖掘,取出含節點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的關聯度最高,和B關聯度也較高。若用戶購買了商品D,可以向其推薦商品C和A,或者商品B。
在FP-Growth算法中,只需要進行兩次掃描便可完成關聯度分析,所以相比Apriori算法性能更佳。
先用Apriori算法來解決一個課程的個性化推薦問題。假設現在有如下所示相關數據,每一行代表每一位客戶購買的書籍信息,需要分析出課程之間的關聯性,將關聯度較高的課程推薦給相關的用戶使購買轉化率最高。
首先使用Apriori算法來解決這個推薦問題。在實現過程中,值得注意的是需要將輸入數據進行轉化,將課程記錄轉化為矩陣形式,如下圖所示,具體應用代碼如下:
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))
得到關聯結果如下,其中support為支持度,confidence為置信度。在本例中,若客戶購買機器學習,那么便有較大的概率會購買Python爬蟲,這具有一定的實際意義。Apriori算法的實現代碼在網上有開源資源,若有需要可自行閱讀。
現在使用FP-Growth算法解決超市貨品的推薦問題。假設現在有如下所示相關二維列表數據,分析這些商品間的關聯度。
具體實現代碼來源于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) ##參數說明 sample為事務數據集 []為遞歸過程中的基,support為最小支持度 support=3 ff=FP_Grow_tree.FP_Grow_tree(sample1,[],support) ##打印頻繁集 ff.printfrequent()
關聯結果如下所示。類似的,這種關聯度分析可以使用于超市商品的貨架擺放等問題,增加用戶的購買轉化率。
八. 作業練習:使用關聯分析算法解決超市商品貨品擺放調整問題
假如有一個超市的商品購買記錄數據集,需要分析各商品之間的關聯程度以調整貨品擺放。數據集格式如下所示,ListNoPosIDCashierID為不同用戶的購買記錄ID,各商品下F表示未購買,T表示購買。請分別使用Apriori算法和FP-Growth算法實現關聯分析,并比較兩種算法的耗時。這里也提供一份一位同學所寫的優秀作業代碼供大家參考,具體數據集和參考代碼點擊閱讀原文下載。
詳情請閱讀原文
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41647.html
摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...
摘要:在本次課程中,著重講解的是傳統的機器學習技術及各種算法。回歸對連續型數據進行預測趨勢預測等除了分類之外,數據挖掘技術和機器學習技術還有一個非常經典的場景回歸。 摘要: 什么是數據挖掘?什么是機器學習?又如何進行Python數據預處理?本文將帶領大家一同了解數據挖掘和機器學習技術,通過淘寶商品案例進行數據預處理實戰,通過鳶尾花案例介紹各種分類算法。 課程主講簡介:韋瑋,企業家,資深IT領...
閱讀 1662·2019-08-30 12:51
閱讀 656·2019-08-29 17:30
閱讀 3696·2019-08-29 15:17
閱讀 852·2019-08-28 18:10
閱讀 1356·2019-08-26 17:08
閱讀 2169·2019-08-26 12:16
閱讀 3429·2019-08-26 11:47
閱讀 3497·2019-08-23 16:18