在1994年首次提出的一种关联规则挖掘算法,它可以在特定类型的数据中找到关系,并将其表示为规则。关联规则挖掘最常用于营销,特别是在购物车的上下文中。这个应用领域被正式称为“购物车分析”。

我们这里假设学校建立了一个在线学习的网站,通过学生将课程添加到课程列表(虚拟购物车)来评估不同的课程。我们最后生成了一个文件,每一行都包含一个学生考虑同时参加的课程的列表。例如,如果一个学生考虑在 2020 年秋季参加经济学 101 和生物学 100,我们的 csv 文件中会有一行如下所示:

 ECON_101, BIOL_100

从最广泛的角度来说,apriori算法通过产品的组合,计算关于产品之间关系强度的一些度量(支持度、置信度、提升度),并将这些关系表示为规则。

Apriori algorithm

与其他一些机器学习算法相比,apriori的结果似乎非常简单,但它的优点是可以很容易地理解输出结果。如果这种通用方法对Amazon来说足够好,那么对我来说也足够好。

在开始之前我们先看看一些需要掌握的关键词:

Itemsets:这个单词翻译为项集,其实我觉得产品组合更好,因为它是再购物车中同时购买的产品的集合。在本文中中,它是学生在同一学期考虑参加的课程列表,因为我们上面说了课程的选择可以理解为“购物车”。项集的另一个示例是一般商铺中购物车同时购买的产品,例如“面包、鸡蛋、尿布”。

  • Antecedent:itemset中的第一个产品,可以成为前件
  • Consequent:itemset中的第二个产品,可以成为后件
  • Rule:antecedent → consequent 的关系

也就是说我们的要在这个Itemsets中找到Antecedent和Consequent的关系规则rule。

用上面的例子,我们知道经济学101和生物学100是联系在一起的,因为一个学生想同时修这两门课。但是他们的关系是随机的还是经常出现呢?我们将用三种方法来回答这个问题。

1、支持度 Support

支持度告诉我们一个给定项目被选择的频率。在我们的例子中,它告诉我们一个类的绝对受欢迎程度。

给定类A和提供~A(不是A)的其他类,支持度的计算为:

在我们的例子中,假设30个不同的学生考虑经济学101,而所有学生考虑1000个其他课程,包括那些想要学习经济学101的学生。那么我们的支持度就是:

Support= 30/1000 = 0.03

支持度越高,项目就越有可能出现在给定的项目集中。

2、置信度 Confidence

置信度是两个产品在同一个项集中的可能性。在我们的例子中,如果我们考虑经济学101,那么我们可能也会考虑生物学100。所以,给定类A和类B:

换句话说,它是生物学100和经济学101在同一购物车中的可能性除以经济学101在任意购物车中的次数。

如果置信度= 1,只要经济101出现了那么生物100必出现。如果置信度= 0.75,那么经济学101出现了有75%可能生物100出现。

3、提升度 Lift

提升度为我们提供了两个产品之间关系的最佳例证。对于A类和B类,

提升度有三种情况:

1,那么一个学生很可能在上经济学101的同时上生物100。(该学生将选B课,因为他们正在选a课)举个例子,如果lift = 3.33,那么一个学生在同一学期选修经济学101和生物100的概率是选修经济学101而不选修生物100的概率的3.33倍。

< 1,那么这个学生不太可能同时修生物100和经济学101。(该学生不会选B课,因为他们选的是a课)

= 1,则两项之间没有关系。

了解了上面的3个度量,我将用文字来解释算法的基本细节,然后在最后给出一些伪代码来总结它。在apriori的所有实现中,都需要为算法提供一个最小支持度值,min_sup。

首先,apriori算法找出所有支持度在最小支持度或最小支持度以上的条目。如果min_sup = 0.01,那么算法只会为至少出现在1/100个项集生成规则。

然后,apriori查找所有频繁出现的包含2个项集(支持度大于或等于min_sup)。然后是3个,然后是4个,以此类推,直到算法遍历完所有的第一步找到项集项。在这里每一步中,它会清除虽然出现了但不太频繁的项目,这样可以消除虚假关系。

最后,apriori从支持度大于最小阈值的项集中选取所有规则,计算并报告支持度、置信度和提升度。

算法的计算成本很高,因为它会多次检查相同的数据。大O是2^|D|,其中|D|是所有项集中出现的产品的总数,并且它很容易受到虚假关联的影响。但是关联规则不受因变量个数的限制,能够在大型数据库中发现数据之间的关联关系,所以其应用非常广泛,但是他是否可以应用于所有系统呢?Apriori并不是适用于所有类型的数据集。

