机器学习——关联规则

一、关联规则概述

1.1 关联规则

关联规则(Association Rules)反映一个事物与其他事物之间的相互依存性和关联性。如果两个或者多个事物之间存在一定的关联关系,那么,其中一个事物就能够通过其他事物预测到

关联规则可以看作是一种IF-THEN关系。假设商品A被客户购买,那么在相同的交易ID下,商品B也被客户挑选的机会就被发现了。

1.1.1 项

对一个数据表而言,表的每个字段都具有一个或者多个不同的值,字段的每种取值都是一个项item。

1.1.2 项集

项的集合称为项集itemset。包含k个项的项集被称为k-项集,k表示项集中项的数目。由所有的项所构成的集合是最大的项集,一般用符号I表示。

1.1.3 事物

务是项的集合。本质上,一个事务就是事实表中的一条记录。事务是项集I的子集。事务的集合称为事务集。一般用符号D表示事务集/事务数据库。

1.1.4 关联规则

给定一个事务集D,挖掘关联规则的问题就变成如何产生支持度和可信度分别大于用户给定的最小支持度和最小可信度的关联规则的问题。(标准)

1.1.5 频繁项集

项集的出现频率是包含项集的事务数,简称项集的频率;项集满足最小支持度阈值minsup,如果项集的出现频率大于或等于minsup与D中事务总数的乘积;满足最小支持阈值的项集就称为频繁项集(大项集)。频繁k项集的集合记为Lk;

1.1.6 强关联规则

大于或者等于最小支持度阈值和最小置信度阈值的规则就叫做强关联规则。

置信度:表示你购买了A商品后,你还会有多大的概率购买B商品。

支持度:指某个商品组合出现的次数与总次数之间的比例,支持度越高表示该组合出现的几率越大。

提升度:提升度代表商品A的出现,对商品B的出现概率提升了多少,即“商品 A 的出现,对商品 B 的出现概率提升的”程度。

二、Apriori算法

Apriori算法利用频繁项集生成关联规则。它基于频繁项集的子集也必须是频繁项集的概念。频繁项集是支持值大于阈值(support)的项集。

Apriori算法就是基于一个先验:如果某个项集是频繁的,那么它的所有子集也是频繁的。

2.1 算法流程

输入:数据集合D,支持度阈值𝛼

输出:最大的频繁k项集

1)扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。k=1,频繁0项集为空集。
2)挖掘频繁k项集

  • 扫描数据计算候选频繁k项集的支持度
  • 去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。如果得到的频繁k项集为空,则直接返回频繁k-1项集的集合作为算法结果,算法结束。如果得到的频繁k项集只有一项,则直接返回频繁k项集的集合作为算法结果,算法结束。
  • 基于频繁k项集,连接生成候选频繁k+1项集。

3)令k=k+1,转入步骤2。

2.2 步骤

1、首先,通过扫描数据集,产生一个大的候选数据项集,并计算每个候选数据项发生的次数,然后基于预先给定的最小支持度生成频繁1项集的集合,该集合记作L1;

2、然后基于L1和数据集中的数据,产生频繁2项集L2;

3、用同样的方法,直到生成频繁n项集,其中已不再可能生成满足最小支持度的(N+1)项集;

4、最后,从大数据项集中导出规

2.3 Apriori 算法的缺点

Apriori 在计算的过程中有以下几个缺点:

  • 可能产生大量的候选集。因为采用排列组合的方式,把可能的项集都组合出来了;
  • 每次计算都需要重新扫描数据集,来计算每个项集的支持度。

三、python代码实现

# Apriori

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 数据处理
dataset = pd.read_csv('groceries.csv',header = None)
dataset

dataset.shape[0]

dataset.shape[1]

dataset.values

transactions = []
for i in range(0, dataset.shape[0]):
    transactions.append([str(dataset.values[i,j]) for j in range(0, dataset.shape[1])])
transactions

# 对数据及使用apriori算法
from apyori import apriori
rules = apriori(transactions, min_support = 0.01, min_confidence = 0.3, min_lift = 2, min_length = 2)

# 可视化结果
results = list(rules)
results

# 打印各项集情况
print("="*90)
print("Items")
for result in results:
    if 'nan' in list(result.items):
        continue
    print("="*70)
    print("frequent " + str(len(list(result.items))) + "-itemsets \t\t\t support \t lift ")
    #print("="*80)
    print(list(result.items), 
          round(result.support,4),
          round(result.ordered_statistics[0].lift),)

# 最受欢迎商品
print("="*90)
print("Top")
pre_list = []
for result in results:
    pre_list = pre_list+list(result.items)

import collections

top = collections.Counter(pre_list)
top5 = sorted(top.items(),key=lambda x: x[1], reverse=True)
print(top5[0:6])



 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值