apriori算法c++_关联分析——基于Apriori算法实现
電子商務(wù)推薦系統(tǒng)主要是通過(guò)統(tǒng)計(jì)和挖掘技術(shù),根據(jù)用戶在網(wǎng)站上的行為,主動(dòng)為用戶提供推薦服務(wù),從而提高網(wǎng)站體驗(yàn)。而根據(jù)不同的業(yè)務(wù)場(chǎng)景,推薦系統(tǒng)需要滿足不同的推薦粒度,包括搜索推薦,商品類目推薦,商品標(biāo)簽推薦,店鋪推薦等等,主要還是以 商品推薦 為主。而商品推薦主要分為規(guī)則模型,協(xié)同過(guò)濾模型和基于內(nèi)內(nèi)容的推薦。我們今天介紹的Apriori算法就是基于 規(guī)則模型 的算法。
把啤酒放在尿布旁,有助于提升啤酒銷售量Apriori最典型的落地就是沃爾瑪?shù)钠【颇虿及咐Mㄟ^(guò)用戶交易數(shù)據(jù)集來(lái)尋找商品之間的 關(guān)聯(lián)規(guī)則,探究物品之間的相關(guān)性,同時(shí)達(dá)到“將尿布放入購(gòu)物車之后,再推薦啤酒比直接推薦啤酒獲取有更好的售賣效果”。
本篇文章首先簡(jiǎn)要介紹一下Apriori算法的基本思想,然后使用業(yè)務(wù)數(shù)據(jù)進(jìn)行了簡(jiǎn)單的演示。
一、基本概念
以下的是Apriori算法涉及的一些概念,可以通過(guò)后續(xù)的舉例來(lái)理解。
頻繁項(xiàng)集(frequent item sets): 經(jīng)常 同時(shí)出在訂單中商品的組合。{啤酒,尿布}就是一個(gè)頻繁項(xiàng)集的例子。
關(guān)聯(lián)規(guī)則(associational rules): 暗示兩種物品集之間可能存在很強(qiáng)的關(guān)系。例如,“購(gòu)買尿布的用戶,有大概率購(gòu)買啤酒”,這就是一個(gè)關(guān)聯(lián)規(guī)則。
給定關(guān)聯(lián)規(guī)則X=>Y,即根據(jù)X推出Y:
支持度(Support):該項(xiàng)集出現(xiàn)的次數(shù)除以總的記錄數(shù)(交易數(shù))。 同時(shí)包X和Y的記錄數(shù)/數(shù)據(jù)集記錄數(shù)
置信度(Confidence):項(xiàng)集{X,Y}同時(shí)出現(xiàn)的次數(shù)占項(xiàng)集{X}出現(xiàn)次數(shù)的比例。同時(shí)包含X和Y的記錄數(shù)/包含X的記錄數(shù)
提升度(Lift):度量項(xiàng)集{X}和項(xiàng)集{Y}的獨(dú)立性。
二、舉例說(shuō)明
本節(jié)通過(guò)一個(gè)關(guān)聯(lián)規(guī)則推薦的例子給大家介紹一下上述名詞,假設(shè)shein售賣四類商品,歷史上共5筆訂單(見(jiàn)下表)
2.1 數(shù)據(jù)準(zhǔn)備
每一行表示一條訂單信息,例如:訂單編號(hào)為sh-0001的訂單中包含Beauty、Plus Size、Dress三個(gè)品類,以下為方便敘述,使用A、B、C、D來(lái)代表上圖的4個(gè)品類。
2.2 支持度的計(jì)算
支持度是某個(gè)商品在總銷售筆數(shù)(N)中出現(xiàn)的概率,可以理解為物品當(dāng)前流行程度。計(jì)算方式是:
支持度 = (包含物品A的記錄數(shù)量) / (總的記錄數(shù)量)例如下表中,共5筆訂單,3筆包含Beauty,Beauty的支持度是3/5。支持度評(píng)估商品包含在訂單中的“概率”,一個(gè)訂單,有多大概率包含這個(gè)商品。
組合商品也有支持度。
共5筆訂單,2筆同時(shí)包含AB,即A&B的支持度是2/5。
全局總共4種商品,假設(shè)關(guān)聯(lián)規(guī)則只關(guān)聯(lián)2種商品,則一共需要計(jì)算$C_4^2$共6種組合商品的支持度{AB,AC,AD,BC,BD,CD}。
如果想查看那幾種商品組合出現(xiàn)的次數(shù)較多,可以通過(guò)計(jì)算支持度來(lái)實(shí)現(xiàn)。
2.3 置信度的計(jì)算
置信度是指如果購(gòu)買物品A,有較大可能購(gòu)買物品B,本質(zhì)上是條件概率的應(yīng)用。計(jì)算方式是這樣:
置信度( A -> B) = (包含物品A和B的記錄數(shù)量) / (包含 A 的記錄數(shù)量)從上表可以看出,商品A有3次購(gòu)買,這3次中有2次購(gòu)買了B,A->B的置信度是2/3。
confidence(A->B) = support(A->B)/support(A)= (2/5)/(3/5) = 2/3
分子support(A->B)是同時(shí)購(gòu)買A與B的比例,分母support(A)是只購(gòu)買A的比例
這里需要注意的是,$X->Y$與$Y->X$的置信度不一定相等。
B->C的置信度是confidence(B->C)=support(B->C)/support(B)=1,即買商品B時(shí),100%會(huì)買C;
C->B的置信度是confidence(C->B)=support(C->B)/support(C)=3/5,買商品C時(shí),只有3/5買了B。
2.4 提升度的計(jì)算
提升度表示==先購(gòu)買==A對(duì)購(gòu)買B的概率的提升作用,用來(lái)判斷規(guī)則是否有實(shí)際價(jià)值。
在置信度的例子里,$confidence(B->C)=1$,那是不是意味著如果用戶將商品B放入購(gòu)物車,就可以向用戶推薦商品C來(lái)達(dá)到提升C銷量的目的呢?
很顯然不是。我們目的是“將尿布放入購(gòu)物車之后,再推薦啤酒”比“直接推薦啤酒”有更好的售賣效果。雖然購(gòu)買商品B,100%會(huì)買C,但如果直接推薦C,用戶也100%會(huì)買C,所以購(gòu)買B與購(gòu)買C是獨(dú)立事件,用戶買不買C和用戶買不買B沒(méi)有直接關(guān)系。這里的關(guān)聯(lián)規(guī)則推薦,并沒(méi)有比直接推薦獲取更好的效果。
因此提升度是描述使用規(guī)則后商品在購(gòu)物車中出現(xiàn)的次數(shù)是否高于商品單獨(dú)出現(xiàn)在購(gòu)物車中的頻率。如果大于1說(shuō)明規(guī)則有效,小于等于1則無(wú)效。
提升度( A -> B) = 置信度( A -> B) / 支持度(B)在上表中,有3個(gè)訂單購(gòu)買A,這3個(gè)訂單中有2個(gè)訂單購(gòu)買了B,所以:
$confidence(A->B) =support(A->B)/support(A) = 2/3$ 即買了A有$2/3$的概率會(huì)買B
$support(B) = 3/5$ 表示直接推薦B的話,5個(gè)訂單中有3個(gè)購(gòu)買了B, 即B的支持度是$3/5$,即有$3/5$的概率會(huì)直接買B。
$lift(A->B) =confidence(A->B)/support(B) = 10/9$
會(huì)發(fā)現(xiàn),使用關(guān)聯(lián)規(guī)則推薦,如果當(dāng)用戶將Beauty(A)品類的商品加入購(gòu)物車后,再推薦Plus Size(B)品類,比直接推薦Plus Size(B)品類的效果更好。
2.5 總結(jié)
在上述關(guān)聯(lián)規(guī)則推薦的例子中,推薦的目標(biāo)是想“將尿布放入購(gòu)物車之后,再推薦啤酒”比“直接推薦啤酒”有更好的售賣效果。
- 支持度support(A->B),是用戶同時(shí)購(gòu)買A和B概率
- 置信度confidence(A->B),是用戶購(gòu)買A的同時(shí),有多大概率購(gòu)買B
- 提升度lift(A->B),是“用戶購(gòu)買A的同時(shí),有多大概率購(gòu)買B”與“直接購(gòu)買B的概率”的比值
- 提升度大于1時(shí),說(shuō)明A->B有正向效果
- 提升度等于1時(shí),說(shuō)明A和B是獨(dú)立事件
- 提升度小于1時(shí),說(shuō)明A->B有負(fù)向效果
三、算法實(shí)現(xiàn)
網(wǎng)上有很多封裝好的Apriori算法,大家也可以自行下載使用,代碼詳見(jiàn)Jupyter notebook
算法對(duì)數(shù)據(jù)分析師而言只是工具,了解基本原理且會(huì)調(diào)用代碼即可。
算法實(shí)現(xiàn)涉及到兩個(gè)重要的定理:
通過(guò)以上兩個(gè)定理可以減少程序的計(jì)算次數(shù),提高程序的速度。
Apriori實(shí)際應(yīng)用
? 1.需要根據(jù)不同的粒度,如品類,skc等,結(jié)合不同的維度,如瀏覽行為,購(gòu)買行為,構(gòu)建符合業(yè)務(wù)場(chǎng)景的規(guī)則模型。
? 2.Apriori也可以用來(lái)進(jìn)行個(gè)topn個(gè)性化推薦。首先可以根據(jù)一定時(shí)間范圍內(nèi)訂單數(shù)據(jù)找到強(qiáng)關(guān)聯(lián)規(guī)則(skc)。然后在根據(jù)用戶購(gòu)買的商品和規(guī)則進(jìn)行關(guān)聯(lián),預(yù)測(cè)用戶感興趣的商品,同時(shí)過(guò)濾掉用戶已經(jīng)購(gòu)買過(guò)的商品,對(duì)于其他商品按照置信度降序進(jìn)行排序,為用戶推薦。
? 3.Apriori也可以用來(lái)進(jìn)行關(guān)鍵路徑分析,研究某個(gè)功能或者某些特點(diǎn)的人群的在某些業(yè)務(wù)場(chǎng)景下的路徑。
3.1presto中準(zhǔn)備好數(shù)據(jù)
--準(zhǔn)備數(shù)據(jù) select week(cast(substr(t1.pay_time,1,10) as date)) as week_num --周序號(hào) ,order_id --訂單ID ,array_join(array_agg(distinct cate2),',') as cate from dw.item_df t1 left join da.category t2 on t1.sku_cate = t2.cate4nmwhere site_tp = 'xxx' and del_flag = 0 and substr(pay_time,1,10) = '2020-04-25' --修改時(shí)間事件范圍 and country = 'xxx' and site_id <> 'xxx' group by 1,23.2利用python中mlxtend模塊實(shí)現(xiàn)
1.首先在命令行中安裝mlxtend(可以新建一個(gè)環(huán)境防止包沖突)
pip install mlxtend2.導(dǎo)入模塊。
#導(dǎo)入包(第一次運(yùn)行的時(shí)候會(huì)比較慢) import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules3.調(diào)整數(shù)據(jù)格式,調(diào)用包。
if __name__ == '__main__':#讀取數(shù)據(jù)并且調(diào)整格式data_set = pd.read_excel('shiyan.xlsx').cate.str.split(',').tolist()#進(jìn)行 one-hot 編碼te = TransactionEncoder()te_ary = te.fit_transform(data_set)df = pd.DataFrame(te_ary, columns = te.columns_)#利用 Apriori 找出頻繁項(xiàng)集frequent_itemsets = apriori(df, min_support = 0.1, use_colnames = True)#計(jì)算關(guān)聯(lián)規(guī)則,一般只需要設(shè)置最小執(zhí)行都就行rules = association_rules(frequent_itemsets, metric = 'confidence' ,min_threshold = 0.3)4.導(dǎo)出excel
#導(dǎo)出excel rules.to_excel(r'C:/Users/dell/Desktop/result.xlsx',encoding = 'utf-8')參數(shù)解釋:
association_rules(df, metric = ‘confidence‘, min_threshold = 0.8, support_only = False):
-df:這個(gè)不用說(shuō),就是 Apriori 計(jì)算后的頻繁項(xiàng)集。
-metric:可選值['support' , 'confidence' , 'lift' , 'leverage' , 'conviction']。里面比較常用的就是置信度和支持度。這個(gè)參數(shù)和下面的min_threshold參數(shù)配合使用
-min_threshold:參數(shù)類型是浮點(diǎn)型,根據(jù) metric 不同可選值有不同的范圍,
- metric = 'support' => 取值范圍 [0,1]
- metric = 'confidence' => 取值范圍 [0,1]
- metric = 'lift' => 取值范圍 [0, inf]
-support_only:默認(rèn)是 False。僅計(jì)算有支持度的項(xiàng)集,若缺失支持度則用 NaNs 填充。
總結(jié)
以上是生活随笔為你收集整理的apriori算法c++_关联分析——基于Apriori算法实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 夏至未至程七七为什么背叛立夏 结局与傅小
- 下一篇: c++builder提高批量动态创建pa