浅谈数据挖掘支持度(support)与置信度(confidence)
前言
由于本人初学数据挖掘,许多知识与见解还有所欠缺,因为看书《python数据挖掘入门与实践》有点没能理解,所以查阅了一些资料,有一些自己的理解,若有错误,望各位海涵并指点本人的不足。
参考样本
由于下面的理解会讨论到相关的参考样本,所以这里先列出书上实例的参考样本节选。(1代表了购买,0代表没有购买)
定义与理解
在具体讨论支持度与置信度时,需要先讨论两个概念,规则和应验。
规则:即给出一个前提条件,得到一个对应的结论。就好比:我如果买了苹果,那么我有可能会继续选择香蕉。
应验:即事件的发生。就好比:我买了苹果,也确实买了香蕉,那么就应验了上一条规则。
支持度(support)
在《python数据挖掘入门与实践》一书中,对支持度(support)的定义为:
数据集中规则应验的次数,统计起来很简单。有时候,还需要对支持度进行规范化,再除以规则有效前提下的总数量。支持度衡量的是给定规则应验的比例
由于作为初学者没有太懂这句话的含义,所以查询了相关资料,在资料中写到,支持度即:表示同时包含A和B的事务所占所有事务的比例。用公式表示则是:
support(A → B) = P(A ∪ B)
支持度实际作用
从概率上讲,支持度反映了一组事务(商品)被选择的概率,就假设一个商场从支持度推测出苹果和香蕉的支持度很高,那么就证明了苹果与香蕉这个组合更受人们的欢迎,所以商家可以将香蕉和苹果放在接近入口的地方,方便人们的购买。
置信度(confidence)
在《python数据挖掘入门与实践》一书中,对置信度(confidence)的定义是:
置信度衡量的是规则准确率如何,即符合给定条件(即规则的“如果”语句所表示的前提条件)的所有规则里,跟当前规则结论一致的比例有多大。计算方法为首先统计当前规则的出现次数,再用它来除以条件(“如果”语句)相同的规则数量。
我不确定多少人和我一样看了这句话后云里雾里的,反正我是查阅了资料,资料里写的是:表示使用包含A的事务(商品)中同时包含B事务(商品)的比例,即同时包含A和B的事务(商品)占包含A事务的比例。相应的公式为:
Confidence(A->B)=P(A | B)
置信度的实际作用
置信度的实际作用是能够做到关联规则挖掘,判断用户最有可能选择哪些组合的商品,即计算用户选择了A商品(前提条件)后又选择了B商品(结论)的概率。
就比如曾经有个案例,发现婴儿的爸爸在购买尿布时很有可能购买啤酒,于是商家就将尿布和啤酒放一起卖,增加了销售额,这就是置信度在实际生活中的一个场景。
代码与结果
由于书上的代码中支持度只是具体的数值而非概率,所以我进行了一定的优化,代码在书上都有,我这里截取最核心的部分:
# 遍历所有样本
for sample in X:
for premise in range(n_features):
# 如果客户没有购买,则跳过
if sample[premise] == 0:
continue
num_occurances[premise] += 1
for conclusion in range(n_features):
# 不需要判断用户购买了A,又购买了A
if premise == conclusion:
continue
# 当前提条件与结论都应验后,有效数据 + 1,否则无效数据 + 1
if sample[conclusion] == 1:
valid_rules[(premise, conclusion)] += 1
else:
invalid_rules[(premise, conclusion)] += 1
support = defaultdict(float)
confidence = defaultdict(float)
# 支持度
for premise, conclusion in valid_rules.keys():
rule = (premise, conclusion)
support[rule] = valid_rules[rule] / n_samples
# 置信度
for premise, conclusion in valid_rules.keys():
rule = (premise, conclusion)
confidence[rule] = valid_rules[rule] / num_occurances[premise]
for premise, conclusion in confidence:
premise_name = features[premise]
conclusion_name = features[conclusion]
print("Rule: if a person buys {0} they will also buy {1}".format(premise_name, conclusion_name))
print(" - Confidence: {0:.3f}".format(confidence[(premise, conclusion)]))
print(" - Support: {0}".format(support[(premise, conclusion)]))
print("")
部分结果截图如下:
说明:
X:存放了所有的样本集合的ndarray对象
n_features:X.shape[1],即该数组(样本)有多少列
n_samples:X.shape[0],即该数组(样本)有多少行
valid_rules:defaultdict(int),规则应验次数
invalid_rules:defaultdict(int),规则无效次数
参考
hooly.数据挖掘关联分析中的支持度、置信度和提升度.简书,2017
Robert Layton.python数据挖掘入门与实践〔M〕.人民邮电出版社,2016:6-10