Python教程

python-关联规则

本文主要是介绍python-关联规则,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 1. 什么是关联规则
  • 2. 关联规则有什么用
  • 3. 如何运用关联规则
    • 3.1 基本概念
    • 3.2 频繁项集评估标准
    • 3.3 Aprior算法思想
  • 4. Apriori算法应用

1. 什么是关联规则

关联规则,从大量数据中发现事物、特征或者数据之间的,频繁出现的相互依赖关系和关联关系。

X—>Y,XY的关联规则,包括支持度support、信任度confidence和提升度lift。

关联规则最早是为购物篮分析问题所提出,如著名的啤酒与尿布的故事。

2. 关联规则有什么用

发现项集之间的关联和相关关系,通过对数据集进行关联分析可得出形如“由于某些事件的发生而引起另外一些事件的发生”之类的规则。关联分析对商业决策具有重要的价值,如基于用户购买习惯,制定相关推荐产品、套装商品或捆绑商品的销售策略,达到平台整体销量提升

3. 如何运用关联规则

3.1 基本概念

假设某个时间段内存在以下4次交易行为,购买商品如下:

TID Items
001 Cola, Egg, Ham
002 Cola, Diaper, Beer
003 Cola, Diaper, Beer, Ham
004 Diaper, Beer

关联规则中涉及到的基本概念:

名称 说明
事务 每一个交易数据称为一个事务。如上表包含了4个事务
交易的每个商品称为项。如Cola, Beer等
项集 交易商品组成的集合,如{Cola}, {Cola Egg}
K-项集 包含K个商品的集合叫做 K-项集。如{Cola, Beer, Ham}:3-项集
支持度计数 一个商品集合出现在N个交易中,则该商品集合的支持度计数为N。如{Diaper, Beer}出现在交易 002、 003、 004中,其支持度计数为3
支持度 支持度计数 / 总事务数。如 {Diaper, Beer} 支持度为 3/4 = 75%。这说明75%的人同时买了 Diaper 和 Beer。
频繁项集 支持度大于或等于某个阈值的项集就叫做频繁项集。如 阈值设50%时,因为{Diaper, Beer}的支持度是75%,所以它是频繁项集。
置信度 对于{A}->{B},它的置信度为 {A, B}的支持度计数 除以 {A} 的支持度计数。如,规则{Diaper}->{Beer}的置信度为 3/3,即100%,说明买了Diaper的人 100% 也买了 Beer。
强关联规则 大于或等于最小支持度阈值 和 最小置信度阈值 的规则叫做强关联规则。关联分析的最终目标就是要找出强关联规则。

3.2 频繁项集评估标准

频繁项集,顾名思义指频繁出现item项的集合。

如何定义频繁呢?用比例来判定,常用的频繁项集的评估标准有支持度,置信度和提升度三个。

  • 支持度:出现的项集在总事务中的占比。以购买记录为例子,购买记录4条,如果商品Cola和Beer同时出现2条购买记录(即同时购买Cola和Beer的记录有2),那边Cola和Beer这个2项集的支持度为50%。

  • 置信度:购买Cola的情况下,再购买Beer的概率。

  • 提升度:使用规则后商品出现的次数是否高于商品单独出现的概率。

提升度体先了X和Y之间的关联关系, 提升度大于1则X->Y是有效的强关联规则, 提升度小于等于1则X->Y是无效的强关联规则 。一个特殊的情况,如果X和Y独立,则有Lift(X⇐Y)=1,因为此时P(X|Y)=P(X)。

3.3 Aprior算法思想

Apriori算法的目标是找到最大的K项频繁集,一是满足最小支持度的频繁集,二是找到频繁集的最大个数。

Apriori算法采用了迭代的方法:

  • 先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。

  • 然后对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集。

  • 以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。

图中有4个记录,记录项有1,2,3,4,5若干

  • 首先先找出1项集对应的支持度(C1),可以看出4的支持度25%低于最小支持阈值50%,先剪掉,得到(L1)。

  • 从1项集生成2项集,并计算支持度(C2),可以看出(1,5)(1,2)支持度均为25%低于最小支持阈值,先剪掉,得到(L2)

  • 从2项集生成3项集,(1,2,3)(1,2,5)(2,3,5)只有(2,3,5)满足要求,至此无法生成新的频繁项集,算法结束,最终得到3-项频繁集。

由于Apriori算法在每次计算项集的支持度时需要扫描所有数据集,当数据量较大,数据种类较多时,算法的效率是很低的。

4. Apriori算法应用

基于Sebastian Raschka 提供的非常有用的具有Apriori算法的MLxtend库。

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
from mlxtend.preprocessing import TransactionEncoder

df=pd.read_excel(r'C:\Users\Desktop\My_Python\Online Retail.xlsx')
df.head()

####-------------------------------------------
#### 数据清洗
####-------------------------------------------

df['Description'] = df['Description'].str.strip()
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')]
df = df[~(df['Description']=='POSTAGE')]

####-------------------------------------------
#### 对数据进行One-Hot编码
####-------------------------------------------

# 选取France样本数据
basket = pd.DataFrame(df[df['Country'] =="France"].groupby(['InvoiceNo', 'Description'])['Quantity'].sum().reset_index()
                      , columns = ['InvoiceNo', 'Description', 'Quantity'])
df_grouped=basket.groupby('InvoiceNo')['Description'].unique().apply(list).reset_index().set_index(['InvoiceNo'])
# df_grouped

# 将数据格式转换成One-Hot编码要求格式 a list of lists
basket_list = [df_grouped['Description'][i] for i in range(len(df_grouped['Description']))]

te = TransactionEncoder()
df_tf = te.fit_transform(basket_list)
basket_sets_encoder = pd.DataFrame(df_tf,columns=te.columns_)

# 筛选满足大于或等于最小支持度0.07的频繁项集

frequent_itemsets = apriori(basket_sets_encoder, min_support=0.07, use_colnames=True)

frequent_itemsets.sort_values(by='support', ascending=False, inplace=True)
frequent_itemsets

# 选择2项频繁项集

frequent_itemsets['length'] = frequent_itemsets.itemsets.apply(lambda x: len(x))
frequent_itemsets[frequent_itemsets['length'] == 2]


# 计算关联规则

# metric可以有很多的度量选项,返回的表列名都可以作为参数
association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.5)
 
#关联规则可以提升度排序
association_rule.sort_values(by='lift',ascending=False,inplace=True)    
association_rule
# 规则是:antecedents->consequents

参考来源:

Apriori算法原理总结

【转载】Python 关联规则分析

利用Python进行市场购物篮分析——入门篇

这篇关于python-关联规则的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!