使用Apriori算法进行关联分析
目錄
1.名詞概念
2.頻繁項(xiàng)集發(fā)現(xiàn)
3.Apriori算法關(guān)聯(lián)分析
4.代碼實(shí)現(xiàn)
5.參考文章
? 通過組合交叉變量制定風(fēng)控策略時(shí)有兩種方法:一是通過決策樹分箱進(jìn)行變量交叉,可以見文章一個(gè)函數(shù)實(shí)現(xiàn)自動(dòng)化風(fēng)控策略挖掘;二是通過apriori算法進(jìn)行關(guān)聯(lián)分析。
? 關(guān)聯(lián)分析是從大規(guī)模數(shù)據(jù)集中尋找物品間的隱含關(guān)系,比如著名的例子“啤酒和尿布”,即發(fā)現(xiàn)買啤酒的顧客同時(shí)也會(huì)買尿布,商店通過挖掘這些規(guī)則更加了解客戶的購買行為。但是,關(guān)聯(lián)分析需要從大量數(shù)據(jù)集中尋找組合關(guān)系,計(jì)算代價(jià)很高,于是Aprior算法就應(yīng)用于用合理的算法高效發(fā)掘組合規(guī)則(又叫頻繁項(xiàng)集)。
? 假設(shè)一個(gè)簡單的交易清單如下,分別代表5筆交易情況。
? 下面是關(guān)聯(lián)分析中用到的一些名詞概念。
1.項(xiàng)與項(xiàng)集
? 項(xiàng),指我們分析數(shù)據(jù)中的一個(gè)對(duì)象,如豆奶;項(xiàng)集,就是若干項(xiàng)的項(xiàng)構(gòu)成的集合,如集合{豆奶,萵苣}是一個(gè)2項(xiàng)集。
2.支持度
? 某項(xiàng)集在數(shù)據(jù)集中出現(xiàn)的概率。即項(xiàng)集在記錄中出現(xiàn)的次數(shù),除以數(shù)據(jù)集中所有記錄的數(shù)量。如豆奶的支持度為4/5,{豆奶,尿布}的支持度為3/5。
? 支持度體現(xiàn)的是某項(xiàng)集的頻繁程度,只有某項(xiàng)集的支持度達(dá)到一定程度,我們才有研究該項(xiàng)集的必要。
3.置信度
? 又叫可信度,是針對(duì)一條關(guān)聯(lián)規(guī)則定義的。關(guān)聯(lián)規(guī)則{A->B}的置信度為A與B同時(shí)出現(xiàn)的次數(shù),除以A出現(xiàn)的次數(shù)。即在A發(fā)生的條件下,B發(fā)生的概率。
? 比如{尿布->葡萄酒}=支持度(尿布->葡萄酒)/支持度(尿布)=3/5除以4/5=0.75。即在購買尿布的情況下,有75%的概率會(huì)購買葡萄酒。
4.提升度
? 關(guān)聯(lián)規(guī)則{A->B}中,提升度是指{A->B}的置信度,除以B的支持度。提升度體現(xiàn)的是組合(應(yīng)用關(guān)聯(lián)規(guī)則)相對(duì)不組合(不應(yīng)用關(guān)聯(lián)規(guī)則)的比值,如果提升度大于1,則說明應(yīng)用該關(guān)聯(lián)規(guī)則是有價(jià)值的。如果提升度小于1,說明應(yīng)用該關(guān)聯(lián)規(guī)則起到了負(fù)面影響。
? 比如{尿布->葡萄酒}=置信度(尿布->葡萄酒)/支持度(葡萄酒)=0.75/0.6=1.25
尋找頻繁項(xiàng)集
? 一般支持度和置信度是用來量化關(guān)聯(lián)分析是否成功的方法。比如對(duì)只有4個(gè)物品的集合{0,1,2,3},想要獲得每種可能集合的支持度。首先,需要列出4個(gè)物品可能的組合數(shù),一共有15種組合方法。
? 比如需要計(jì)算{0,3}項(xiàng)集的支持度,就需要遍歷每條記錄,檢查記錄是否包含0和3,如果包含則計(jì)數(shù)值加1。如此便可以得到{0,3}項(xiàng)集的支持度,要獲得每種可能集合的支持度需要重復(fù)上述過程。
? 對(duì)于N種物品的數(shù)據(jù)集一共有2N?12^N-12N?1種項(xiàng)集組合,計(jì)算量巨大。為了降低計(jì)算所需的時(shí)間,可以采用Apriori來發(fā)現(xiàn)頻繁項(xiàng)集。
Apriori算法原理
? Apriori在拉丁語中指“來自以前”,即先驗(yàn)知識(shí)或者假設(shè)條件。它的原理是如果某個(gè)項(xiàng)集是頻繁的,那么它的所有子集也是頻繁的。
? 如上圖中,如果{0,1}是頻繁的,那么{0}、{1}也一定是頻繁的。因?yàn)閧0}、{1}的支持度一定大于或等于{0,1}。反過來,如果某一個(gè)項(xiàng)集是非頻繁項(xiàng)集,那么它的所有超集也是非頻繁的。如下圖:
? 如果{2,3}是非頻繁的,那么{0,2,3}、{1,2,3}、{0,1,2,3}也一定是非頻繁的,因?yàn)閧2,3}的支持度一定大于等于它的超集的支持度。
使用Apriori算法發(fā)現(xiàn)頻繁項(xiàng)集
? 關(guān)聯(lián)分析的目標(biāo)分為兩項(xiàng):發(fā)現(xiàn)頻繁項(xiàng)集和發(fā)現(xiàn)關(guān)聯(lián)規(guī)則。首先需要找到頻繁項(xiàng)集,然后才能獲得關(guān)聯(lián)規(guī)則。
? Apriori算法需要輸入兩個(gè)參數(shù),一個(gè)是最小支持度,一個(gè)是數(shù)據(jù)集。步驟如下:
1.生成單個(gè)物品的項(xiàng)集
2.剔除支持度小于閾值的項(xiàng),得到頻繁1項(xiàng)集
3.將頻繁1項(xiàng)集組合得到2項(xiàng)集
4.剔除支持度小于閾值的項(xiàng),得到頻繁2項(xiàng)集
5.重復(fù)上述步驟直到所有項(xiàng)集都去掉
? 具體例子見下圖:
? 以上案例中得到頻繁項(xiàng)集為{2}{3}{4}{2,4}。
從頻繁項(xiàng)集中挖掘關(guān)聯(lián)規(guī)則
? 關(guān)聯(lián)規(guī)則需要從頻繁項(xiàng)集中產(chǎn)生,比如上例中產(chǎn)生一個(gè)頻繁項(xiàng)集為{2,4},那么就有可能有一條關(guān)聯(lián)規(guī)則為{2}->{4},意味著購買了2的人往往也會(huì)購買4。但是反過來就不一定成立。
? 對(duì)于關(guān)聯(lián)規(guī)則的量化,則需要用到置信度。一條規(guī)則P->H的置信度定義如下:
Cofidence(P∣H)=support(P∣H)support(P)Cofidence(P|H)=\frac{support(P|H)}{support(P)}Cofidence(P∣H)=support(P)support(P∣H)?
? 比如置信度{2|4}=4/5=0.8,置信度{4|2}=4/6=0.66,即在購買4的情況下有80%的概率購買2,在購買2的情況下只有66%的概率購買4。
? 對(duì)于一個(gè)項(xiàng)集{0,1,2,3}產(chǎn)生關(guān)聯(lián)規(guī)則,需要生成一個(gè)可能的規(guī)則列表,然后測試每條規(guī)則的可信度??赡艿囊?guī)則列表如下:
? 可以發(fā)現(xiàn)具有以下性質(zhì):
? 如果某條規(guī)則不滿足最小置信度,那么該規(guī)則的所有子集也都不滿足最小置信度。
? 比如規(guī)則{0,1,2}->{3}不滿足最小可信度要求,那么任何左部為{0,1,2}子集的規(guī)則也不會(huì)滿足最小可信度要求,或者說所有以{3}作為后件的規(guī)則不會(huì)滿足最小可信度要求。原因是這些規(guī)則的置信度的分子都相同,而{0,1,2}->3的分母{0,1,2}的支持度最小,導(dǎo)致這條規(guī)則的置信度最大。因此其他規(guī)則的置信度只會(huì)比這條更小,更不會(huì)滿足最小可信度的要求。
? 除了Apriori算法可以用來挖掘關(guān)聯(lián)規(guī)則,FP-growth算法針對(duì)Apriori算法做了進(jìn)一步的優(yōu)化,能夠顯著加快發(fā)現(xiàn)頻繁項(xiàng)集的速度。
代碼實(shí)現(xiàn)(Python)
? sklearn庫中沒有Apriori算法,也沒有 FP-Growth 算法。不過可以采用python的第三方庫實(shí)現(xiàn)Aprior算法發(fā)掘關(guān)聯(lián)規(guī)則。相關(guān)的庫有mlxtend機(jī)器學(xué)習(xí)包、efficient-apriori等,先附上一個(gè)開源的實(shí)現(xiàn)Apriori的鏈接,AprioriDemo
? 這里使用mlxtend庫實(shí)現(xiàn)Aprior算法。
? 對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,描述Description字段去除首尾空格,刪除發(fā)票ID"InvoiceNo"為空的數(shù)據(jù)記錄,將發(fā)票ID"InvoiceNo"字段轉(zhuǎn)為字符型,刪除發(fā)票ID"InvoiceNo"不包含“C”的記錄。
? 然后需要將數(shù)據(jù)集轉(zhuǎn)換為購物籃格式的形式,如下圖:
? 列名為商品名稱,每一行為一個(gè)訂單。
? 轉(zhuǎn)換的方法有兩種:
? 方法一:使用pivot_table函數(shù)
? 方法二:groupby后unstack
basket2 = (df[df['Country'] =="Germany"].groupby(['InvoiceNo', 'Description'])['Quantity'].sum().unstack().reset_index().fillna(0).set_index('InvoiceNo'))? 然后將購物數(shù)量轉(zhuǎn)為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)? 使用算法包進(jìn)行關(guān)聯(lián)規(guī)則運(yùn)算
frequent_itemsets = apriori(basket_sets2, min_support=0.05, use_colnames=True) rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)? frequent_itemsets 為頻繁項(xiàng)集:
? Support列為支持度,即 項(xiàng)集發(fā)生頻率/總訂單量
rules為最終關(guān)聯(lián)規(guī)則結(jié)果表:
? antecedants前項(xiàng)集,consequents后項(xiàng)集,support支持度,confidence置信度,lift提升度。選取置信度(confidence)大于0.8且提升度(lift)大于5的規(guī)則,按lift降序排序
參考文章
1.機(jī)器學(xué)習(xí)實(shí)戰(zhàn)第11章
2.Python 極簡關(guān)聯(lián)分析(購物籃分析)
【作者】:Labryant
【原創(chuàng)公眾號(hào)】:風(fēng)控獵人
【簡介】:某創(chuàng)業(yè)公司策略分析師,積極上進(jìn),努力提升。乾坤未定,你我都是黑馬。
【轉(zhuǎn)載說明】:轉(zhuǎn)載請(qǐng)說明出處,謝謝合作!~
總結(jié)
以上是生活随笔為你收集整理的使用Apriori算法进行关联分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用pandas处理时间变量
- 下一篇: 审批政策中收入与负债核实