Apriori algorithm为什么不适用于某些产品

下面我们使用一个电子商务平台的事件数据【查看,添加到购物车,购买】,包括所有的电子品牌。其目的是确定影响购买几种产品的不常见规则。由于三星和苹果总共占了57%的数据,我们只关注这两个品牌的购买情况。

数据集为:

  • Market Basket Analysis Data | Kaggle
  • eCommerce behavior data from multi-category store | Kaggle

“transaction 交易”指的是购买一个或多个物品。每个“交易”都有一个惟一的用户会话ID。

“purchase 购买”指的是只购买该物品的一个数量。多个“购买”可以有一个普通的用户会话ID。

在删除“查看”和“添加到购物车”记录后,我们假设数据集中的每一行都与购买该商品的一个数量有关。这些个人购买按用户会话 ID 分组,从而产生不同的交易。

我们在 python 上使用 Apriori 算法分别为苹果和三星进行购物车分析。由于许多单独的项目交易,我们不得不将指标阈值降低到小数点后几位。

 from mlxtend.frequent_patterns import apriorifrom mlxtend.frequent_patterns import association_rulesdef hot_encode(x):if(x<= 0):return 0if(x> 0):return 1def RuleMiner(dataframe, min_support_popular_set=0.001,min_support_rules=0.001, metric='lift'):"""Function to get rules based on the support threshold and metric. dataframe: Dataframe which contains the transactions in the specified schema.min_support_set: The threshold for filtering the frequent item sets having more support value than threshold.min_support_rules: The threshold for filtering the rules having metric value more than thresholdmetric: lift, support, confidence"""df=dataframemsPS = min_support_popular_setmsAR = min_support_rulesmetric=metricprod_counts = df.groupby(by='user_session')[['productType']].count()df_prod_count_combined = pd.merge(df,prod_counts, on='user_session')df_prod_count_combined.rename(columns = {'productType_x':'productType'}, inplace = True)df_prod_count_combined.rename(columns = {'productType_y':'quantity'}, inplace = True)basket = df_prod_count_combined.groupby(['user_session','productType'])['quantity'].sum().unstack().reset_index().fillna(0).set_index('user_session')basket_model = basket.applymap(hot_encode)popular_sets = apriori(basket_model, min_support=msPS, use_colnames=True, verbose = 1)popular_sets['length'] = popular_sets['itemsets'].apply(lambda x: len(x))rules = association_rules(popular_sets, metric=metric, min_threshold = msAR)rules = rules.sort_values(['lift'], ascending =[False])#rules = rules.sort_values(['confidence', 'lift'], ascending =[False, False])return rulesRuleMiner(sam_df,min_support_popular_set=0.0005,min_support_rules=0.0005)

 RuleMiner(sam_df,min_support_popular_set=0.00005,min_support_rules=0.0005, metric='confidence')

可以看到的支持度都非常低,我们找不到任何两个给定项目之间的任何重要关联规则。为了验证我们的方法是否正确,我们在第二个数据集上运行了相同的代码。

我们发现如果先购买“莳萝”,购买“鸡蛋”的置信度为 0.39。同时,如果先购买“鸡蛋”,则购买“莳萝”的可能性约为 0.41。

 warnings.filterwarnings('ignore')popular_sets = apriori(df2, min_support=0.1, use_colnames=True, verbose = 1)popular_sets['length'] = popular_sets['itemsets'].apply(lambda x: len(x))rules = association_rules(popular_sets, metric='confidence', min_threshold = 0.001)rules = rules.sort_values(['lift'], ascending =[False])rules

置信度并不总是一种确定购买物品 B 的机会是否取决于购买物品 A 的衡量标准。如果任何两个给定物品的提升度相同,则物品的顺序购买不应该不同。

我们返回到第一个数据集,并删除所有单品的交易,并且这次加入了所有品牌的交易,而不仅仅是苹果或三星。

返回了大量提升值和显着置信度值的规则。对于具有各种项集的许多不同规则,支持度为 0.000205(仅供参考,所有规则中的最高支持值)。可以看到这些项集只是相同购买的不同组合但是代表相同的交易。在总共 58435 个交易中,支持度 都为0.000205 ,因此这些项目之间无法建立显着的关联规则。

这是为什么呢?

Apriori算法不适用于所有类型的数据集,它适用于产品很多,并且有很大可能同时购买多种产品的地方,例如,在杂货店或运动器材商店或百货商店等。而电子产品的品类不多,并且非常昂贵,所以很少有交易频繁地同时购买多种产品。在这种情况下,Apriori对于寻找有意义的关联规则是没有用的。

