詳解Python 關(guān)聯(lián)規(guī)則分析
1. 關(guān)聯(lián)規(guī)則
大家可能聽說過用于宣傳數(shù)據(jù)挖掘的一個(gè)案例:啤酒和尿布;據(jù)說是沃爾瑪超市在分析顧客的購買記錄時(shí),發(fā)現(xiàn)許多客戶購買啤酒的同時(shí)也會(huì)購買嬰兒尿布,于是超市調(diào)整了啤酒和尿布的貨架擺放,讓這兩個(gè)品類擺放在一起;結(jié)果這兩個(gè)品類的銷量都有明顯的增長;分析原因是很多剛生小孩的男士在購買的啤酒時(shí),會(huì)順手帶一些嬰幼兒用品。
不論這個(gè)案例是否是真實(shí)的,案例中分析顧客購買記錄的方式就是關(guān)聯(lián)規(guī)則分析法Association Rules。
關(guān)聯(lián)規(guī)則分析也被稱為購物籃分析,用于分析數(shù)據(jù)集各項(xiàng)之間的關(guān)聯(lián)關(guān)系。
1.1 基本概念
- 項(xiàng)集:item的集合,如集合{牛奶、麥片、糖}是一個(gè)3項(xiàng)集,可以認(rèn)為是購買記錄里物品的集合。
- 頻繁項(xiàng)集:顧名思義就是頻繁出現(xiàn)的item項(xiàng)的集合。如何定義頻繁呢?用比例來判定,關(guān)聯(lián)規(guī)則中采用支持度和置信度兩個(gè)概念來計(jì)算比例值
- 支持度:共同出現(xiàn)的項(xiàng)在整體項(xiàng)中的比例。以購買記錄為例子,購買記錄100條,如果商品A和B同時(shí)出現(xiàn)50條購買記錄(即同時(shí)購買A和B的記錄有50),那邊A和B這個(gè)2項(xiàng)集的支持度為50%
- 置信度:購買A后再購買B的條件概率,根據(jù)貝葉斯公式,可如下表示:
提升度:為了判斷產(chǎn)生規(guī)則的實(shí)際價(jià)值,即使用規(guī)則后商品出現(xiàn)的次數(shù)是否高于商品單獨(dú)出現(xiàn)的評(píng)率,提升度和衡量購買X對(duì)購買Y的概率的提升作用。如下公式可見,如果X和Y相互獨(dú)立那么提升度為1,提升度越大,說明X->Y的關(guān)聯(lián)性越強(qiáng)
1.2 關(guān)聯(lián)規(guī)則Apriori算法
關(guān)聯(lián)規(guī)則方法的步驟如下:
- 發(fā)現(xiàn)頻繁項(xiàng)集
- 找出關(guān)聯(lián)規(guī)則
Apriori算法是經(jīng)典的關(guān)聯(lián)規(guī)則算法。Apriori算法的目標(biāo)是找到最大的K項(xiàng)頻繁集。Apriori算法從尋找1項(xiàng)集開始,通過最小支持度閾值進(jìn)行剪枝,依次尋找2項(xiàng)集,3項(xiàng)集直到?jīng)]有更過項(xiàng)集為止。
下面是一個(gè)案例圖解:
- 圖中有4個(gè)記錄,記錄項(xiàng)有1,2,3,4,5若干
- 首先先找出1項(xiàng)集對(duì)應(yīng)的支持度(C1),可以看出4的支持度低于最小支持閾值,先剪掉(L1)。
- 從1項(xiàng)集生成2項(xiàng)集,并計(jì)算支持度(C2),可以看出(1,5)(1,2)支持度低于最小支持閾值,先剪掉(L2)
- 從2項(xiàng)集生成3項(xiàng)集,(1,2,3)(1,2,5)(2,3,5)只有(2,3,5)滿足要求
- 沒有更多的項(xiàng)集了,就定制迭代
2. mlxtend實(shí)戰(zhàn)關(guān)聯(lián)規(guī)則
關(guān)聯(lián)規(guī)則目前在scikit-learn中并沒有實(shí)現(xiàn)。這里介紹另一個(gè)python庫mlxtend。
2.1 安裝
pip install mlxtend
2.2 簡單的例子
來看下數(shù)據(jù)集:
import pandas as pd item_list = [['牛奶','面包'], ['面包','尿布','啤酒','土豆'], ['牛奶','尿布','啤酒','可樂'], ['面包','牛奶','尿布','啤酒'], ['面包','牛奶','尿布','可樂']] item_df = pd.DataFrame(item_list)
數(shù)據(jù)格式處理,傳入模型的數(shù)據(jù)需要滿足bool值的格式
from mlxtend.preprocessing import TransactionEncode te = TransactionEncoder() df_tf = te.fit_transform(item_list) df = pd.DataFrame(df_tf,columns=te.columns_)
- 計(jì)算頻繁項(xiàng)集
from mlxtend.frequent_patterns import apriori # use_colnames=True表示使用元素名字,默認(rèn)的False使用列名代表元素, 設(shè)置最小支持度min_support frequent_itemsets = apriori(df, min_support=0.05, use_colnames=True) frequent_itemsets.sort_values(by='support', ascending=False, inplace=True) # 選擇2頻繁項(xiàng)集 print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)) == 2])
- 計(jì)算關(guān)聯(lián)規(guī)則
from mlxtend.frequent_patterns import association_rules # metric可以有很多的度量選項(xiàng),返回的表列名都可以作為參數(shù) association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.9) #關(guān)聯(lián)規(guī)則可以提升度排序 association_rule.sort_values(by='lift',ascending=False,inplace=True) association_rule # 規(guī)則是:antecedents->consequents
選擇出來關(guān)聯(lián)規(guī)則之后,根據(jù)提升度排序后,可能最高提升度的規(guī)則是在我們常識(shí)范圍內(nèi),那這個(gè)規(guī)則的價(jià)值就不高。所以我們要在產(chǎn)生的規(guī)則中根據(jù)業(yè)務(wù)特點(diǎn)進(jìn)行篩選,像開篇提到(啤酒->尿布)完全不同的品類之間的關(guān)聯(lián)。
筆者最近用關(guān)聯(lián)規(guī)則分析用戶的體檢報(bào)告記錄,也得出了關(guān)于各個(gè)病癥的有意義的關(guān)聯(lián),如并發(fā)癥,不同病癥相互影響等。
3. 總結(jié)
本分介紹關(guān)聯(lián)規(guī)則的基本概念和經(jīng)典算法Apriori,以及python的實(shí)現(xiàn)庫mlxtend使用。
總結(jié)如下:
- 關(guān)聯(lián)規(guī)則用于分析數(shù)據(jù)集各項(xiàng)之間的關(guān)聯(lián)關(guān)系,想一想啤酒和尿布的故事
- 三個(gè)重要概念:支持度,置信度和提升度
- Apriori通過迭代先找1項(xiàng)集,用支持度過濾項(xiàng)集,逐步找出所有k項(xiàng)集
- 用置信度或提升度來選擇滿足的要求的規(guī)則
- mlxtend對(duì)數(shù)據(jù)要求轉(zhuǎn)換成bool值才可用
以上就是詳解Python 關(guān)聯(lián)規(guī)則分析的詳細(xì)內(nèi)容,更多關(guān)于Python 關(guān)聯(lián)規(guī)則分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Python 不同級(jí)目錄之間模塊的調(diào)用方法
今天小編就為大家分享一篇在Python 不同級(jí)目錄之間模塊的調(diào)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Django視圖擴(kuò)展類知識(shí)點(diǎn)詳解
這篇文章主要介紹了Django視圖擴(kuò)展類知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2019-10-10詳解Anaconda安裝tensorflow報(bào)錯(cuò)問題解決方法
這篇文章主要介紹了Anaconda安裝tensorflow報(bào)錯(cuò)問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Django使用Celery實(shí)現(xiàn)異步發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Django如何使用Celery實(shí)現(xiàn)異步發(fā)送郵件的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04python+matplotlib繪制餅圖散點(diǎn)圖實(shí)例代碼
這篇文章主要介紹了python+matplotlib繪制餅圖散點(diǎn)圖實(shí)例代碼,本實(shí)例是官網(wǎng)的一個(gè)實(shí)例,不過也很簡單,大家可以參考下2018-01-01Python?plt.title()函數(shù)實(shí)例詳解
plt.title() 是 matplotlib 庫中用于設(shè)置圖形標(biāo)題的函數(shù),這篇文章主要介紹了Python?plt.title()函數(shù),需要的朋友可以參考下2023-03-03python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理
這篇文章主要介紹了python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04