日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Apriori算法进行关联分析

發(fā)布時間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Apriori算法进行关联分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

1.名詞概念
2.頻繁項集發(fā)現(xiàn)
3.Apriori算法關聯(lián)分析
4.代碼實現(xiàn)
5.參考文章

? 通過組合交叉變量制定風控策略時有兩種方法:一是通過決策樹分箱進行變量交叉,可以見文章一個函數(shù)實現(xiàn)自動化風控策略挖掘;二是通過apriori算法進行關聯(lián)分析。
? 關聯(lián)分析是從大規(guī)模數(shù)據(jù)集中尋找物品間的隱含關系,比如著名的例子“啤酒和尿布”,即發(fā)現(xiàn)買啤酒的顧客同時也會買尿布,商店通過挖掘這些規(guī)則更加了解客戶的購買行為。但是,關聯(lián)分析需要從大量數(shù)據(jù)集中尋找組合關系,計算代價很高,于是Aprior算法就應用于用合理的算法高效發(fā)掘組合規(guī)則(又叫頻繁項集)。

? 假設一個簡單的交易清單如下,分別代表5筆交易情況。

? 下面是關聯(lián)分析中用到的一些名詞概念。
1.項與項集
? 項,指我們分析數(shù)據(jù)中的一個對象,如豆奶;項集,就是若干項的項構成的集合,如集合{豆奶,萵苣}是一個2項集。

2.支持度
? 某項集在數(shù)據(jù)集中出現(xiàn)的概率。即項集在記錄中出現(xiàn)的次數(shù),除以數(shù)據(jù)集中所有記錄的數(shù)量。如豆奶的支持度為4/5,{豆奶,尿布}的支持度為3/5。
? 支持度體現(xiàn)的是某項集的頻繁程度,只有某項集的支持度達到一定程度,我們才有研究該項集的必要。

3.置信度
? 又叫可信度,是針對一條關聯(lián)規(guī)則定義的。關聯(lián)規(guī)則{A->B}的置信度為A與B同時出現(xiàn)的次數(shù),除以A出現(xiàn)的次數(shù)。即在A發(fā)生的條件下,B發(fā)生的概率。
? 比如{尿布->葡萄酒}=支持度(尿布->葡萄酒)/支持度(尿布)=3/5除以4/5=0.75。即在購買尿布的情況下,有75%的概率會購買葡萄酒。

4.提升度
? 關聯(lián)規(guī)則{A->B}中,提升度是指{A->B}的置信度,除以B的支持度。提升度體現(xiàn)的是組合(應用關聯(lián)規(guī)則)相對不組合(不應用關聯(lián)規(guī)則)的比值,如果提升度大于1,則說明應用該關聯(lián)規(guī)則是有價值的。如果提升度小于1,說明應用該關聯(lián)規(guī)則起到了負面影響。
? 比如{尿布->葡萄酒}=置信度(尿布->葡萄酒)/支持度(葡萄酒)=0.75/0.6=1.25

尋找頻繁項集

? 一般支持度和置信度是用來量化關聯(lián)分析是否成功的方法。比如對只有4個物品的集合{0,1,2,3},想要獲得每種可能集合的支持度。首先,需要列出4個物品可能的組合數(shù),一共有15種組合方法。

? 比如需要計算{0,3}項集的支持度,就需要遍歷每條記錄,檢查記錄是否包含0和3,如果包含則計數(shù)值加1。如此便可以得到{0,3}項集的支持度,要獲得每種可能集合的支持度需要重復上述過程。
? 對于N種物品的數(shù)據(jù)集一共有2N?12^N-12N?1種項集組合,計算量巨大。為了降低計算所需的時間,可以采用Apriori來發(fā)現(xiàn)頻繁項集。

Apriori算法原理

? Apriori在拉丁語中指“來自以前”,即先驗知識或者假設條件。它的原理是如果某個項集是頻繁的,那么它的所有子集也是頻繁的。
? 如上圖中,如果{0,1}是頻繁的,那么{0}、{1}也一定是頻繁的。因為{0}、{1}的支持度一定大于或等于{0,1}。反過來,如果某一個項集是非頻繁項集,那么它的所有超集也是非頻繁的。如下圖:

? 如果{2,3}是非頻繁的,那么{0,2,3}、{1,2,3}、{0,1,2,3}也一定是非頻繁的,因為{2,3}的支持度一定大于等于它的超集的支持度。

使用Apriori算法發(fā)現(xiàn)頻繁項集

? 關聯(lián)分析的目標分為兩項:發(fā)現(xiàn)頻繁項集和發(fā)現(xiàn)關聯(lián)規(guī)則。首先需要找到頻繁項集,然后才能獲得關聯(lián)規(guī)則。
? Apriori算法需要輸入兩個參數(shù),一個是最小支持度,一個是數(shù)據(jù)集。步驟如下:
1.生成單個物品的項集
2.剔除支持度小于閾值的項,得到頻繁1項集
3.將頻繁1項集組合得到2項集
4.剔除支持度小于閾值的項,得到頻繁2項集
5.重復上述步驟直到所有項集都去掉