另外就是即使在适用Apriori的地方,考虑的最重要指标也应该是支持度,因为高的支持度表明给定产品组合的交易数量较多。并且如果提升值大于1,可以得出关联规则是显著的,才可以进一步探索,以获得更大的收益。

https://avoid.overfit.cn/post/f66cce1955084805a03961651fa25463

关联规则算法Apriori algorithm详解以及为什么它不适用于所有的推荐系统相关推荐

  1. 关联规则java apriori_关联规则算法(The Apriori algorithm)详解

    一.前言 在学习The Apriori algorithm算法时,参考了多篇博客和一篇论文,尽管这些都是很优秀的文章,但是并没有一篇文章详解了算法的整个流程,故整理多篇文章,并加入自己的一些注解,有了 ...

  2. 抖音推荐算法原理全文详解

    阅读目录 一.系统概览 二.内容分析 三.用户标签 四.评估分析 五.内容安全 抖音推荐算法原理全文详解 本次分享将主要介绍今日头条推荐系统概览以及内容分析.用户标签.评估分析,内容安全等原理. 回到 ...

  3. c语言实现sha1算法注解,【密码学】SHA1算法实现及详解

    1 SHA1算法简介 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digit ...

  4. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  5. DL之AlexNet:AlexNet算法的架构详解、损失函数、网络训练和学习之详细攻略

    DL之AlexNet:AlexNet算法的架构详解.损失函数.网络训练和学习之详细攻略 相关文章 Dataset:数据集集合(CV方向数据集)--常见的计算机视觉图像数据集大集合(建议收藏,持续更新) ...

  6. DL之ShuffleNet:ShuffleNet算法的架构详解

    DL之ShuffleNet:ShuffleNet算法的架构详解 相关文章 DL之ShuffleNet:ShuffleNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Shuf ...

  7. DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)

    DL之MobileNet V2:MobileNetV2算法的架构详解 相关文章 DL之MobileNetV2:MobileNetV2算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL ...

  8. DL之SqueezeNet:SqueezeNet算法的架构详解

    DL之SqueezeNet:SqueezeNet算法的架构详解 相关文章 DL之SqueezeNet:SqueezeNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Sque ...

  9. ​​​​​​​DL之ResNeXt:ResNeXt算法的架构详解

    DL之ResNeXt:ResNeXt算法的架构详解 相关文章 DL之ResNeXt:ResNeXt算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之ResNeXt:ResNeXt算 ...

最新文章

  1. 软件工程实训有必要吗_人工智能专业值得读吗?就业如何?
  2. 2020-09-05
  3. c++ 数组指针形参,并返回数据
  4. 复盘二进制的习题(1)
  5. linux找数组规矩,linux shell 数组建立及使用技巧(示例代码)
  6. Leetcode每日一题:70.climbing-stairs(爬楼梯)
  7. 电脑可以同时装python2和3吗_在同一台电脑上同时安装Python2和Python3-Go语言中文社区...
  8. pb 判断sql 是否合法_宜信技术|《SQL优化最佳实践》作者带你重新了解SQL
  9. 用计算机和电视机组成家庭影院,请问家庭影院的音响能接在电脑上用么?我的电脑没有配置音响能用家庭 爱问知识人...
  10. 经纬度坐标转换的方法
  11. @Transaction注解及失效详解
  12. 亚商投资顾问 早餐FM/0913
  13. about-page
  14. laravel-集合对象的销毁forget,重组values(),pluck ()方法
  15. 无需电脑的多平台推流编码器
  16. Tkinter 8.5 参考手册: a GUI for Python (五)8(鼠标)指针
  17. 网络流——最大流和最小割
  18. 行人重识别的代码复现
  19. win10增加美式键盘
  20. matlab中mat文件的生成和读取

热门文章

  1. 百度SEO站群Ekommart英文版主题-电子商务主题(WordPress响应式)
  2. 2020年计算机专业最好的笔记本电脑,性价比最高的笔记本电脑推荐 2021年最值得入手的笔记本电脑...
  3. [ LeetCode ] #17. Letter Combinations of a Phone Number(电话按键组合字符 C++ Python)
  4. CycleGAN训练自己的数据集
  5. 【课程设计|MFC】人民币大小写转换(含课程报告+源码)
  6. 【Alpha版本】冲刺阶段——Day 5
  7. phpstorm 插件
  8. 伯克利分校研究生计算机排名及申请,加州大学伯克利分校研究生计算机专业排名及申请要求一览...
  9. arduino 步进电机驱动库_Arduino第三方库_步进电机控制
  10. linux② 常用命令 , python3, django安装