Apriori算法进行关联分析(2)
頻繁項(xiàng)集及關(guān)聯(lián)規(guī)則的應(yīng)用中,購(gòu)物、搜索引擎中的查詢?cè)~等,下面看一個(gè)美國(guó)國(guó)會(huì)議員投票的例子。
1. 示例:發(fā)現(xiàn)國(guó)會(huì)投票中的模式
這個(gè)例子雖然在數(shù)據(jù)的獲取過程中有點(diǎn)復(fù)雜,但我覺得還是很有必要分析下整個(gè)過程。
1. 收集數(shù)據(jù):構(gòu)建美國(guó)國(guó)會(huì)投票記錄的事務(wù)數(shù)據(jù)集
我們希望最終數(shù)據(jù)的格式:即每一行代表美國(guó)國(guó)會(huì)的一個(gè)成員,而每列都是他們投票的對(duì)象。
(1)需要提前做的準(zhǔn)備:
- 安裝python-votesmart
獲得API key(這需要申請(qǐng)自己的key)
(2)使用相關(guān)的API
bills=votesmart.votes.getBillsByStateRecent()獲得最近的100條議案
bill.title:獲得議案標(biāo)題 bill.billId:獲得議案ID號(hào)
bill=votesmart.votes.getBill(11820)通過getBill()方法獲得每條議案的更多內(nèi)容,此時(shí)的bill是一個(gè)BillDetail對(duì)象,包含大量的完整信息。
bill.actions:查看議案的所有行為,包括議案被提出時(shí)的行為,以及議案在投票時(shí)的行為
action.stage和action.actionID:我們所感興趣的是投票時(shí)的行為,所以得到行為的狀態(tài)和其相應(yīng)的ID。
- voteList=votesmart.votes.getBillActionVotes(),通過getBillActionVotes()方法獲得某條議案的具體投票信息。其中voteList是一個(gè)包含vote對(duì)象的列表。
(2)為了將billID轉(zhuǎn)化為actionID,并對(duì)actionID進(jìn)行過濾只保留包含投票數(shù)據(jù)的actionID,這樣得到剩下的議案都是有趣的議案:
# -*- coding: utf-8 -*- """ Created on Thu Nov 09 20:52:41 2017 """from time import sleep from votesmart import votesmart # 此模塊需要單獨(dú)下載votesmart.apikey = 'a7fa40adec6f4a77178799fae4441030' # 這里需要改換成自己的API key # 收集美國(guó)國(guó)會(huì)議案中action ID的函數(shù) def getActionIds():actionIdList = []; billTitleList = []fr = open('recent20bills.txt') for line in fr.readlines():billNum = int(line.split('\t')[0]) # 得到了議案的IDtry:billDetail = votesmart.votes.getBill(billNum) # 得到一個(gè)billDetail對(duì)象for action in billDetail.actions: # 遍歷議案中的所有行為if action.level == 'House' and \(action.stage == 'Passage' or action.stage == 'Amendment Vote'):actionId = int(action.actionId) print 'bill: %d has actionId: %d' % (billNum, actionId)actionIdList.append(actionId)billTitleList.append(line.strip().split('\t')[1])except: # API調(diào)用時(shí)發(fā)生錯(cuò)誤print "problem getting bill %d" % billNumsleep(1) # 禮貌訪問網(wǎng)站而做出些延遲,避免過度訪問return actionIdList, billTitleList此時(shí)得到了有actionID的議案,接下來可以獲取這些actionID的投票信息。
(3)選舉人可以投是或否的表決票,也可以棄權(quán),需要將上述信息轉(zhuǎn)化為類似于項(xiàng)集或者交易數(shù)據(jù)庫(kù)之類的東西,而一條交易記錄只包含一個(gè)項(xiàng)的出現(xiàn)或者不出現(xiàn),并不包含項(xiàng)出現(xiàn)的次數(shù)。
在使用Apriori之前需要構(gòu)建事務(wù)數(shù)據(jù)庫(kù):首先創(chuàng)建一個(gè)字典,字典中使用政客的名字作為鍵值,然后對(duì)投票進(jìn)行編碼,其對(duì)每條議案使用兩個(gè)條目:bill+’Yea’以及bill+’Nay’。
投票信息到元素項(xiàng)的轉(zhuǎn)換結(jié)果:
下面的函數(shù)就是以actionID串作為輸入并利用votesmart的API來抓取投票記錄的函數(shù),然后將每個(gè)選舉人的投票轉(zhuǎn)化為一個(gè)項(xiàng)集,每個(gè)選舉人對(duì)應(yīng)于一行或者說事物數(shù)據(jù)庫(kù)中的一條記錄。
# 基于投票數(shù)據(jù)的事物列表填充函數(shù) def getTransList(actionIdList, billTitleList): itemMeaning = ['Republican', 'Democratic'] # 創(chuàng)建一個(gè)含義列表for billTitle in billTitleList: # 遍歷所有的議案itemMeaning.append('%s -- Nay' % billTitle) # 在議案標(biāo)題后面添加Nay(反對(duì))itemMeaning.append('%s -- Yea' % billTitle) # 在議案標(biāo)題后添加Yea(同意)transDict = {} # 用于加入元素項(xiàng)voteCount = 2for actionId in actionIdList: # 遍歷getActionIds()返回的每一個(gè)actionIdsleep(3) # 延遲訪問,防止過于頻繁的API調(diào)用 print 'getting votes for actionId: %d' % actionIdtry:voteList = votesmart.votes.getBillActionVotes(actionId) # 獲得某個(gè)特定的actionId的所有投票信息for vote in voteList: # 遍歷投票信息if not transDict.has_key(vote.candidateName): # 如果沒有該政客的名字transDict[vote.candidateName] = [] # 用該政客的名字作為鍵來填充transDictif vote.officeParties == 'Democratic': # 獲取該政客的政黨信息transDict[vote.candidateName].append(1)elif vote.officeParties == 'Republican':transDict[vote.candidateName].append(0)if vote.action == 'Nay':transDict[vote.candidateName].append(voteCount)elif vote.action == 'Yea':transDict[vote.candidateName].append(voteCount + 1)except: print "problem getting actionId: %d" % actionIdvoteCount += 2return transDict, itemMeaning # 返回事物字典和元素項(xiàng)含義列表測(cè)試算法,基于投票挖掘關(guān)聯(lián)規(guī)則
dataSet=[transDict[key] for key in transDict.keys() ] L,suppData=apriori(dataSet,0.5) # 得到頻繁項(xiàng)集 rules=generateRules(L,suppData,0.99)結(jié)果得到:
最后可以基于關(guān)聯(lián)規(guī)則和支持度進(jìn)行分析,解決實(shí)際問題。
2. 示例:發(fā)現(xiàn)毒蘑菇的相似特征
有時(shí)我們并不想尋找所有頻繁項(xiàng)集,而只對(duì)包含某個(gè)特定元素項(xiàng)的項(xiàng)集感興趣。在本章這個(gè)最后的例子中,我們會(huì)尋找毒蘑菇中的一些公共特征,利用這些特征就能避免吃到那些有毒的蘑菇。UCI的機(jī)器學(xué)習(xí)數(shù)據(jù)集合中有一個(gè)關(guān)于肋形蘑菇的23種特征的數(shù)據(jù)集,每一個(gè)特征都包含一個(gè)標(biāo)稱數(shù)據(jù)值。我們必須將這些標(biāo)稱值轉(zhuǎn)化為一個(gè)集合,這一點(diǎn)與前面投票例子中的做法類似。幸運(yùn)的是,已經(jīng)有人已經(jīng)做好了這種轉(zhuǎn)換。Roberto Bayardo對(duì)UCI蘑菇數(shù)據(jù)集進(jìn)行了解析,將每個(gè)蘑燕樣本轉(zhuǎn)換成一個(gè)特征集合。其中,枚舉了每個(gè)特征的所有可能值,如果某個(gè)樣本包含特征,那么該特征對(duì)應(yīng)的整數(shù)值被包含數(shù)據(jù)集中。
此時(shí)可以利用Apriori算法尋找包含特征值為2(這里‘2’代表了有毒的特征)的頻繁項(xiàng)集。
代碼:
# 主函數(shù) mushDataSet=[line.split() for line in open ('mushroom.dat').readlines()] L,suppData=apriori(mushDataSet,minSupport = 0.5) print 'L[1]:',L[1] for item in L[1]: # 在單元素頻繁項(xiàng)集中找到包含特征2的頻繁集if item.intersection('2'):print 'item:',item這里只給出了調(diào)用語句,具體的Apriori算法參考:Apriori算法發(fā)現(xiàn)頻繁集
只需改動(dòng)主函數(shù)語句即可:
運(yùn)行結(jié)果:
L[1]: [frozenset(['59', '85']), frozenset(['63', '85']), frozenset(['86', '34']), frozenset(['76', '86']), frozenset(['59', '34']), frozenset(['24', '85']), frozenset(['39', '85']), frozenset(['39', '86']), frozenset(['86', '59']), frozenset(['86', '53']), frozenset(['2', '85']), frozenset(['86', '36']), frozenset(['24', '90']), frozenset(['39', '36']), frozenset(['53', '85']), frozenset(['63', '86']), frozenset(['86', '85']), frozenset(['24', '34']), frozenset(['36', '34']), frozenset(['90', '85']), frozenset(['39', '34']), frozenset(['67', '34']), frozenset(['90', '63']), frozenset(['76', '34']), frozenset(['76', '85']), frozenset(['86', '67']), frozenset(['53', '34']), frozenset(['90', '86']), frozenset(['90', '36']), frozenset(['59', '36']), frozenset(['90', '53']), frozenset(['63', '36']), frozenset(['90', '59']), frozenset(['24', '86']), frozenset(['90', '39']), frozenset(['36', '85']), frozenset(['85', '34']), frozenset(['63', '34']), frozenset(['85', '67']), frozenset(['90', '34']), frozenset(['63', '59'])] item: frozenset(['2', '85'])由于這里的支持度閾值較高,并且采用的是較小的項(xiàng)集來查看特征‘2’,所以得到的項(xiàng)集只有一個(gè)。
通過觀察這些特征,以便知道了解野蘑菇的那些方面。如果看到其中任何一個(gè)特征,那么這些蘑菇就不要吃了。也即是說關(guān)聯(lián)分析就是通過一個(gè)目標(biāo)特征來分析得到和其相關(guān)聯(lián)的其他特征,進(jìn)而可以對(duì)其采取措施。
總結(jié)
以上是生活随笔為你收集整理的Apriori算法进行关联分析(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 型号20X2.30轮胎与20X2.35轮
- 下一篇: 昌河铃木利2014款亚纳a6两厢有空调滤