关联规则Apriori算法
參考《【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-python3】使用Apriori算法進(jìn)行關(guān)聯(lián) 分析》,《 使用Apriori進(jìn)行關(guān)聯(lián)分析(一)》,《使用Apriori進(jìn)行關(guān)聯(lián)分析(二)》,《關(guān)于apriori算法中置信度、支持度怎么理解的問(wèn)題》
文章目錄
- 1. 頻繁項(xiàng)集(frequent item sets)
- 1.1 頻繁項(xiàng)集的支持度(support)和閾值
- 1.2 頻繁項(xiàng)集的特點(diǎn)
- 1.3 頻繁項(xiàng)集支持度計(jì)算方法
- 2. 關(guān)聯(lián)規(guī)則挖掘(association rules)
- 2.1 關(guān)聯(lián)規(guī)則的置信度(confidence)
- 2.2 關(guān)聯(lián)規(guī)則置信度的計(jì)算過(guò)程
- 3. 為什么需要置信度和支持度同時(shí)確定關(guān)聯(lián)規(guī)則
關(guān)聯(lián)規(guī)則的目的在于分析出經(jīng)常出現(xiàn)在一起的物品的集合之間的關(guān)系。Apriori算法本質(zhì)由兩部分組成,分別是
接下來(lái)分別對(duì)這幾個(gè)名詞進(jìn)行講解,同時(shí)串通整個(gè)Apriori算法。
1. 頻繁項(xiàng)集(frequent item sets)
假設(shè)下表為一個(gè)超市的交易記錄,其中交易ID可以看作每個(gè)前來(lái)購(gòu)物的顧客,商品列表就是每個(gè)顧客購(gòu)買(mǎi)的商品。
| 0 | P1, P2, P5 |
| 1 | P2, P4 |
| 2 | P2, P3 |
| 3 | P1, P2, P4 |
| 4 | P1, P3 |
| 5 | P2, P3 |
| 6 | P1, P3 |
| 7 | P1, P2, P3, P5 |
| 8 | P1, P2, P3 |
單是肉眼去觀(guān)察的話(huà),似乎顧客經(jīng)常購(gòu)買(mǎi)P1, P2這樣的組合。這種的購(gòu)物中出現(xiàn)的經(jīng)常的組合,就是我們要找的頻繁項(xiàng)集了。項(xiàng)集可以由一個(gè)商品組成,也可以由多個(gè)商品組成。比如{P1}是一個(gè)項(xiàng)集,{P1, P2}也是一個(gè)項(xiàng)集。
現(xiàn)實(shí)生活中的數(shù)據(jù)肯定比這更加龐大,因此需要使用算法來(lái)幫助我們篩選出來(lái)哪些是頻繁項(xiàng)集。
1.1 頻繁項(xiàng)集的支持度(support)和閾值
一個(gè)項(xiàng)集的支持度被定義為數(shù)據(jù)集中包含該項(xiàng)集的記錄所占的比例,比如在上表中,9個(gè)顧客中有4個(gè)購(gòu)買(mǎi)了P1商品和P2商品,項(xiàng)集{P1, P2}的支持度就是4/9=0.444/9=0.444/9=0.44,支持項(xiàng)就是4項(xiàng).
通常來(lái)說(shuō),我們會(huì)手動(dòng)設(shè)置支持度的閾值。比如設(shè)置閾值為50%,這樣支持度小于該閾值的時(shí)候,就認(rèn)為該項(xiàng)集并不頻繁,也就沒(méi)有挖掘關(guān)聯(lián)規(guī)則的意義,因此不會(huì)進(jìn)行后續(xù)的計(jì)算。
1.2 頻繁項(xiàng)集的特點(diǎn)
頻繁項(xiàng)集擁有如下特點(diǎn):**如果某個(gè)項(xiàng)集是頻繁的,那么它的所有子集也是頻繁的。**比如項(xiàng)集{P1, P2}是頻繁的,那么項(xiàng)集{P1}和{P2}也是頻繁的。該原理倒過(guò)來(lái)推并不成立,也就是說(shuō)當(dāng)我們 只發(fā)現(xiàn){P1}和{P2}是頻繁的的時(shí)候,是無(wú)法推出項(xiàng)集{P1, P2}是頻繁的,因?yàn)橛锌赡芩麄兊念l繁是依靠和別的商品一起購(gòu)買(mǎi)組合而成的。該原理可以用下圖表示
已知陰影項(xiàng)集{2,3}是非頻繁的。利用這個(gè)知識(shí),我們就知道項(xiàng)集{0,2,3} ,{1,2,3}以及{0,1,2,3}也是非頻繁的。該特點(diǎn)的最大用處是幫助我們減少計(jì)算,一旦計(jì)算出了{(lán)2,3}的支持度,知道它是非頻繁的之后,就不需要再計(jì)算{0,2,3}、{1,2,3}和{0,1,2,3}的支持度,因?yàn)槲覀冎肋@些集合不會(huì)滿(mǎn)足我們的要求。使用該原理就可以避免項(xiàng)集數(shù)目的指數(shù)增長(zhǎng),從而在合理時(shí)間內(nèi)計(jì)算出頻繁項(xiàng)集。
1.3 頻繁項(xiàng)集支持度計(jì)算方法
頻繁項(xiàng)集的計(jì)算方法并不復(fù)雜,主要就是三步的不斷循環(huán)。
具體代碼如下
def loadDataSet():return [[1,2,5],[2,4],[2,3],[1,2,4],[1,3],[2,3],[1,3],[1,2,3,5],[1,2,3]] #1.構(gòu)建候選1項(xiàng)集C1 def createC1(dataSet):C1 = []for transaction in dataSet:for item in transaction:if not [item] in C1:C1.append([item])C1.sort()return list(map(frozenset, C1))#將候選集Ck轉(zhuǎn)換為頻繁項(xiàng)集Lk #D:原始數(shù)據(jù)集 #Cn: 候選集項(xiàng)Ck #minSupport:支持度的最小值 def scanD(D, Ck, minSupport):#候選集計(jì)數(shù)ssCnt = {}for tid in D:for can in Ck:if can.issubset(tid):if can not in ssCnt.keys(): ssCnt[can] = 1else: ssCnt[can] += 1numItems = float(len(D))Lk= [] # 候選集項(xiàng)Cn生成的頻繁項(xiàng)集LksupportData = {} #候選集項(xiàng)Cn的支持度字典#計(jì)算候選項(xiàng)集的支持度, supportData key:候選項(xiàng), value:支持度for key in ssCnt:support = ssCnt[key] / numItemsif support >= minSupport:Lk.append(key)supportData[key] = supportreturn Lk, supportData#連接操作,將頻繁Lk-1項(xiàng)集通過(guò)拼接轉(zhuǎn)換為候選k項(xiàng)集 def aprioriGen(Lk_1, k):Ck = []lenLk = len(Lk_1)for i in range(lenLk):L1 = list(Lk_1[i])[:k - 2]L1.sort()for j in range(i + 1, lenLk):#前k-2個(gè)項(xiàng)相同時(shí),將兩個(gè)集合合并L2 = list(Lk_1[j])[:k - 2]L2.sort()if L1 == L2:Ck.append(Lk_1[i] | Lk_1[j])return Ckdef apriori(dataSet, minSupport = 0.5):C1 = createC1(dataSet)L1, supportData = scanD(dataSet, C1, minSupport)L = [L1]k = 2while (len(L[k-2]) > 0):Lk_1 = L[k-2]Ck = aprioriGen(Lk_1, k)print("ck:",Ck)Lk, supK = scanD(dataSet, Ck, minSupport)supportData.update(supK)print("lk:", Lk)L.append(Lk)k += 1return L, supportDatadataset = loadDataSet() L, supportData = apriori(dataset, minSupport=0.2)最終輸出如下,其中ck就是頻繁項(xiàng)候選集,lk就是經(jīng)過(guò)閾值篩選后得到的新的頻繁項(xiàng)候選集。該結(jié)果與上圖一致。
ck: [frozenset({1, 2}), frozenset({1, 5}), frozenset({1, 4}), frozenset({1, 3}), frozenset({2, 5}), frozenset({2, 4}), frozenset({2, 3}), frozenset({4, 5}), frozenset({3, 5}), frozenset({3, 4})] lk: [frozenset({1, 2}), frozenset({1, 5}), frozenset({2, 5}), frozenset({2, 4}), frozenset({2, 3}), frozenset({1, 3})] ck: [frozenset({1, 2, 5}), frozenset({1, 2, 3}), frozenset({1, 3, 5}), frozenset({2, 4, 5}), frozenset({2, 3, 5}), frozenset({2, 3, 4})] lk: [frozenset({1, 2, 5}), frozenset({1, 2, 3})] ck: [frozenset({1, 2, 3, 5})] lk: []需要注意的是,在上述代碼的aprioriGen方法中,假定購(gòu)買(mǎi)商品是有順序的,可以通過(guò)頻繁2項(xiàng)集{P1,P2},{P1,P3}推導(dǎo)出頻繁項(xiàng){P1,P2,P3},但是不能通過(guò)頻繁2項(xiàng)集{P3,P4},{P1,P3}推導(dǎo)出頻繁項(xiàng){P1,P3,P4}。如果去掉假設(shè),則需要修改aprioriGen的代碼:
#將頻繁Lk-1項(xiàng)集轉(zhuǎn)換為候選k項(xiàng)集 def aprioriGen(Lk_1, k):Ck = []lenLk = len(Lk_1)for i in range(lenLk):L1 = Lk_1[i]for j in range(i + 1, lenLk):L2 = Lk_1[j]if len(L1 & L2) == k - 2:L1_2 = L1 | L2if L1_2 not in Ck:Ck.append(L1 | L2)return Ck2. 關(guān)聯(lián)規(guī)則挖掘(association rules)
2.1 關(guān)聯(lián)規(guī)則的置信度(confidence)
我們的目的是根據(jù)頻繁項(xiàng)集挖掘出關(guān)聯(lián)規(guī)則。關(guān)聯(lián)規(guī)則的意思就是通過(guò)某個(gè)項(xiàng)集可以推導(dǎo)出另一個(gè)項(xiàng)集。比如一個(gè)頻繁項(xiàng)集{P1, P2, P3},就可以推導(dǎo)出六個(gè)可能的關(guān)聯(lián)規(guī)則。其中置信度最高的就是最有可能的關(guān)聯(lián)規(guī)則。
- {P1} → {P2, P3}
- {P2} → {P1, P3}
- {P3} → {P1, P2}
- {P1, P2} → {P3}
- {P2, P3} → {P1}
- {P1, P3} → {P2}
箭頭左邊的集合稱(chēng)為“前件”,右邊集合稱(chēng)為“后件”,根據(jù)前件會(huì)有較大概率推導(dǎo)出后件,這個(gè)概率就是之前提到的置信度(confidence)。需要注意的是,如果A→B成立,B→A不一定成立。
一個(gè)具有N個(gè)元素的頻繁項(xiàng)集,共有M個(gè)可能的關(guān)聯(lián)規(guī)則:
M=∑N?1i=1CNiM = \sum_{N-1}^{i=1}C_N^i M=N?1∑i=1?CNi?
下圖是一個(gè)頻繁4項(xiàng)集的所有關(guān)聯(lián)規(guī)則網(wǎng)格示意圖
M=C41+C42+C43=14M = C_4^1+C_4^2+C_4^3=14 M=C41?+C42?+C43?=14
上圖中深色區(qū)域表示低可信度規(guī)則,如果012→3是一條低可信度規(guī)則,則所有其它3為后件的規(guī)則都是低可信度。這需要從可信度的概念去理解
- Confidence(012→3) = P(3|0,1,2)
- Confidence(01→23) = P(2,3|0,1)
- P(3|0,1,2) >= P(2,3|0,1)
由此可以對(duì)關(guān)聯(lián)規(guī)則做剪枝處理。
2.2 關(guān)聯(lián)規(guī)則置信度的計(jì)算過(guò)程
置信度的計(jì)算公式為
置信度=頻繁項(xiàng)集的出現(xiàn)數(shù)量某可能規(guī)則的出現(xiàn)數(shù)量置信度 =\frac{頻繁項(xiàng)集的出現(xiàn)數(shù)量}{某可能規(guī)則的出現(xiàn)數(shù)量} 置信度=某可能規(guī)則的出現(xiàn)數(shù)量頻繁項(xiàng)集的出現(xiàn)數(shù)量?
還是以上篇的超市交易數(shù)據(jù)為例,我們發(fā)現(xiàn)了如下的頻繁項(xiàng)集:
對(duì)于尋找關(guān)聯(lián)規(guī)則來(lái)說(shuō),頻繁1項(xiàng)集L1沒(méi)有用處,因?yàn)長(zhǎng)1中的每個(gè)集合僅有一個(gè)數(shù)據(jù)項(xiàng),至少有兩個(gè)數(shù)據(jù)項(xiàng)才能生成A→B這樣的關(guān)聯(lián)規(guī)則。
當(dāng)最小置信度取0.5時(shí),L2最終能夠挖掘出9條關(guān)聯(lián)規(guī)則:
以P2->P1為例,在本文最上面的表格中,P2出現(xiàn)了7次,頻繁項(xiàng)集{P1, P2}的出現(xiàn)次數(shù)為4次,因此P2->P1的支持度就是4/7。同理,P1出現(xiàn)了6次,那么P1->P2的支持度就是4/6.
從頻繁3項(xiàng)集開(kāi)始,挖掘的過(guò)程就較為復(fù)雜,要計(jì)算如{P1, P2}這樣的復(fù)合頻繁項(xiàng)集后件,并分別計(jì)算置信度。
假設(shè)有一個(gè)頻繁4項(xiàng)集(這是杜撰的,文中的數(shù)據(jù)不能生成L4),其挖掘過(guò)程如下:
發(fā)掘關(guān)聯(lián)規(guī)則的代碼如下
得到的結(jié)果如下所示
frozenset({5}) --> frozenset({1}) conf: 1.0 frozenset({5}) --> frozenset({2}) conf: 1.0 frozenset({4}) --> frozenset({2}) conf: 1.0 frozenset({5}) --> frozenset({1, 2}) conf: 1.0 [(frozenset({5}), frozenset({1}), 1.0),(frozenset({5}), frozenset({2}), 1.0),(frozenset({4}), frozenset({2}), 1.0),(frozenset({5}), frozenset({1, 2}), 1.0)]3. 為什么需要置信度和支持度同時(shí)確定關(guān)聯(lián)規(guī)則
以超市購(gòu)物為例。
| 1 | Bread, Milk |
| 2 | Break, Diaper, Beer, Eggs |
| 3 | Milk, Diaper, Beer, Coke |
| 4 | Bread, Milk, Diaper, Beer |
| 5 | Bread, Milk, Diaper, Coke |
TID是transaction ID 即交易編號(hào),也就是有五個(gè)人在超市買(mǎi)了這樣的東西(Iteams),現(xiàn)在我們統(tǒng)計(jì)一下,大家買(mǎi)的東西之間有沒(méi)有什么規(guī)律,比如買(mǎi)面包的是不是很可能同時(shí)買(mǎi)牛奶這樣的規(guī)律。
在這里,支持度的計(jì)算過(guò)程為
support=σ(Milk,Diaper,Beer)∣T∣=25=0.4support =\frac{\sigma(Milk, Diaper, Beer)}{|T|} = \frac{2}{5}=0.4 support=∣T∣σ(Milk,Diaper,Beer)?=52?=0.4
支持度越大,說(shuō)明同時(shí)買(mǎi)這三個(gè)東西的人多,說(shuō)明這三者之間有關(guān)系.
但是當(dāng)交易量特別大的時(shí)候,假如有一萬(wàn)個(gè)人買(mǎi)東西,只有10個(gè)人同時(shí)買(mǎi)了Milk、Diaper、Beer,但其他9990個(gè)人沒(méi)有買(mǎi)這三者中的任何一個(gè),那么此時(shí)S=10/10000=0.001。如果僅從這個(gè)0.001看,這三者之間沒(méi)有任何關(guān)系,但是事實(shí)卻不是這樣,因?yàn)橹挥惺畟€(gè)人這樣買(mǎi),并且同時(shí)買(mǎi)了這三種東西,所以他們之間應(yīng)該是由關(guān)系的,而不是偶然。
引入置信度的概念后,比如我們想看{Milk, Diaper}→{Beer}的置信度,則計(jì)算過(guò)程為
confidence=σ(Milk,Diaper,Beer)σ(Milk,Diaper)=23=0.67confidence=\frac{\sigma(Milk, Diaper, Beer)}{\sigma(Milk, Diaper)} = \frac{2}{3}=0.67 confidence=σ(Milk,Diaper)σ(Milk,Diaper,Beer)?=32?=0.67
和S支持度比較只有分母變了,變成了買(mǎi)了Milk和Diaper兩種東西的人,這個(gè)式子是說(shuō)買(mǎi)了Milk和Diaper兩種東西的人里面又有多少人買(mǎi)了Beer這個(gè)東西!
在上面支持度為0.001的情況下,此時(shí)置信度=10/10=100%!足以說(shuō)明兩者之間的關(guān)聯(lián)性。
但是只有置信度也是不可行的,比如10000個(gè)訂單中,只有一個(gè)人同時(shí)購(gòu)買(mǎi)了Milk,Diaper和Bear,那么此時(shí)的置信度為1/1=100%!可是支持度只有0.0001,非常的小。
所以正確的有關(guān)聯(lián)的判定是:置信度和支持度都應(yīng)該比較大才可以認(rèn)為這些東西之間有關(guān)聯(lián)!
總結(jié)
以上是生活随笔為你收集整理的关联规则Apriori算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HR团队如何提升效率?人力资源RPA给你
- 下一篇: 大数据领域十大必读书籍