【机器学习】 关联规则Apriori和mlxtend——推荐算法
引入:
啤酒與尿布的故事
關(guān)聯(lián)規(guī)律挖掘:從交易數(shù)據(jù)中發(fā)現(xiàn):買(mǎi)了X 還會(huì)買(mǎi)Y 的規(guī)則
關(guān)聯(lián)規(guī)律挖掘‘購(gòu)物籃分析’Market Basket Analysis(MBA)
關(guān)聯(lián)規(guī)律->應(yīng)用于推薦系統(tǒng)
1. 關(guān)聯(lián)規(guī)則代碼演示
使用的是mlxtend.frequent_patterns.Apriori()
import numpy as np import pandas as pdfrom mlxtend.frequent_patterns import apriori,association_rules #TransactionEncoder 事務(wù),編碼 #事務(wù):表示事件 #(比如每次去商場(chǎng)購(gòu)買(mǎi)東西是一次事務(wù),而實(shí)際購(gòu)買(mǎi)到的東西就是項(xiàng)集) from mlxtend.preprocessing import TransactionEncoder te = TransactionEncoder() X =te.fit_transform(data) colmns = te.columns_ df = pd.DataFrame(X,columns=colmns) df.astype(np.uint8)| 0 | 0 | 0 | 1 | 0 | 1 |
| 1 | 0 | 1 | 1 | 1 | 0 |
| 1 | 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 1 |
| 1 | 1 | 0 | 1 | 0 | 1 |
| 0.8 | (尿布) |
| 0.8 | (萵苣) |
| 0.6 | (葡萄酒) |
| 0.8 | (豆奶) |
| 0.6 | (尿布, 萵苣) |
| 0.6 | (尿布, 葡萄酒) |
| 0.6 | (尿布, 豆奶) |
| 0.6 | (萵苣, 豆奶) |
關(guān)聯(lián)規(guī)則
條目 —》另一些條目之間有關(guān)聯(lián)的
根據(jù)關(guān)聯(lián)性強(qiáng),進(jìn)行推薦
推薦系統(tǒng)(小公司:分類(lèi),)
關(guān)聯(lián)規(guī)則的三個(gè)計(jì)算:
支持度 support
置信度 confidence
提升度 lift
公式計(jì)算如下:
association_rules(result,min_threshold=0.5)| (尿布) | (萵苣) | 0.8 | 0.8 | 0.6 | 0.75 | 0.9375 | -0.04 | 0.8 |
| (萵苣) | (尿布) | 0.8 | 0.8 | 0.6 | 0.75 | 0.9375 | -0.04 | 0.8 |
| (尿布) | (葡萄酒) | 0.8 | 0.6 | 0.6 | 0.75 | 1.2500 | 0.12 | 1.6 |
| (葡萄酒) | (尿布) | 0.6 | 0.8 | 0.6 | 1.00 | 1.2500 | 0.12 | inf |
| (尿布) | (豆奶) | 0.8 | 0.8 | 0.6 | 0.75 | 0.9375 | -0.04 | 0.8 |
| (豆奶) | (尿布) | 0.8 | 0.8 | 0.6 | 0.75 | 0.9375 | -0.04 | 0.8 |
| (萵苣) | (豆奶) | 0.8 | 0.8 | 0.6 | 0.75 | 0.9375 | -0.04 | 0.8 |
| (豆奶) | (萵苣) | 0.8 | 0.8 | 0.6 | 0.75 | 0.9375 | -0.04 | 0.8 |
探究關(guān)聯(lián)規(guī)則的原始代碼
import numpy as np def createC1(dataSet):C1 = []for transaction in dataSet:for item in transaction:if not [item] in C1:C1.append([item]) #store all the item unrepeatlyC1.sort()#return map(frozenset, C1)#frozen set, user can't change it.return list(map(frozenset, C1))def scanD(D,Ck,minSupport): #參數(shù):數(shù)據(jù)集、候選項(xiàng)集列表 Ck以及感興趣項(xiàng)集的最小支持度 minSupportssCnt={}for tid in D:#遍歷數(shù)據(jù)集for can in Ck:#遍歷候選項(xiàng)if can.issubset(tid):#判斷候選項(xiàng)中是否含數(shù)據(jù)集的各項(xiàng)#if not ssCnt.has_key(can): # python3 can not supportif not can in ssCnt:ssCnt[can]=1 #不含設(shè)為1else: ssCnt[can]+=1#有則計(jì)數(shù)加1numItems=float(len(D))#數(shù)據(jù)集大小retList = []#L1初始化supportData = {}#記錄候選項(xiàng)中各個(gè)數(shù)據(jù)的支持度for key in ssCnt:support = ssCnt[key]/numItems#計(jì)算支持度if support >= minSupport:retList.insert(0,key)#滿(mǎn)足條件加入L1中supportData[key] = supportreturn retList, supportDatadef aprioriGen(Lk, k): #組合,向上合并#creates Ck 參數(shù):頻繁項(xiàng)集列表 Lk 與項(xiàng)集元素個(gè)數(shù) kretList = []lenLk = len(Lk)for i in range(lenLk):for j in range(i+1, lenLk): #兩兩組合遍歷L1 = list(Lk[i])[:k-2]; L2 = list(Lk[j])[:k-2]L1.sort(); L2.sort()if L1==L2: #若兩個(gè)集合的前k-2個(gè)項(xiàng)相同時(shí),則將兩個(gè)集合合并retList.append(Lk[i] | Lk[j]) #set unionreturn retListdef apriori(dataSet, minSupport = 0.5):C1 = createC1(dataSet)D = list(map(set, dataSet)) #python3L1, supportData = scanD(D, C1, minSupport)#單項(xiàng)最小支持度判斷 0.5,生成L1L = [L1]k = 2while (len(L[k-2]) > 0):#創(chuàng)建包含更大項(xiàng)集的更大列表,直到下一個(gè)大的項(xiàng)集為空Ck = aprioriGen(L[k-2], k)#CkLk, supK = scanD(D, Ck, minSupport)#get LksupportData.update(supK)L.append(Lk)k += 1return L, supportDatadef generateRules(L, supportData, minConf=0.7):#頻繁項(xiàng)集列表、包含那些頻繁項(xiàng)集支持?jǐn)?shù)據(jù)的字典、最小可信度閾值bigRuleList = [] #存儲(chǔ)所有的關(guān)聯(lián)規(guī)則for i in range(1, len(L)): #只獲取有兩個(gè)或者更多集合的項(xiàng)目,從1,即第二個(gè)元素開(kāi)始,L[0]是單個(gè)元素的# 兩個(gè)及以上的才可能有關(guān)聯(lián)一說(shuō),單個(gè)元素的項(xiàng)集不存在關(guān)聯(lián)問(wèn)題for freqSet in L[i]:H1 = [frozenset([item]) for item in freqSet]#該函數(shù)遍歷L中的每一個(gè)頻繁項(xiàng)集并對(duì)每個(gè)頻繁項(xiàng)集創(chuàng)建只包含單個(gè)元素集合的列表H1if (i > 1):#如果頻繁項(xiàng)集元素?cái)?shù)目超過(guò)2,那么會(huì)考慮對(duì)它做進(jìn)一步的合并rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)else:#第一層時(shí),后件數(shù)為1calcConf(freqSet, H1, supportData, bigRuleList, minConf)# 調(diào)用函數(shù)2return bigRuleListdef calcConf(freqSet, H, supportData, brl, minConf=0.7):#針對(duì)項(xiàng)集中只有兩個(gè)元素時(shí),計(jì)算可信度prunedH = []#返回一個(gè)滿(mǎn)足最小可信度要求的規(guī)則列表for conseq in H:#后件,遍歷 H中的所有項(xiàng)集并計(jì)算它們的可信度值conf = supportData[freqSet]/supportData[freqSet-conseq] #可信度計(jì)算,結(jié)合支持度數(shù)據(jù)if conf >= minConf:print (freqSet-conseq,'-->',conseq,'conf:',conf)#如果某條規(guī)則滿(mǎn)足最小可信度值,那么將這些規(guī)則輸出到屏幕顯示brl.append((freqSet-conseq, conseq, conf))#添加到規(guī)則里,brl 是前面通過(guò)檢查的 bigRuleListprunedH.append(conseq)#同樣需要放入列表到后面檢查return prunedHdef rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):#參數(shù):一個(gè)是頻繁項(xiàng)集,另一個(gè)是可以出現(xiàn)在規(guī)則右部的元素列表 Hm = len(H[0])if (len(freqSet) > (m + 1)): #頻繁項(xiàng)集元素?cái)?shù)目大于單個(gè)集合的元素?cái)?shù)Hmp1 = aprioriGen(H, m+1)#存在不同順序、元素相同的集合,合并具有相同部分的集合Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)#計(jì)算可信度if (len(Hmp1) > 1): #滿(mǎn)足最小可信度要求的規(guī)則列表多于1,則遞歸來(lái)判斷是否可以進(jìn)一步組合這些規(guī)則rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf) data=[['豆奶','萵苣'],['萵苣','尿布','葡萄酒','甜菜'],['豆奶','尿布','葡萄酒','橙汁'],['萵苣','豆奶','尿布','葡萄酒'],['萵苣','豆奶','尿布','橙汁']] L, supportData = apriori(data,minSupport = 0.5) # 頻繁項(xiàng)集 display(L) #計(jì)算 display(supportData)[[frozenset({‘葡萄酒’}), frozenset({‘尿布’}), frozenset({‘豆奶’}), frozenset({‘萵苣’})],
[frozenset({‘尿布’, ‘豆奶’}),
frozenset({‘尿布’, ‘萵苣’}),
frozenset({‘尿布’, ‘葡萄酒’}),
frozenset({‘萵苣’, ‘豆奶’})],
[]]
{frozenset({‘萵苣’}): 0.8,
frozenset({‘豆奶’}): 0.8,
frozenset({‘尿布’}): 0.8,
frozenset({‘甜菜’}): 0.2,
frozenset({‘葡萄酒’}): 0.6,
frozenset({‘橙汁’}): 0.4,
frozenset({‘萵苣’, ‘豆奶’}): 0.6,
frozenset({‘尿布’, ‘葡萄酒’}): 0.6,
frozenset({‘萵苣’, ‘葡萄酒’}): 0.4,
frozenset({‘尿布’, ‘萵苣’}): 0.6,
frozenset({‘葡萄酒’, ‘豆奶’}): 0.4,
frozenset({‘尿布’, ‘豆奶’}): 0.6,
frozenset({‘尿布’, ‘萵苣’, ‘豆奶’}): 0.4}
[(frozenset({‘葡萄酒’}), frozenset({‘尿布’}), 1.0)]
核心思想簡(jiǎn)單來(lái)說(shuō)就是 :
1、發(fā)現(xiàn)頻繁項(xiàng)集過(guò)程為
①掃描(掃描所有數(shù)據(jù))
②計(jì)數(shù)(計(jì)算各個(gè)候選集的支持度)
③比較(選出適合條件的頻繁項(xiàng)集)
④產(chǎn)生頻繁集
⑤連接、再剪枝產(chǎn)生候選集
2、產(chǎn)生關(guān)聯(lián)規(guī)則。過(guò)程:根據(jù)前面提到的置信度的定義,關(guān)聯(lián)規(guī)則的產(chǎn)生如下:
①對(duì)于每個(gè)頻繁項(xiàng)集L,產(chǎn)生L的所有非空子集。
②對(duì)于L的每個(gè)非空子集S,如果P(L)/P(S)>=min_conf,則輸出規(guī)則“Sa L-S”。(L-S表示在項(xiàng)集中除去S子集的項(xiàng)集。)
Apriori缺點(diǎn):
①由頻繁k-1項(xiàng)集進(jìn)行自連接生成的候選頻繁k項(xiàng)集數(shù)量巨大
②在驗(yàn)證候選頻繁k項(xiàng)集的時(shí)候需要對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行掃描,非常耗時(shí)。
更多推薦算法參考:
史上最全機(jī)器學(xué)習(xí)算法(源于逼乎)
總結(jié)
以上是生活随笔為你收集整理的【机器学习】 关联规则Apriori和mlxtend——推荐算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 盒仔机器人_DFROBOT SEN024
- 下一篇: Linux执行定时任务(crontab)