实战:关联规则挖掘

如何使用 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浏览器为例)

 

 

 

 

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