本文不涉及关联分析算法的计算原理,只注重代码实现。

最近公司分了个任务,要求写一篇面向python初学者的关联分析演习材料。遇到这种情况,我的解决办法当然是优先使用已有模块,然后写一篇模块使用方法指南,最后10行以内的代码搞定啦。

出于习惯,我先用中文搜了一下,发现大部分人都是直接自己上手编写,很简单,毕竟也就4个步骤:导入数据,并将数据预处理

计算频繁项集

根据各个频繁项集,分别计算支持度和置信度

根据提供的最小支持度和最小置信度,输出满足要求的关联规则

代码写起来确实很简单,但是我的目标客户可是python初学者(甲方爸爸们),要求他们动手编程显然是不实际的。

中文输入搜索时,基本没有找到直接使用已有模块的样例。这么古老的算法,不应该呀!于是切换到英文输入~找到啦~

apyori模块提供了apriori算法:apyori: Simple Apriori algorithm Implementation.pypi.org

使用pip即可立即安装。

(虽然官网说只支持Python 2.7 和 3.3 - 3.5,但我的python是3.6版,目测完全没有问题)

pip install apyori

安装好后,使用import即可调用。

from apyori import apriori

apriori算法一行搞定~

附python源代码:

# -*- coding: utf-8 -*-
import pandas as pd
header = ['user_id', 'item_id', 'rating', 'timestamp']
df = pd.read_csv('../data/ml-1m/ratings.dat', sep='::', names=header,engine='python')
# 考虑到执行时间,只选取前10000行作为输入数据
df = df.iloc[:10000]
# 用户种类
users = df['user_id'].unique()
# 电影种类
items = df['item_id'].unique()
# 用户种类数
users_num = users.shape[0]
# 电影种类数
items_num = items.shape[0]
print('用户种类数: ' + str(users_num) + ' \n电影种类数: ' + str(items_num))
# 输入数据格式转换
# apyori.apriori模块要求输入数据的格式为list的list
# 例如:[[itemA, itemB], [itemA, itemC], [itemD, itemE]]
from functools import partial
def items_to_list(data, user_id):
item_list = data.loc[data['user_id']==user_id]['item_id'].tolist()
return item_list
func = partial(items_to_list, df)
item_list_list = list(map(func, users))
# 使用apyori.apriori模块
from apyori import apriori
associations = apriori(item_list_list, min_support = 0.2, min_confidence = 1.0, min_lift = 4)
rule = list(associations)
# 查看规则
itemA = list(rule[0][2][0][0])
itemB = list(rule[0][2][0][1])
print(f'关联规则: \n\t观看 电影{itemA} 的人会观看 电影{itemB}')
print(f'评估结果:\n\tSupport: {rule[0][1]:.3}\n\tConfidence: {rule[0][2][0][2]:.3}\n\tLift : {rule[0][2][0][3]:.3}')
itemC = list(rule[1][2][0][0])
itemD = list(rule[1][2][0][1])
print(f'\n关联规则: \n\t观看 电影{itemC} 的人会观看 电影{itemD}')
print(f'评估结果:\n\tSupport: {rule[1][1]:.3}\n\tConfidence: {rule[1][2][0][2]:.3}\n\tLift : {rule[1][2][0][3]:.3}')

后记:

被前辈指出这个apyori模块的star数和contributor数比较少,而且文档也不是很全面,最近更新为2018年3月,比较久远。

建议使用mlxtend模块:star数和contributor数远多于apyori模块,文档总结很全面,而且指标中不止支持度、置信度、lift值,还增加了leverage和conviction。

安装也很简单,pip直接安装:

pip install mlxtend

或使用anaconda:

conda install mlxtend --channel conda-forge

代码块待更新~