关联规则简介
关联规则反映一个事物与其他事物之间的相互依存性和关联性。若两个或多个事物之间存在一定的关联关系,则其中一个事物就能够通过其他事物预测到。
典型的关联规则发现问题是对超市中的货篮数据(Marker Basket)进行分析,通过发现顾客放入货篮中的不同商品之间的关系来分析顾客的购买习惯。
基本概念
事务:由事务号和项集组成。事务是一次购买行为
项:最小处理单位,即购买的物品
项集:由一个或多个项组成
支持度计数:包含某个项集的事务数
支持度:包含某个项集的事务数的比例
支持度:包含某个项集的事务数的比例
置信度:在所有包含X项集的事务中包含Y项集事务的比例
频繁项集:支持度不小于指定阈值的项集
关联规则:X和Y都是项集,X->Y(s,c)
关联规则评估指标:支持度不小于指定阈值和置信度不小于指定阈值
上图是尿布到啤酒的关联规则,从可以看出支持度小于置信度,所以我们一般取支持度为判断标准,但如果全体顾客很大,导致支持度相对很小,但是置信度很大要另行考虑,比如有10000万顾客,100个同时买啤酒和尿布,买尿布的150,所以支持度0.01,置信度0.66。
***pip install mlxtend***下载
实验代码:
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
import numpy as np
import pandas as pd
import csv
data=pd.read_csv("mushroom.dat",encoding="gbk",sep=" ",header=None)
#删除缺失值
data.dropna(how="all",axis=1,inplace=True)
#取数毒蘑菇数据2
data=data[data[0]==2]
#index重置
data.reset_index(drop=True,inplace=True)
#转变成TransactionEncoder能处理的格式 列表的嵌套
data=data.values.tolist()
#类似于独热编码,转换成True,False数据
Encoder=TransactionEncoder()
encoded_data=Encoder.fit_transform(data)
#Encoder.columns_各种种类的集合
df=pd.DataFrame(encoded_data,columns=Encoder.columns_)
#调用函数 最小支持度 确定使用名字 频繁项集长度 按support排序 从大到小
frequent_items=apriori(df,min_support=0.85,use_colnames=True,max_len=10).sort_values(by='support',ascending=False)
#index重置
frequent_items.reset_index(drop=True,inplace=True)
print(frequent_items)
for i in range(0,frequent_items.index.stop):
if 2 in list(frequent_items["itemsets"][i]):
print("支持度与频繁项集:",frequent_items["support"][i],list(frequent_items["itemsets"][i]))
import numpy as np
import pandas as pd
import csv
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
data=pd.read_csv("Cancer.csv",encoding="gbk")
#cut数据划分
data["肝气郁结证型系数"] = pd.cut(data["肝气郁结证型系数"], [0,0.179,0.258,0.35,0.504], labels=["A1", "A2", "A3", "A4"])
data["热毒蕴结证型系数"] = pd.cut(data["热毒蕴结证型系数"], [0,0.15,0.296,0.485,0.78], labels=["B1", "B2", "B3", "B4"])
data["冲任失调证型系数"] = pd.cut(data["冲任失调证型系数"], [0,0.201,0.288,0.415,0.61], labels=["C1", "C2", "C3", "C4"])
data["气血两虚证型系数"] = pd.cut(data["气血两虚证型系数"], [0,0.172,0.251,0.357,0.552], labels=["D1", "D2", "D3", "D4"])
data["脾胃虚弱证型系数"] = pd.cut(data["脾胃虚弱证型系数"], [0,0.154,0.256,0.375,0.526], labels=["E1", "E2", "E3", "E4"])
data["肝肾阴虚证型系数"] = pd.cut(data["肝肾阴虚证型系数"], [0,0.178,0.261,0.353,0.607], labels=["F1", "F2", "F3", "F4"])
#把每一列的数据删除男值并转换为列表
def deal(data):
return data.dropna().tolist()
# 调用函数,按行计算,apply函数1为行,0为列
df=data.apply(deal,axis=1)
df=df.values.tolist()
#类似于独热编码,转换成True,False数据
Encoder=TransactionEncoder()
encoded_data=Encoder.fit_transform(df)
#Encoder.columns_各种种类的集合
df=pd.DataFrame(encoded_data,columns=Encoder.columns_)
#调用函数 最小支持度 确定使用名字 频繁项集长度 按support排序 从大到小
frequent_items=apriori(df,min_support=0.06,use_colnames=True,max_len=10).sort_values(by='support',ascending=False)
#index重置
frequent_items.reset_index(drop=True,inplace=True)
print(frequent_items)
for i in range(0,frequent_items.index.stop):
if 'H1' in list(frequent_items["itemsets"][i]):
print("支持度与频繁项集:",frequent_items["support"][i],list(frequent_items["itemsets"][i]))
课外新方法,可以同时设置置信度和支持度
from mlxtend.preprocessing import TransactionEncoder
from efficient_apriori import apriori
import numpy as np
import pandas as pd
import csv
#数据处理
data=pd.read_csv("关联规则-数据.csv",encoding="gbk")#读入
data=data.drop("咨询师ID",axis=1)#删除ID
data=data.dropna()#删除nan值
data.reset_index(drop=True,inplace=True)#index重置
data=data.values.tolist()#转换数据格式
frequent_items,rules = apriori(data,min_support=0.1,min_confidence=0.5)#设置支持度和置信度
print(frequent_items)
print(rules)