关联规则挖掘就是从大量的数据中挖掘出有价值描述数据项之间相互联系
的有关知识。
关联规则挖掘
挖掘关联规则(知识)就是从给定的数据集中搜索数据项(items
)之间所存在的有价值联系。
基本概念:
项集itemset:
一个数据项的集合
K−项集:
一个包含 K 个数据项的项集就称为K−项集
支持度:
一个项集的出现频度就是整个交易数据集 中包含该项集的交易记录数
置信度:
繁项集:
若一个项集的出现频度大于最小支持度阈值乘以交易记录集 中记录数,那么就称该项集满足最小支持度阈值;而满足最小支持度阈值所对应的交易记录数就称为最小支持频度。满足最小支持阈值的项集就称为频繁项集。
挖掘关联规则主要包含以下二个步骤:
步骤一:
发现所有的频繁项集,根据定义,这些项集的频度至少应等于(预 先设置的)最小支持频度;
步骤二:
根据所获得的频繁项集,产生相应的强关联规则。根据定义这些规
则必须满足最小信任度阈值。
关联规则挖掘分类
1.根据关联规则所处理的具体值来进行分类划分
-
若一个规则仅描述数据项是否在出现这种情况间的联系,那这种关联规则就
是一个布尔关联规则,如:
-
若一个规则描述的是定量数据项(或属性)之间的关系,那它就是一个定量
关联规则。如:
-
根据规则描述内容所涉及的抽象层次来进行分类划分
-
根据关联规则所涉及的关联特性来进行分类划分
单维布尔关联规则挖掘
Apriori算法
思想:
一个频繁项集中任一子集也是频繁项集
具体操作过程:
关联规则生成
计算关联规则的信任度
apriori实践
数据:
excel列:
djbh单据编号
spid商品id
思路:同次购买的商品单据编号相同,通过获取每次购买的商品列表利用mxltend包apriror计算频繁项和关联规则
参考:
Apriori算法l
mxltend使用方法
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
import json
from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import apriori as ap
def ***()
data = pd.read_excl('***.xlsx')
items_list = []
for k,v in dict(data['djbh'].value_counts()).items():
items_list.append(list(data[data['djbh']==k]['spid'].values))
te = TransactionEncoder()
te_ary = te.fit(items_list).transform(items_list)
df = pd.DataFrame(te_ary, columns=te.columns_)
frequent_itemsets = ap(df, min_support=0.005, use_colnames=True)
frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)
#关联规则
association_rule = association_rules(frequent_itemsets, metric='confidence',
min_threshold=0.7)
# metric可以有很多的度量选项,返回的表列名都可以作为参数
association_rule.sort_values(by='leverage', ascending=False, inplace=True)
#提升度(Lift):提升度指当销售一个物品时,另一个物品销售率会增加多少
result_list =list(map(lambda x :x[0]+x[1] ,zip([list(x) for x in association_rule['antecedents']],[list(x) for x in association_rule['consequents']])))
#存储频繁项
save_list = []#去除重复频繁项集合
def save_file(fname='频繁项.txt'):
for ip in result_list:
ip.sort()
if ip not in save_list:
save_list.append(ip)
sored_save_list = sorted(save_list, key=lambda item: item[1], reverse=True)
fileObject = open(fname, 'a+', encoding='UTF-8')
json.dump({wldwid:sored_save_list},fileObject,ensure_ascii=False)
save_file()
pfgrowth原理
FP-growth 算法是一种用于发现数据集中频繁模式的有效方法,利用Apriori 原理,只对数据集扫描两次,运行更快。在算法中,数据集存储在 FP 树中,构建完树后,通过查找元素项的条件基及构建条件 FP 树来发现频繁项集。重复进行直到FP树只包含一个元素为止。执行速度要快于Apriori,通常性能要好两个数量级以上.
对比Apriori:
- 减少扫描数据库的次数
- 减少候选项集的数量
- 简化候选项集的支持度计算
算法原理可参考:pfgrowth原理和实践(python2 fpGrowth)
pfgrowth实践
import pyfpgrowth
def get_itemsets_fp_growth(items_list):
# 调包演示
patterns = pyfpgrowth.find_frequent_patterns(items_list, 2) # 频数删选 频数大于N
rules = pyfpgrowth.generate_association_rules(patterns, 0.8) #{(left): ((right), confidence)} 置信度(条件概率)删选
rules_list = list( map(lambda x: x[0] + x[1], zip([list(x) for x in list(rules.keys())],[list(x[0]) for x in list(rules.values())])))
return rules_list