实战:关联规则挖掘
如何使用 Apriori 工具包
Apriori 雖然是十大算法之一,不過在 sklearn 工具包中并沒有它,也沒有 FP-Growth 算法。。這里教你個方法,來選擇 Python 中可以使用的工具包,搜索工具包。
efficient-apriori 1.0.0找到這個工具包,然后在終端(windows 中叫anaconda prompt)
輸入:pip install efficient-apriori
然后重新進(jìn)入jupyter 模式;
接下來我們用這個工具包,跑一下超市購物的例子
from efficient_apriori import apriori # 設(shè)置數(shù)據(jù)集 data = [('牛奶','面包','尿布'),('可樂','面包', '尿布', '啤酒'),('牛奶','尿布', '啤酒', '雞蛋'),('面包', '牛奶', '尿布', '啤酒'),('面包', '牛奶', '尿布', '可樂')] # 挖掘頻繁項集和頻繁規(guī)則 itemsets, rules = apriori(data, min_support=0.5, min_confidence=1) print(itemsets) print(rules)其中 data 是我們要提供的數(shù)據(jù)集,它是一個 list 數(shù)組類型。min_support 參數(shù)為最小支持度,用小數(shù)表示(不要用百分?jǐn)?shù))
min_confidence 是最小置信度,用小數(shù)表示(不要用百分?jǐn)?shù))
實際上,data 是個 List 數(shù)組類型,其中每個值都可以是一個集合。實際上你也可以把 data 數(shù)組中的每個值設(shè)置為 List 數(shù)組類型,比如:
data = [['牛奶','面包','尿布'],['可樂','面包', '尿布', '啤酒'],['牛奶','尿布', '啤酒', '雞蛋'],['面包', '牛奶', '尿布', '啤酒'],['面包', '牛奶', '尿布', '可樂']]efficient-apriori 工具包把每一條數(shù)據(jù)集里的項式都放到了一個集合中進(jìn)行運算,并沒有考慮它們之間的先后順序。因為實際情況下,同一個購物籃中的物品也不需要考慮購買的先后順序。
而其他的 Apriori 算法可能會因為考慮了先后順序,出現(xiàn)計算頻繁項集結(jié)果不對的情況。所以,建議使用efficient-apriori工具包。
?
挖掘?qū)а菔侨绾芜x擇演員的
由于沒有公開的數(shù)據(jù)集可以使用,我們需要使用 Python 爬蟲進(jìn)行數(shù)據(jù)采集。
同導(dǎo)演選擇演員的規(guī)則是不同的,因此我們需要先指定導(dǎo)演。數(shù)據(jù)源我們選用豆瓣電影。
我們先在豆瓣電影上輸入“寧浩”,然后:
頁面會呈現(xiàn)出來導(dǎo)演之前的所有電影,然后對頁面進(jìn)行觀察,你能觀察到以下幾個現(xiàn)象:
1、頁面默認(rèn)是 15 條數(shù)據(jù)反饋,第一頁會返回 16 條。其中第一條是導(dǎo)演簡要介紹,可以將其理解為廣告,接下來的內(nèi)容才是我們要爬取的重點。
2、每條數(shù)據(jù)的最后一行是電影的演出人員的信息,第一個人員是導(dǎo)演,其余為演員姓名。姓名之間用“/”分割。
抓取程序的目的是為了生成寧浩導(dǎo)演(你也可以抓取其他導(dǎo)演)的數(shù)據(jù)集,結(jié)果會保存在 csv 文件中。完整的抓取代碼如下:
# -*- coding: utf-8 -*- # 下載某個導(dǎo)演的電影數(shù)據(jù)集 from efficient_apriori import apriori from lxml import etree import time from selenium import webdriver import csv driver = webdriver.Edge() # 設(shè)置想要下載的導(dǎo)演 數(shù)據(jù)集 director = u'寧浩' # 寫 CSV 文件 file_name = './' + director + '.csv' base_url = 'https://movie.douban.com/subject_search?search_text='+director+'&cat=1002&start=' out = open(file_name,'w', newline='', encoding='utf-8-sig') csv_write = csv.writer(out, dialect='excel') flags=[] # 下載指定頁面的數(shù)據(jù) def download(request_url):driver.get(request_url)time.sleep(1)html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")html = etree.HTML(html)# 設(shè)置電影名稱,導(dǎo)演演員 的 XPATHmovie_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']")name_lists = html.xpath("/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='meta abstract_2']")# 獲取返回的數(shù)據(jù)個數(shù)num = len(movie_lists)if num > 15: # 第一頁會有 16 條數(shù)據(jù)# 默認(rèn)第一個不是,所以需要去掉movie_lists = movie_lists[1:]name_lists = name_lists[1:]for (movie, name_list) in zip(movie_lists, name_lists):# 會存在數(shù)據(jù)為空的情況if name_list.text is None: continue# 顯示下演員名稱print(name_list.text)names = name_list.text.split('/')# 判斷導(dǎo)演是否為指定的 directorif names[0].strip() == director and movie.text not in flags:# 將第一個字段設(shè)置為電影名稱names[0] = movie.textflags.append(movie.text)csv_write.writerow(names)print('OK') # 代表這頁數(shù)據(jù)下載成功print(num)if num >= 14: # 有可能一頁會有 14 個電影# 繼續(xù)下一頁return Trueelse:# 沒有下一頁return False# 開始的 ID 為 0,每頁增加 15 start = 0 while start<10000: # 最多抽取 1 萬部電影request_url = base_url + str(start)# 下載數(shù)據(jù),并返回是否有下一頁flag = download(request_url)if flag:start = start + 15else:break out.close() print('finished')csv文件結(jié)果如下:
提示:運行上述代碼,你已經(jīng)打開的Edge會被重啟!(如果你沒用固然好,要是你用了,那么要對寫的文檔做好在線保存!否則會被強行中斷!!!)
有了數(shù)據(jù)之后,我們就可以用 Apriori 算法來挖掘頻繁項集和關(guān)聯(lián)規(guī)則,代碼如下
# -*- coding: utf-8 -*- from efficient_apriori import apriori import csv director = u'寧浩' file_name = './'+director+'.csv' lists = csv.reader(open(file_name, 'r', encoding='utf-8-sig')) # 數(shù)據(jù)加載 data = [] for names in lists:name_new = []for name in names:# 去掉演員數(shù)據(jù)中的空格name_new.append(name.strip())data.append(name_new[1:]) # 挖掘頻繁項集和關(guān)聯(lián)規(guī)則 itemsets, rules = apriori(data, min_support=0.5, min_confidence=1) print(itemsets) print(rules)?
代碼中都設(shè)定了最小支持度和最小置信系數(shù),這樣我們可以找到支持度大于 50%,置信系數(shù)為 1 的頻繁項集和關(guān)聯(lián)規(guī)則。
運行結(jié)果:
{1: {('徐崢',): 5, ('黃渤',): 6}, 2: {('徐崢', '黃渤'): 5}}
[{徐崢} -> {黃渤}]
你能看出來,寧浩導(dǎo)演喜歡用徐崢和黃渤,并且有徐崢的情況下,一般都會用黃渤。你也可以用上面的代碼來挖掘下其他導(dǎo)演選擇演員的規(guī)律。
?
總結(jié)
實戰(zhàn)最主要的是爬取數(shù)據(jù),尤其是環(huán)境的搭建和最后編碼部分。
算法有現(xiàn)成的包efficient-apriori 美 ['e?pr?'?r?]可以使用
?Apriori 算法中的最小支持度和最小置信度,一般設(shè)置為多少比較合理?
首先,這兩個值與數(shù)據(jù)集大小特征相關(guān)。一般來說最小支持度常見的取值有0.5,0.1, 0.05。最小置信度常見的取值有1.0, 0.9, 0.8。可以通過嘗試一些取值,然后觀察關(guān)聯(lián)結(jié)果的方式來調(diào)整最小值尺度和最小置信度的取值。
?
參考文獻(xiàn):
chome瀏覽器驅(qū)動與對應(yīng)版本https://blog.csdn.net/cz9025/article/details/70160273
chome瀏覽器漢化下載地址:https://www.wlrjy.com/Soft/156406.html
selenium模擬瀏覽器+chrome+windows:https://blog.csdn.net/qq_38788128/article/details/80525695
是由于瀏覽器驅(qū)動與瀏覽器版本不一致造成的!(值得一提的是chrome沒有找到官方win64的webdriver,所以chome在w64上用不了)
建議:如果你是linux,mac操作系統(tǒng),那么按照上面的參考文獻(xiàn),就可以完美完成安裝。如果你是window電腦,建議使用自帶的Edge瀏覽器,然后你可以在這個官網(wǎng)下載webdriver(注意與Edge版本匹配)。最后,將下載的webdriver文件復(fù)制到python安裝目錄下(Anaconda放在Anaconda的安裝目錄下!!!)
selenium初探:WebDriverException解決方法探索(以Chrome瀏覽器|IE瀏覽器|Edge瀏覽器為例)
?
?
?
?
總結(jié)
- 上一篇: knn实战:如何对手写数字进行识别?
- 下一篇: 朴素贝叶斯分类实战:对文档进行分类