實戰:關聯規則挖掘

如何使用 Apriori 工具包

Apriori 雖然是十大算法之一,不過在 sklearn 工具包中並沒有它,也沒有 FP-Growth 算法。。這裏教你個方法,來選擇 Python 中可以使用的工具包,搜索工具包

efficient-apriori 1.0.0找到這個工具包,然後在終端(windows 中叫anaconda prompt)

輸入:pip install efficient-apriori

然後重新進入jupyter 模式;

接下來我們用這個工具包,跑一下超市購物的例子

from efficient_apriori import apriori
# 設置數據集
data = [('牛奶','麪包','尿布'),
           ('可樂','麪包', '尿布', '啤酒'),
           ('牛奶','尿布', '啤酒', '雞蛋'),
           ('麪包', '牛奶', '尿布', '啤酒'),
           ('麪包', '牛奶', '尿布', '可樂')]
# 挖掘頻繁項集和頻繁規則
itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)
print(itemsets)
print(rules)

其中 data 是我們要提供的數據集,它是一個 list 數組類型。min_support 參數爲最小支持度,用小數表示(不要用百分數)

min_confidence 是最小置信度,用小數表示(不要用百分數)

實際上,data 是個 List 數組類型,其中每個值都可以是一個集合。實際上你也可以把 data 數組中的每個值設置爲 List 數組類型,比如:

data = [['牛奶','麪包','尿布'],
           ['可樂','麪包', '尿布', '啤酒'],
           ['牛奶','尿布', '啤酒', '雞蛋'],
           ['麪包', '牛奶', '尿布', '啤酒'],
           ['麪包', '牛奶', '尿布', '可樂']]

efficient-apriori 工具包把每一條數據集裏的項式都放到了一個集合中進行運算,並沒有考慮它們之間的先後順序。因爲實際情況下,同一個購物籃中的物品也不需要考慮購買的先後順序。

而其他的 Apriori 算法可能會因爲考慮了先後順序,出現計算頻繁項集結果不對的情況。所以,建議使用efficient-apriori工具包。

 

挖掘導演是如何選擇演員的

由於沒有公開的數據集可以使用,我們需要使用 Python 爬蟲進行數據採集。

同導演選擇演員的規則是不同的,因此我們需要先指定導演。數據源我們選用豆瓣電影。

我們先在豆瓣電影上輸入“甯浩”,然後:

頁面會呈現出來導演之前的所有電影,然後對頁面進行觀察,你能觀察到以下幾個現象:

1、頁面默認是 15 條數據反饋,第一頁會返回 16 條。其中第一條是導演簡要介紹,可以將其理解爲廣告,接下來的內容纔是我們要爬取的重點。

2、每條數據的最後一行是電影的演出人員的信息,第一個人員是導演,其餘爲演員姓名。姓名之間用“/”分割。

抓取程序的目的是爲了生成甯浩導演(你也可以抓取其他導演)的數據集,結果會保存在 csv 文件中。完整的抓取代碼如下:

# -*- coding: utf-8 -*-
# 下載某個導演的電影數據集
from efficient_apriori import apriori
from lxml import etree
import time
from selenium import webdriver
import csv
driver = webdriver.Edge()
# 設置想要下載的導演 數據集
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=[]
# 下載指定頁面的數據
def download(request_url):
	driver.get(request_url)
	time.sleep(1)
	html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
	html = etree.HTML(html)
	# 設置電影名稱,導演演員 的 XPATH
	movie_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']")
	# 獲取返回的數據個數
	num = len(movie_lists)
	if num > 15: # 第一頁會有 16 條數據
		# 默認第一個不是,所以需要去掉
		movie_lists = movie_lists[1:]
		name_lists = name_lists[1:]
	for (movie, name_list) in zip(movie_lists, name_lists):
		# 會存在數據爲空的情況
		if name_list.text is None: 
			continue
		# 顯示下演員名稱
		print(name_list.text)
		names = name_list.text.split('/')
		# 判斷導演是否爲指定的 director
		if names[0].strip() == director and movie.text not in flags:
			# 將第一個字段設置爲電影名稱
			names[0] = movie.text
			flags.append(movie.text)
			csv_write.writerow(names)
	print('OK') # 代表這頁數據下載成功
	print(num)
	if num >= 14: # 有可能一頁會有 14 個電影
		# 繼續下一頁
		return True
	else:
		# 沒有下一頁
		return False

# 開始的 ID 爲 0,每頁增加 15
start = 0
while start<10000: # 最多抽取 1 萬部電影
	request_url = base_url + str(start)
	# 下載數據,並返回是否有下一頁
	flag = download(request_url)
	if flag:
		start = start + 15
	else:
		break
out.close()
print('finished')

csv文件結果如下:

提示:運行上述代碼,你已經打開的Edge會被重啓!(如果你沒用固然好,要是你用了,那麼要對寫的文檔做好在線保存!否則會被強行中斷!!!)

有了數據之後,我們就可以用 Apriori 算法來挖掘頻繁項集和關聯規則,代碼如下

# -*- 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'))
# 數據加載
data = []
for names in lists:
     name_new = []
     for name in names:
           # 去掉演員數據中的空格
           name_new.append(name.strip())
     data.append(name_new[1:])
# 挖掘頻繁項集和關聯規則
itemsets, rules = apriori(data, min_support=0.5,  min_confidence=1)
print(itemsets)
print(rules)

 

代碼中都設定了最小支持度和最小置信係數,這樣我們可以找到支持度大於 50%,置信係數爲 1 的頻繁項集和關聯規則。

運行結果:

{1: {('徐崢',): 5, ('黃渤',): 6}, 2: {('徐崢', '黃渤'): 5}}
[{徐崢} -> {黃渤}]

你能看出來,甯浩導演喜歡用徐崢和黃渤,並且有徐崢的情況下,一般都會用黃渤。你也可以用上面的代碼來挖掘下其他導演選擇演員的規律。

 

總結

實戰最主要的是爬取數據,尤其是環境的搭建和最後編碼部分。

算法有現成的包efficient-apriori 美 ['eɪprɪ'ɔrɪ]可以使用

 Apriori 算法中的最小支持度和最小置信度,一般設置爲多少比較合理?

首先,這兩個值與數據集大小特徵相關。一般來說最小支持度常見的取值有0.5,0.1, 0.05。最小置信度常見的取值有1.0, 0.9, 0.8。可以通過嘗試一些取值,然後觀察關聯結果的方式來調整最小值尺度和最小置信度的取值。

 

參考文獻:

chome瀏覽器驅動與對應版本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

是由於瀏覽器驅動與瀏覽器版本不一致造成的!(值得一提的是chrome沒有找到官方win64的webdriver,所以chome在w64上用不了)

建議:如果你是linux,mac操作系統,那麼按照上面的參考文獻,就可以完美完成安裝。如果你是window電腦,建議使用自帶的Edge瀏覽器,然後你可以在這個官網下載webdriver(注意與Edge版本匹配)。最後,將下載的webdriver文件複製到python安裝目錄下(Anaconda放在Anaconda的安裝目錄下!!!)

selenium初探:WebDriverException解決方法探索(以Chrome瀏覽器|IE瀏覽器|Edge瀏覽器爲例)

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章