做小程序好還是做微網(wǎng)站好現(xiàn)代網(wǎng)絡(luò)營銷的方式
??????????歡迎來到我的博客??????????
🐴作者:秋無之地🐴簡介:CSDN爬蟲、后端、大數(shù)據(jù)領(lǐng)域創(chuàng)作者。目前從事python爬蟲、后端和大數(shù)據(jù)等相關(guān)工作,主要擅長領(lǐng)域有:爬蟲、后端、大數(shù)據(jù)開發(fā)、數(shù)據(jù)分析等。
🐴歡迎小伙伴們點(diǎn)贊👍🏻、收藏??、留言💬、關(guān)注🤝,關(guān)注必回關(guān)
上一篇文章已經(jīng)跟大家介紹過《關(guān)聯(lián)規(guī)則挖掘(上):數(shù)據(jù)分析 | 數(shù)據(jù)挖掘 | 十大算法之一》,相信大家對關(guān)聯(lián)規(guī)則挖掘(上)都有一個(gè)基本的認(rèn)識。下面我講一下,關(guān)聯(lián)規(guī)則挖掘(下):數(shù)據(jù)分析 | 數(shù)據(jù)挖掘 | 十大算法之一
今天我來帶你用 Apriori 算法做一個(gè)項(xiàng)目實(shí)戰(zhàn)。你需要掌握的是以下幾點(diǎn):
- 熟悉幾個(gè)重要概念:支持度、置信度和提升度;
- 熟悉與掌握 Apriori 工具包的使用;
- 在實(shí)際問題中,靈活運(yùn)用。包括數(shù)據(jù)集的準(zhǔn)備等。
一、如何使用 Apriori 工具包
Apriori 雖然是十大算法之一,不過在 sklearn 工具包中并沒有它,也沒有 FP-Growth 算法。這里教你個(gè)方法,來選擇 Python 中可以使用的工具包,你可以通過https://pypi.org/搜索工具包。
這個(gè)網(wǎng)站提供的工具包都是 Python 語言的,你能找到 8 個(gè) Python 語言的 Apriori 工具包,具體選擇哪個(gè)呢?建議你使用第二個(gè)工具包,即 efficient-apriori。后面我會講到為什么推薦這個(gè)工具包。
首先你需要通過 pip install efficient-apriori 安裝這個(gè)工具包。
然后看下如何使用它,核心的代碼就是這一行:
itemsets, rules = apriori(data, min_support, min_confidence)
其中 data 是我們要提供的數(shù)據(jù)集,它是一個(gè) list 數(shù)組類型。min_support 參數(shù)為最小支持度,在 efficient-apriori 工具包中用 0 到 1 的數(shù)值代表百分比,比如 0.5 代表最小支持度為 50%。min_confidence 是最小置信度,數(shù)值也代表百分比,比如 1 代表 100%。
關(guān)于支持度、置信度和提升度,我們再來簡單回憶下。
支持度指的是某個(gè)商品組合出現(xiàn)的次數(shù)與總次數(shù)之間的比例。支持度越高,代表這個(gè)組合出現(xiàn)的概率越大。
置信度是一個(gè)條件概念,就是在 A 發(fā)生的情況下,B 發(fā)生的概率是多少。
提升度代表的是“商品 A 的出現(xiàn),對商品 B 的出現(xiàn)概率提升了多少”。
接下來我們用這個(gè)工具包,跑一下上節(jié)課中講到的超市購物的例子。下面是客戶購買的商品列表:
具體實(shí)現(xiàn)的代碼如下:
from efficient_apriori import apriori
# 設(shè)置數(shù)據(jù)集
data = [('牛奶','面包','尿布'),('可樂','面包', '尿布', '啤酒'),('牛奶','尿布', '啤酒', '雞蛋'),('面包', '牛奶', '尿布', '啤酒'),('面包', '牛奶', '尿布', '可樂')]
# 挖掘頻繁項(xiàng)集和頻繁規(guī)則
itemsets, rules = apriori(data, min_support=0.5, min_confidence=1)
print(itemsets)
print(rules)
運(yùn)行結(jié)果:
{1: {('啤酒',): 3, ('尿布',): 5, ('牛奶',): 4, ('面包',): 4}, 2: {('啤酒', '尿布'): 3, ('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3}, 3: {('尿布', '牛奶', '面包'): 3}}
[{啤酒} -> {尿布}, {牛奶} -> {尿布}, {面包} -> {尿布}, {牛奶, 面包} -> {尿布}]
你能從代碼中看出來,data 是個(gè) List 數(shù)組類型,其中每個(gè)值都可以是一個(gè)集合。實(shí)際上你也可以把 data 數(shù)組中的每個(gè)值設(shè)置為 List 數(shù)組類型,比如:
data = [['牛奶','面包','尿布'],['可樂','面包', '尿布', '啤酒'],['牛奶','尿布', '啤酒', '雞蛋'],['面包', '牛奶', '尿布', '啤酒'],['面包', '牛奶', '尿布', '可樂']]
兩者的運(yùn)行結(jié)果是一樣的,efficient-apriori 工具包把每一條數(shù)據(jù)集里的項(xiàng)式都放到了一個(gè)集合中進(jìn)行運(yùn)算,并沒有考慮它們之間的先后順序。因?yàn)閷?shí)際情況下,同一個(gè)購物籃中的物品也不需要考慮購買的先后順序。
而其他的 Apriori 算法可能會因?yàn)榭紤]了先后順序,出現(xiàn)計(jì)算頻繁項(xiàng)集結(jié)果不對的情況。所以這里采用的是 efficient-apriori 這個(gè)工具包。
二、挖掘?qū)а菔侨绾芜x擇演員的
在實(shí)際工作中,數(shù)據(jù)集是需要自己來準(zhǔn)備的,比如今天我們要挖掘?qū)а菔侨绾芜x擇演員的數(shù)據(jù)情況,但是并沒有公開的數(shù)據(jù)集可以直接使用。因此我們需要使用之前講到的 Python 爬蟲進(jìn)行數(shù)據(jù)采集。
不同導(dǎo)演選擇演員的規(guī)則是不同的,因此我們需要先指定導(dǎo)演。數(shù)據(jù)源我們選用豆瓣電影。
先來梳理下采集的工作流程。
首先我們先在https://movie.douban.com搜索框中輸入導(dǎo)演姓名,比如“寧浩”。
頁面會呈現(xiàn)出來導(dǎo)演之前的所有電影,然后對頁面進(jìn)行觀察,你能觀察到以下幾個(gè)現(xiàn)象:
- 頁面默認(rèn)是 15 條數(shù)據(jù)反饋,第一頁會返回 16 條。因?yàn)榈谝粭l數(shù)據(jù)實(shí)際上這個(gè)導(dǎo)演的概覽,你可以理解為是一條廣告的插入,下面才是真正的返回結(jié)果。
- 每條數(shù)據(jù)的最后一行是電影的演出人員的信息,第一個(gè)人員是導(dǎo)演,其余為演員姓名。姓名之間用“/”分割。
有了這些觀察之后,我們就可以編寫抓取程序了。在代碼講解中你能看出這兩點(diǎn)觀察的作用。抓取程序的目的是為了生成寧浩導(dǎo)演(你也可以抓取其他導(dǎo)演)的數(shù)據(jù)集,結(jié)果會保存在 csv 文件中。完整的抓取代碼如下:
# -*- coding: utf-8 -*-
# 下載某個(gè)導(dǎo)演的電影數(shù)據(jù)集
from efficient_apriori import apriori
from lxml import etree
import time
from selenium import webdriver
import csv
driver = webdriver.Chrome()
# 設(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ù)個(gè)數(shù)num = len(movie_lists)if num > 15: #第一頁會有16條數(shù)據(jù)# 默認(rèn)第一個(gè)不是,所以需要去掉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:# 將第一個(gè)字段設(shè)置為電影名稱names[0] = movie.textflags.append(movie.text)csv_write.writerow(names)print('OK') # 代表這頁數(shù)據(jù)下載成功print(num)if num >= 14: #有可能一頁會有14個(gè)電影# 繼續(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')
代碼中涉及到了幾個(gè)模塊,我簡單講解下這幾個(gè)模塊。
在引用包這一段,我們使用 csv 工具包讀寫 CSV 文件,用 efficient_apriori 完成 Apriori 算法,用 lxml 進(jìn)行 XPath 解析,time 工具包可以讓我們在模擬后有個(gè)適當(dāng)停留,代碼中我設(shè)置為 1 秒鐘,等 HTML 數(shù)據(jù)完全返回后再進(jìn)行 HTML 內(nèi)容的獲取。使用 selenium 的 webdriver 來模擬瀏覽器的行為。
在讀寫文件這一塊,我們需要事先告訴 python 的 open 函數(shù),文件的編碼是 utf-8-sig(對應(yīng)代碼:encoding=‘utf-8-sig’),這是因?yàn)槲覀儠玫街形?#xff0c;為了避免編碼混亂。
編寫 download 函數(shù),參數(shù)傳入我們要采集的頁面地址(request_url)。針對返回的 HTML,我們需要用到之前講到的 Chrome 瀏覽器的 XPath Helper 工具,來獲取電影名稱以及演出人員的 XPath。我用頁面返回的數(shù)據(jù)個(gè)數(shù)來判斷當(dāng)前所處的頁面序號。如果數(shù)據(jù)個(gè)數(shù) >15,也就是第一頁,第一頁的第一條數(shù)據(jù)是廣告,我們需要忽略。如果數(shù)據(jù)個(gè)數(shù) =15,代表是中間頁,需要點(diǎn)擊“下一頁”,也就是翻頁。如果數(shù)據(jù)個(gè)數(shù) <15,代表最后一頁,沒有下一頁。
在程序主體部分,我們設(shè)置 start 代表抓取的 ID,從 0 開始最多抓取 1 萬部電影的數(shù)據(jù)(一個(gè)導(dǎo)演不會超過 1 萬部電影),每次翻頁 start 自動(dòng)增加 15,直到 flag=False 為止,也就是不存在下一頁的情況。
你可以模擬下抓取的流程,獲得指定導(dǎo)演的數(shù)據(jù),比如我上面抓取的寧浩的數(shù)據(jù)。這里需要注意的是,豆瓣的電影數(shù)據(jù)可能是不全的,但基本上夠我們用。
有了數(shù)據(jù)之后,我們就可以用 Apriori 算法來挖掘頻繁項(xiàng)集和關(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:])
# 挖掘頻繁項(xiàng)集和關(guān)聯(lián)規(guī)則
itemsets, rules = apriori(data, min_support=0.5, min_confidence=1)
print(itemsets)
print(rules)
代碼中使用的 apriori 方法和開頭中用 Apriori 獲取購物籃規(guī)律的方法類似,比如代碼中都設(shè)定了最小支持度和最小置信系數(shù),這樣我們可以找到支持度大于 50%,置信系數(shù)為 1 的頻繁項(xiàng)集和關(guān)聯(lián)規(guī)則。
這是最后的運(yùn)行結(jié)果:
{1: {('徐崢',): 5, ('黃渤',): 6}, 2: {('徐崢', '黃渤'): 5}}
[{徐崢} -> {黃渤}]
你能看出來,寧浩導(dǎo)演喜歡用徐崢和黃渤,并且有徐崢的情況下,一般都會用黃渤。你也可以用上面的代碼來挖掘下其他導(dǎo)演選擇演員的規(guī)律。
三、總結(jié)
Apriori 算法的核心就是理解頻繁項(xiàng)集和關(guān)聯(lián)規(guī)則。在算法運(yùn)算的過程中,還要重點(diǎn)掌握對支持度、置信度和提升度的理解。在工具使用上,你可以使用 efficient-apriori 這個(gè)工具包,它會把每一條數(shù)據(jù)中的項(xiàng)(item)放到一個(gè)集合(籃子)里來處理,不考慮項(xiàng)(item)之間的先后順序。
在實(shí)際運(yùn)用中你還需要靈活處理,比如導(dǎo)演如何選擇演員這個(gè)案例,雖然工具的使用會很方便,但重要的還是數(shù)據(jù)挖掘前的準(zhǔn)備過程,也就是獲取某個(gè)導(dǎo)演的電影數(shù)據(jù)集。
?
版權(quán)聲明
本文章版權(quán)歸作者所有,未經(jīng)作者允許禁止任何轉(zhuǎn)載、采集,作者保留一切追究的權(quán)利。