美文网首页散文心理想法
数据挖掘:关联分析原理及python实现

数据挖掘:关联分析原理及python实现

作者: Cache_wood | 来源:发表于2022-03-20 10:55 被阅读0次

    @[toc]

    基本概念

    关联性:共同出现,相关
    基于产品的共同出现特征,发现能够预测产品共同出现的规则集合

    • 频繁模式
      • 项集:包含了一种或几种产品的集合

    example:{Milk,Bread,Diaper}

    K-项集:一个包含了k个产品的项集
    
    • 支持度
      • 一个项集出现的概率
      • support({Milk,Bread,Diaper}) = 2/5
    • 频繁项集/频繁模式:支持度大于阈值的项集
    • 关联规则:X \rightarrow Y
      • {Milk,Diaper} \rightarrow {Beer}
      • 置信度:Y在包含了X的项集中出现的频率,Supp(XY)/Supp(X)
    TID Items
    1 Bread,Milk
    2 Bread,Diaper,Beer,Eggs
    3 Milk,Diapper,Beer,Coke
    4 Bread,Milk,Diaper,Beer
    5 Bread,Milk,Diaper,Coke
    • 频繁模式挖掘
      给定最小支持度阈值minsupp,从交易数据中挖掘支持度不小于minsupp的所有频繁项集
    • 关联规则挖掘
    • 给定minsupp和最小置信度阈值minconf,从交易数据中挖掘所有频繁模式,然后从频繁模式中生成置信度不小于minconf的关联规则

    核心方法

    找到满足特定的支持度和置信度的项集与规则

    蛮力方法 Brute-force
    • 将所有可能的规则列出来
    • 分别计算所有规则的支持度和置信度
    • 计算复杂度过大
    Apriori算法

    基于Apriori Principle的剪枝策略
    \forall X,Y:(X \subseteq Y) \Rightarrow s(X) \geq s(Y)

    在这里插入图片描述
    如果有一个项集是频繁的,则它所有的子集一定也是频繁的。
    如果一个项集是非频繁的,则它所有的超集也是非频繁的。
    FP-growth算法

    FP-tree算法又称FP-Growth算法,是在不使用候选代的情况下查找频繁项集的另一种方法,从而提高了性能。其核心是使用名为频繁模式树(FP-tree)的特殊数据结构,保留了项集关联信息。

    python实现

    mlxtend使用Apriori算法
    import pandas as pd
     
    shopping_list = [['豆奶','莴苣'],
                ['莴苣','尿布','葡萄酒','甜菜'],
                ['豆奶','尿布','葡萄酒','橙汁'],
                ['莴苣','豆奶','尿布','葡萄酒'],
                ['莴苣','豆奶','尿布','橙汁']]
    
    shopping_df = pd.DataFrame(shopping_list)
    print(shopping_df)
    
        0   1     2     3
    0  豆奶  莴苣  None  None
    1  莴苣  尿布   葡萄酒    甜菜
    2  豆奶  尿布   葡萄酒    橙汁
    3  莴苣  豆奶    尿布   葡萄酒
    4  莴苣  豆奶    尿布    橙汁
    

    将数据转化为标准格式

    # df_arr = shopping_df.stack().groupby(level=0).apply(list).tolist()    # 方法一
    def deal(data):
        return data.dropna().tolist()
    df_arr = shopping_df.apply(deal,axis=1).tolist()                # 方法二
    
    from mlxtend.preprocessing import TransactionEncoder    # 传入模型的数据需要满足特定的格式,可以用这种方法来转换为bool值,也可以用函数转换为0、1
     
    te = TransactionEncoder()   # 定义模型
    df_tf = te.fit_transform(df_arr)
    # df_01 = df_tf.astype('int')           # 将 True、False 转换为 0、1 # 官方给的其它方法
    # df_name = te.inverse_transform(df_tf)     # 将编码值再次转化为原来的商品名
    df = pd.DataFrame(df_tf,columns=te.columns_)
    print(df)
    

    找出支持度不小于0.4的关联商品

          尿布     橙汁     甜菜     莴苣    葡萄酒     豆奶
    0  False  False  False   True  False   True
    1   True  False   True   True   True  False
    2   True   True  False  False   True   True
    3   True  False  False   True   True   True
    4   True   True  False   True  False   True
    
    from mlxtend.frequent_patterns import apriori
     
    frequent_itemsets = apriori(df,min_support=0.4,use_colnames=True)   # use_colnames=True表示使用元素名字,默认的False使用列名代表元素
    # frequent_itemsets = apriori(df,min_support=0.05)
    frequent_itemsets.sort_values(by='support',ascending=False,inplace=True)    # 频繁项集可以按支持度排序
    # print(frequent_itemsets[frequent_itemsets.itemsets.apply(lambda x: len(x)) >= 2])  # 选择长度 >=2 的频繁项集
    
    print(frequent_itemsets)
    
        support       itemsets
    0       0.8           (尿布)
    2       0.8           (莴苣)
    4       0.8           (豆奶)
    6       0.6       (莴苣, 尿布)
    11      0.6       (豆奶, 莴苣)
    7       0.6      (葡萄酒, 尿布)
    8       0.6       (豆奶, 尿布)
    3       0.6          (葡萄酒)
    5       0.4       (橙汁, 尿布)
    1       0.4           (橙汁)
    9       0.4       (橙汁, 豆奶)
    10      0.4      (葡萄酒, 莴苣)
    12      0.4      (葡萄酒, 豆奶)
    13      0.4   (橙汁, 豆奶, 尿布)
    14      0.4  (葡萄酒, 莴苣, 尿布)
    15      0.4   (莴苣, 豆奶, 尿布)
    16      0.4  (葡萄酒, 豆奶, 尿布)
    
    from mlxtend.frequent_patterns import association_rules
     
    association_rule = association_rules(frequent_itemsets,metric='confidence',min_threshold=0.9)   # metric可以有很多的度量选项,返回的表列名都可以作为参数
    association_rule.sort_values(by='leverage',ascending=False,inplace=True)    #关联规则可以按leverage排序
    # print(association_rule)
    print(association_rule)
    

    进一步发现其中的关联规则

      antecedents consequents  antecedent support  consequent support  support  \
    5        (橙汁)    (豆奶, 尿布)                 0.4                 0.6      0.4   
    0       (葡萄酒)        (尿布)                 0.6                 0.8      0.6   
    1        (橙汁)        (尿布)                 0.4                 0.8      0.4   
    2        (橙汁)        (豆奶)                 0.4                 0.8      0.4   
    3    (橙汁, 豆奶)        (尿布)                 0.4                 0.8      0.4   
    4    (橙汁, 尿布)        (豆奶)                 0.4                 0.8      0.4   
    6   (葡萄酒, 莴苣)        (尿布)                 0.4                 0.8      0.4   
    7   (葡萄酒, 豆奶)        (尿布)                 0.4                 0.8      0.4   
    
       confidence      lift  leverage  conviction  
    5         1.0  1.666667      0.16         inf  
    0         1.0  1.250000      0.12         inf  
    1         1.0  1.250000      0.08         inf  
    2         1.0  1.250000      0.08         inf  
    3         1.0  1.250000      0.08         inf  
    4         1.0  1.250000      0.08         inf  
    6         1.0  1.250000      0.08         inf  
    7         1.0  1.250000      0.08         inf  
    

    相关文章

      网友评论

        本文标题:数据挖掘:关联分析原理及python实现

        本文链接:https://www.haomeiwen.com/subject/vhyodrtx.html