? 具體例子見下圖:

? 以上案例中得到頻繁項集為{2}{3}{4}{2,4}。

從頻繁項集中挖掘關聯(lián)規(guī)則

? 關聯(lián)規(guī)則需要從頻繁項集中產生,比如上例中產生一個頻繁項集為{2,4},那么就有可能有一條關聯(lián)規(guī)則為{2}->{4},意味著購買了2的人往往也會購買4。但是反過來就不一定成立。
? 對于關聯(lián)規(guī)則的量化,則需要用到置信度。一條規(guī)則P->H的置信度定義如下:
Cofidence(P∣H)=support(P∣H)support(P)Cofidence(P|H)=\frac{support(P|H)}{support(P)}Cofidence(PH)=support(P)support(PH)?
? 比如置信度{2|4}=4/5=0.8,置信度{4|2}=4/6=0.66,即在購買4的情況下有80%的概率購買2,在購買2的情況下只有66%的概率購買4。
? 對于一個項集{0,1,2,3}產生關聯(lián)規(guī)則,需要生成一個可能的規(guī)則列表,然后測試每條規(guī)則的可信度。可能的規(guī)則列表如下:

? 可以發(fā)現(xiàn)具有以下性質:
? 如果某條規(guī)則不滿足最小置信度,那么該規(guī)則的所有子集也都不滿足最小置信度。
? 比如規(guī)則{0,1,2}->{3}不滿足最小可信度要求,那么任何左部為{0,1,2}子集的規(guī)則也不會滿足最小可信度要求,或者說所有以{3}作為后件的規(guī)則不會滿足最小可信度要求。原因是這些規(guī)則的置信度的分子都相同,而{0,1,2}->3的分母{0,1,2}的支持度最小,導致這條規(guī)則的置信度最大。因此其他規(guī)則的置信度只會比這條更小,更不會滿足最小可信度的要求。

? 除了Apriori算法可以用來挖掘關聯(lián)規(guī)則,FP-growth算法針對Apriori算法做了進一步的優(yōu)化,能夠顯著加快發(fā)現(xiàn)頻繁項集的速度。

代碼實現(xiàn)(Python)

? sklearn庫中沒有Apriori算法,也沒有 FP-Growth 算法。不過可以采用python的第三方庫實現(xiàn)Aprior算法發(fā)掘關聯(lián)規(guī)則。相關的庫有mlxtend機器學習包、efficient-apriori等,先附上一個開源的實現(xiàn)Apriori的鏈接,AprioriDemo
? 這里使用mlxtend庫實現(xiàn)Aprior算法。

import pandas as pd from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rulesdf = pd.read_excel('./Online Retail.xlsx') df.head()

? 對數(shù)據(jù)進行預處理,描述Description字段去除首尾空格,刪除發(fā)票ID"InvoiceNo"為空的數(shù)據(jù)記錄,將發(fā)票ID"InvoiceNo"字段轉為字符型,刪除發(fā)票ID"InvoiceNo"不包含“C”的記錄。
? 然后需要將數(shù)據(jù)集轉換為購物籃格式的形式,如下圖:

? 列名為商品名稱,每一行為一個訂單。
? 轉換的方法有兩種:
? 方法一:使用pivot_table函數(shù)

import numpy as np basket = df[df['Country'] =="France"].pivot_table(columns = "Description",index="InvoiceNo",values="Quantity",aggfunc=np.sum).fillna(0)

? 方法二:groupby后unstack

basket2 = (df[df['Country'] =="Germany"].groupby(['InvoiceNo', 'Description'])['Quantity'].sum().unstack().reset_index().fillna(0).set_index('InvoiceNo'))

? 然后將購物數(shù)量轉為0/1變量,即是否購買該物品。

def encode_units(x):if x <= 0:return 0if x >= 1:return 1basket_sets = basket.applymap(encode_units) basket_sets.drop('POSTAGE', inplace=True, axis=1)

? 使用算法包進行關聯(lián)規(guī)則運算

frequent_itemsets = apriori(basket_sets2, min_support=0.05, use_colnames=True) rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)

? frequent_itemsets 為頻繁項集:

? Support列為支持度,即 項集發(fā)生頻率/總訂單量
rules為最終關聯(lián)規(guī)則結果表:

? antecedants前項集,consequents后項集,support支持度,confidence置信度,lift提升度。選取置信度(confidence)大于0.8且提升度(lift)大于5的規(guī)則,按lift降序排序

參考文章

1.機器學習實戰(zhàn)第11章
2.Python 極簡關聯(lián)分析(購物籃分析)

【作者】:Labryant
【原創(chuàng)公眾號】:風控獵人
【簡介】:某創(chuàng)業(yè)公司策略分析師,積極上進,努力提升。乾坤未定,你我都是黑馬。
【轉載說明】:轉載請說明出處,謝謝合作!~

《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的使用Apriori算法进行关联分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。