规则
首先给定规则:如果A,那么B(如果客户买了A,那么他还会买B),一条规则由前提条件和结论两部分组成
支持度
支持度指数据集中规则应验的次数,统计起来很简单。有时候,还需要对支持度进行规范化,即再除以规则有效前提下的总数量。我们这里只是简单统计规则应验的次数。
置信度
支持度衡量的是给定规则应验的比例,而置信度衡量的则是规则准确率如何,即符合给定条件(即规则的“如果”语句所表示的前提条件)的所有规则里,跟当前规则结论一致的比例有多 大。计算方法为首先统计当前规则的出现次数,再用它来除以条件(“如果”语句)相同的规则 数量。
计算过程
我们需要统计数据集中所有规则的相关数据。首先分别为规则应验和规则无效这两种情况创建字典。字典的键是由条件和结论组成的元组,元组元素为特征在特征列表(0,1变量组成的列表,0代表不购买,1代表购买)中的索引值,不要用 实际特征名,这里根据实际情况对每一条数据进行编写,A是第三个特征,B是第四个特征,那么规则(3,4)是键
为了计算所有规则的置信度和支持度,首先创建几个字典,用来存放计算结果。这里使用defaultdict,好处是如果查找的键不存在,返回一个默认值。这里需要一个规则应验次数字典,违反次数字典,满足规则条件字典,他们的键一样且只有一个(3,4)
遍历数据集,如果满足3处为1,则满足条件字典值加一,然后判断时候满足规则,仍满足结论则应验字典值加一,否则违反字典值加一。
import pandas as pd
import numpy as np
from collections import defaultdict
X=pd.DataFrame(columns=['f0','f1','f2','f3','f4'],data=np.random.randint(2,size=(10,5)))
valid_rules = defaultdict(int)
invalid_rules = defaultdict(int)
num_occurances = defaultdict(int)
support=defaultdict(int)
for index,sample in X.iterrows():
for premise in range(5):#遍历条件
if sample[premise] == 0:
continue#检测个体是否满足条件,如果不满足,继续检测下一个条件。
else:
num_occurances[premise] += 1
for conclusion in range(5): #遍历结果
if conclusion ==premise:
continue
else:
if sample[conclusion]==1:
valid_rules[(premise, conclusion)] += 1
else:
invalid_rules[(premise, conclusion)] += 1
support[(premise, conclusion)] =valid_rules[(premise, conclusion)]#得到各个规则的支持度字典
confidence = defaultdict(float)
for premise, conclusion in valid_rules.keys():
rule = (premise, conclusion)
confidence[rule] = valid_rules[rule] / num_occurances[premise]#得到各个规则的置信度字典