关联分析:Apriori算法

本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》

关联分析:Apriori算法
  • 步骤1:设定最小支持度和最小置信度
    首先设定最小支持度为2/5,即40%;最小置信度为4/5,即80%。
  • 步骤2:根据最小支持度找出所有的频繁项集
    这一步骤是关联分析中较为重要的一个环节,我们需要找到所有的频繁项集,因为强关联规则都是从频繁项集中产生的。
    举例来说,项集{A,B,C,D}只出现了1次,支持度为1/5,小于最小支持度2/5,该项集就不是频繁项集,这就意味着很难从该项集中挖掘出类似{A,B,C}→{D}的强关联规则,即类似”购买了商品A、B、C的用户也会购买商品D”这样的规则。而项集{B,C}出现了4次,支持度为4/5,大于最小支持度2/5,该项集就属于频繁项集,即商品B和商品C经常同时出现,因此很有可能挖掘出{B}→{C}这样的强关联规则(当然还需要经过步骤3的最小置信度检验),即购买了商品B的用户也会购买商品C,这样就可以向购买了商品B的用户推荐商品C。
    那么该如何快速找到所有的频繁项集呢?最简单的方法就是列出所有项集,然后计算它们的支持度,如果大于等于最小支持度则认定为频繁项集。但是列出所有项集意味着要列出所有的排列组合,如果数据量较大,则会造成巨大的计算量。
    Apriori算法采用了一个精巧的思路来加快运算速度:先计算长度为1的项集,然后挖掘其中的频繁项集;再将长度为1的频繁项集进行排列组合,从中挖掘长度为2的频繁项集,依此类推。其核心逻辑是一个迭代判断的思想:如果连长度为n-1的项集都不是频繁项集,那么就不用考虑长度为n的项集了,也就是说,如果在迭代的过程中发现{A,B,C}不是频繁项集,那么{A,B,C,D}必然不是频繁项集,也就不用去考虑它了。
    关联分析:Apriori算法
  • 步骤3:根据最小置信度发现强关联规则
    找到所有长度大于1的频繁项集后,强关联规则就很有可能就从这些频繁项集中产生,此时最后一个步骤就是从各个频繁项集中推导出所有可能的关联规则,再利用最小置信度来检验这些关联规则是否为强关联规则。
    举例来说,频繁项集{A,B,C}的非空子集有{A}、{B}、{C}、{A,B}、{A,C}、{B,C},由此可以推导出6条关联规则。
    关联分析:Apriori算法
    从上表可知,只有规则2满足最小置信度要求,所以得到一条强关联规则{A,C}→{B}。对每个长度大于1的频繁项集进行类似操作,可推导出所有强关联规则,见下表。
    关联分析:Apriori算法
    至此,我们便得到了9条强关联规则。以第1条强关联规则{A,C}→{B}为例,我们便可以向购买了商品A和商品C的用户推荐商品B,其余依此类推。

import pandas as pd
df = pd.read_excel('中医辨证.xlsx')
print(df.head())

symptoms = []
for i in df['病人症状'].tolist():
    symptoms.append(i.split(','))
print(symptoms)

运行结果:

关联分析:Apriori算法

from apyori import apriori
rules = apriori(symptoms, min_support=0.1, min_confidence=0.7)
results = list(rules)

for i in results:
    for j in i.ordered_statistics:
        X = j.items_base
        Y = j.items_add
        x = ', '.join([item for item in X])
        y = ', '.join([item for item in Y])
        if x != '':
            print(x + ' → ' + y)

运行结果:

关联分析:Apriori算法

from mlxtend.preprocessing import TransactionEncoder
TE = TransactionEncoder()
data = TE.fit_transform(symptoms)

import pandas as pd
df = pd.DataFrame(data, columns=TE.columns_)
print(df.head())

运行结果:

关联分析:Apriori算法
from mlxtend.frequent_patterns import apriori
items = apriori(df, min_support=0.1, use_colnames=True)
print(items)

print(items[items['itemsets'].apply(lambda x: len(x)) >= 2])

运行结果:

关联分析:Apriori算法

from mlxtend.frequent_patterns import association_rules
rules = association_rules(items, min_threshold=0.7)
print(rules)

运行结果:

关联分析:Apriori算法
for i, j in rules.iterrows():
    X = j['antecedents']
    Y = j['consequents']
    x = ', '.join([item for item in X])
    y = ', '.join([item for item in Y])
    print(x + ' → ' + y)

运行结果:

关联分析:Apriori算法

Original: https://blog.csdn.net/m0_46388544/article/details/122821849
Author: 星幻夜极
Title: 关联分析:Apriori算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/698964/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球