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