(给算法爱好者加星标,修炼编程内功)
在美国有这样一家奇怪的超市,它将啤酒与尿布这样两个奇怪的东西放在一起进行销售,并且最终让啤酒与尿布这两个看起来没有关联的东西的销量双双增加。这家超市的名字叫做沃尔玛。 你会不会觉得有些不可思议? 虽然事后证明这个案例确实有根据,美国的太太们常叮嘱她们的丈夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒。 但这毕竟是事后分析,我们更应该关注的,是在这样的场景下,如何找出物品之间的关联规则。 接下来就来介绍下如何使用Apriori算法,来找到物品之间的关联规则吧。作者: 哈尔的数据城堡 / Ming (本文来自作者投稿)
支持度 = (包含物品A的记录数量) / (总的记录数量)用上面的超市记录举例,一共有五个交易,牛奶出现在三个交易中,故而{牛奶}的支持度为3/5。 {鸡蛋}的支持度是4/5。 牛奶和鸡蛋同时出现的次数是2,故而{牛奶,鸡蛋}的支持度为2/5。 置信度(Confidence): 置信度是指如果购买物品A,有较大可能购买物品B。 计算方式是这样:
置信度( A -> B) = (包含物品A和B的记录数量) / (包含 A 的记录数量)举例: 我们已经知道,(牛奶,鸡蛋)一起购买的次数是两次,鸡蛋的购买次数是4次。 那么Confidence(牛奶->鸡蛋)的计算方式是Confidence(牛奶->鸡蛋)=2 / 4。 提升度(Lift): 提升度指当销售一个物品时,另一个物品销售率会增加多少。 计算方式是:
提升度( A -> B) = 置信度( A -> B) / (支持度 A)举例: 上面我们计算了牛奶和鸡蛋的置信度Confidence(牛奶->鸡蛋)=2 / 4。 牛奶的支持度Support(牛奶)=3 / 5,那么我们就能计算牛奶和鸡蛋的支持度Lift(牛奶->鸡蛋)=0.83 当提升度(A->B)的值大于1的时候,说明物品A卖得越多,B也会卖得越多。 而提升度等于1则意味着产品A和B之间没有关联。 最后,提升度小于1那么意味着购买A反而会减少B的销量。 其中支持度和Apriori相关,而置信度和提升度是下一篇寻找物品关联规则的时候会用到。
某个项集是频繁的,那么它的所有子集也是频繁的。这句话看起来是没什么用,但是反过来就很有用了。
如果一个项集是 非频繁项集,那么它的所有超集也是非频繁项集。如图所示,我们发现{A,B}这个项集是非频繁的,那么{A,B}这个项集的超集,{A,B,C},{A,B,D}等等也都是非频繁的,这些就都可以忽略不去计算。 运用Apriori算法的思想,我们就能去掉很多非频繁的项集,大大简化计算量。
def apriori(df, min_support=0.5,
use_colnames=False,
max_len=None)
参数如下:
df:这个不用说,就是我们的数据集。
min_support:给定的最小支持度。
use_colnames:默认False,则返回的物品组合用编号显示,为True的话直接显示物品名称。
max_len:最大物品组合数,默认是None,不做限制。如果只需要计算两个物品组合的话,便将这个值设置为2。
OK,接下来就来用一个简单的例子来看看怎么使用Apriori算法找到频繁项集吧。
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
#设置数据集
dataset = [['牛奶','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
['莳萝','洋葱','肉豆蔻','芸豆','鸡蛋','酸奶'],
['牛奶','苹果','芸豆','鸡蛋'],
['牛奶','独角兽','玉米','芸豆','酸奶'],
['玉米','洋葱','洋葱','芸豆','冰淇淋','鸡蛋']]
te = TransactionEncoder()
#进行 one-hot 编码
te_ary = te.fit(records).transform(records)
df = pd.DataFrame(te_ary, columns=te.columns_)
#利用 Apriori 找出频繁项集
freq = apriori(df, min_support=0.05, use_colnames=True)
首先,需要先将商品进行one-hot编码,编码后用boolean值表示。 所谓ont-hot编码呢,直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。 比如冰淇淋只存在最后一共交易单中,其他交易中都没出现。 那冰淇淋就可以用[0,0,0,0,1]来表示 这里编码后的数据如下: 我们设定的最小支持度是0.6,那么只有支持度大于0.6的物品集合才是频繁项集,最终结果如下:
推荐阅读
(点击标题可跳转阅读)
深入浅出,一篇超棒的机器学习入门文章
深入浅出遗传算法
觉得本文有帮助?请分享给更多人
关注「算法爱好者」加星标,修炼编程内功
好文章,我在看❤️