机器学习实战-关联规则

``数据挖掘就是对数据进行处理,并以某种方式分析源数据,从中发现一些潜在的
有用的信息,所以数据挖掘又称作知识发现。这里的“某种方式”就是机器学习算法。
关联规则作为经典机器学习算法之一,搞懂关联规则自然有着很重要的意义。顾名思义,
关联规则就是发现数据背后存在的某种规则或者联系。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
%config InlinebBackend.figure_format="retina"
from matplotlib.font_manager import FontProperties
fonts=FontProperties(fname="/Windows/Fonts/SIMYOU.TTF/",size=15)#打开控制面板查看字体找到自带的字体
import statsmodels.api as sm
import statsmodels.formula.api as smf
from sklearn import metrics
from sklearn.model_selection import train_test_split
datadf=pd.read_excel("调查问卷2.xls")
# print(datadf.head())
#分析这13个问题每个问题出现的次数,并绘制直方图
dataflatten=np.array(datadf.iloc[:,1::]).flatten()
dataflatten=pd.DataFrame({"value":dataflatten})

##计算出出现的频率
datadfre=dataflatten.groupby(by=["value"])["value"].count()
#查看统计后的结果

# print(datadfre)
datadfre=pd.DataFrame({"Item":datadfre.index,"Freq":datadfre.values}).sort_values("Freq",ascending=0)
datadfre.plot(kind='bar',figsize=(12,6),legend=None)
plt.title("选项出现的频次",fontproperties=fonts)
plt.ylabel("频次",fontproperties=fonts,size=12)
plt.xlabel("")
plt.xticks(range(len(datadfre)),datadfre["Item"],rotation=90,fontproperties=fonts,size=15)
plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
plt.rcParams['axes.unicode_minus']=False
plt.show()	

在这里插入图片描述
上述代码解释:
(1)使用np.array()将数据表格中的数据生成数组
(2)使用数组的flatten方法,生成一个一维数组,特征为value,以方便计算频次。使用groupby函数计算。程序中使用sort_values(“Freq”,ascending=0)
针对数据进行排序,并且使用参数ascending=0指定为降序排列
(3)最后使用数据表的plot()方法绘制直方图。得到选项频次直方图。
使用plt.xticks来指定x坐标轴上刻度的显示内容,并且使用rotation=90将其旋转90度
plt.rcParams[‘font.sans-serif’]=[‘SimHei’] #显示中文标签
plt.rcParams[‘axes.unicode_minus’]=False
这两行代码是为了让图表中的中文正常显示出来
对图表数据的理解:
从频次直方图可以看出“理工科”出现的次数最多,以及‘一直反复观看’频率最低,在某种程度上说明了该调查问卷的主体是理工科学生,而且并不
会有很多大学生去反复观看真人秀节目。
使用mlxtend库中的frequent_pattern模块进行关联规则学习。主要用apriori和association_rules函数,其中apriori用于找到数据集中的频繁项集,而
association_rules则可以用来生成关联规则
在挖掘频繁项集之前,需要对数据集进行处理,对数据重新编码,重新编码后数据集中出现的项目会作为列的名称
每个样本如果含有该项目则对应位置会为1,否则为0.使用TransactionEncoder对原始数据进行重新编码。

from mlxtend.frequent_patterns import apriori,association_rules
from mlxtend.preprocessing import TransactionEncoder

datanew=np.array(datadf.iloc[:,1::])
oht=TransactionEncoder()
oht_ary=oht.fit_transform(datanew)
oht_ary = oht_ary.astype('int')
df=pd.DataFrame(oht_ary,columns=oht.columns_)
df.head()
##发现频繁项目集。找出最小支持度为0.3的频繁项集,可以得到138项,其中至少包含2个项目的项集有120个。代码如下
df_fre=apriori(df,min_support=0.3,use_colnames=True)
#为找到频繁项目添加项目长度
df_fre["length"]=df_fre["itemsets"].apply(lambda x:len(x))
print(df_fre.shape)
df_fre_len2=df_fre[df_fre["length"]>1]
print(df_fre_len2.shape)
df_fre_len2.sample(5)

在这里插入图片描述
对数据集进行编码
将编码后的数据集做成数据表,每列为各个选项
from mlxtend.preprocessing import TransactionEncoder # 传入模型的数据需要满足特定的格式,可以用这种方法来转换为bool值,也可以用函数转换为0、1

代码解释:
使用apriori()函数寻找频繁项集,第一个参数用来指定寻找频繁项集的数据,即经过TransactionEncoder()编码后的数据df,
min_support=0.3表示频繁项集的支持度最小为0.3,use_colnames=True参数表示项集中的事件使用数据集的列名;接着用df_fre[“itemsets”].apply()
函数计算每个找到的频繁项集中含有多少个事件,在使用apply()方法时,定义了一个新的函数lambda x:len(x),用来计算项集中包含事件的个数。从
df_fre.shape的输出中可以知道一共找到了138个频繁项集,其中每个频繁项集至少包含2个事件的项集有120个,最后查看其中的5个样本。得到了频繁
得到频繁项集之后,使用association_rules()函数探索关联规则,并且限制规则提升度lift的阈值是1.1,同时需要计算出规则先导
(也称前项,即X>Y 中的X的长度)

rule1=association_rules(df_fre,metric="lift",min_threshold=1.1)
# print(rule1)
#计算前项(antecedents)的长度
# print(rule1["antecedents"])
rule1["antelen"]=rule1.antecedents.apply(lambda x:len(x))
print(rule1)

在这里插入图片描述
从输出结果发现提升度大于1.1的规则一共得到了12条,这12条的各个规则可以通过前面的数据表输出查看,结果中同时计算出了支持度、置信度和
提升度的取值。
#找到置信度>0.7,前项长度>1的规则
rule1[(rule1.antelen>1)&(rule1.confidence>0.7)]
在这里插入图片描述
在上面的程序中使用(rule1.antelen>1)&(rule1.confidence>0.7)来保证同时满足2个条件的实例。从输出的规则中可以看出,男性中对真人秀节目
没有很高兴趣(一遍就够或偶尔讨论)通常都是理工男。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值