QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4972|回复: 0
打印 上一主题 下一主题

[其他资源] 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-12 18:44 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
    5 I9 ^, r( l1 W& R; H  a$ v# ?3 E3 a" C0 S8 a
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。$ D: b3 h( G6 S4 i" p5 A
    % [/ J- b/ z1 Y. K) k, y% H: f
    1.准备工作
    / j5 O1 y- S, F3 l如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    ) G+ e; L; W3 ]: w( k. @+ b: U# S* {% Y' c- r( X' w: c9 z1 f
    pip install mlxtend
    5 j+ z% r9 m2 p* I1 N. o1
    5 N- Q, M; c# G5 c& }为方便进行过程的演示,在此构建测试数据:
    9 X0 i( G; @$ f! ^' t
    : k; K" n: K2 h6 t/ ]- u4 L, Bimport pandas as pd
    ; ~3 y0 S. m+ E8 A6 F' u# Ndf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    2 P- |0 A1 l% f. o5 B2 o9 r1 p+ O1
    & p7 d' ?- c8 a; z4 `$ R2; n3 B1 Y: }2 l$ b* c) b" P
    测试数据截图如下:
    1 S; U  A2 t) k/ K: @# D# \  i5 F
      U$ A, F: F# m# w3 t: q
    ' V$ U2 N3 k8 \. `& Z* G6 m" C( i0 `对上述的数据进行以下处理:- T, j& X+ A/ B) `& o
    ; {( V# P1 v3 \
    df_chg=df['product_list'].str.split("-")" B( ^# Y. z3 d, s. ~0 q
    1
    9 c0 J3 Q: T5 q/ r5 r数据处理后,结果截图如下:, I! o8 {8 J2 q% P
    7 ?2 T4 Q; ^  k
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。' ~; r( C/ E0 X5 Z6 S  ^

    5 n, ?- W: a3 e2 A( a" Q6 T2.核心函数及代码7 D( i. h5 D8 K7 \9 B9 u' K
    2.1 数据预处理
    7 K# V6 |4 V% |( Z7 i( B( @# {对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:' k& z$ h6 a# r  o4 g1 {5 `* Y
    : Z* e& d3 R3 V
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)
    " Z# v/ J7 N0 b7 |% \2 N7 x( L: ]from mlxtend.preprocessing import TransactionEncoder. q, s! r; q0 H" ~# g+ }
    te = TransactionEncoder()5 h) R8 [, k7 I( {
    df_tf = te.fit_transform(df_chg)! p' V  V, u0 F% J1 c3 K
    #为方便进行查看,生成dataframe& {, N& g2 ]( T1 g  i
    data = pd.DataFrame(df_tf,columns=te.columns_)
    ! L9 F9 ^/ B: ^) ^; j1
    / L& z0 R0 }. }, ?+ s9 b0 p5 `2% g2 I5 I6 p5 s5 Z$ R2 |. z
    35 [8 `2 B; y5 H9 G
    4
      {$ ^' |! R- F' A8 X5
    / l8 R# q# Z3 b6" `& o$ f0 @9 K% G0 M
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    9 }7 b0 Z& v# V& A, w- S6 F4 @! F' X7 \7 @6 |, N* }

    ( F9 `5 F6 B% K6 }% {; s. F2.2 两个关键函数
    . X7 J5 S7 w$ m% z4 zapriori函数% Y' A. e$ L1 V  b1 {; [" b0 n6 x
    语法:
    * |9 @; A7 R* y3 Y9 p( J7 g
    , j5 g* Z# x" R# P* T. S: Gapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)# Q( ]0 K  ?5 j) Z
    1
    8 u$ d( r9 n& c. T3 C参数详解:
    8 Y8 M" H' P- [$ N3 t
    % Z. D- ?1 f+ I. Y' fdf: pandas模块中的数据帧,DataFrame形式的数据;
    ( z  S  `+ B/ T8 W9 @) v( j; Pmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。3 a# O2 m# E' X& Y3 l9 T! p
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。" t5 L+ m4 M+ P8 k; \
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    9 r. n3 S# z$ y. j% xverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    - e% }, ^% B) n% Y- J# \. Hlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    & [* P! t1 G4 j: X1 z+ i" c2 |$ j) wassociation_rules函数
    1 }) w  r1 p1 l2 w, P语法:
    % N- e  G4 [2 m: |- w$ S
    1 b! T  \- m  }- m/ Z, Dassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    8 w/ q: d" Q3 F0 [4 |, K1
    3 m8 R/ \4 k* ?% q1 ~$ k/ f参数如下:
    ; g6 \# b  C' p7 v+ Z! U
    # ~  R' {. O9 ]; B# j1 _4 X1 K- @) Sdf: pandas模块中的数据帧,DataFrame形式的数据;9 e) x# \9 I8 v; i0 \1 T3 Q( a" [3 c
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    ( G9 p* q! ]+ Zmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。. O- D# _9 H9 p7 ^6 j$ P( F/ k  E( {
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。. H6 ?/ }1 ]* C: L- P# u( Y
    附带metric几种参数的计算方法:! x* m- m& i/ T! a% q

    0 v) M5 p: d$ A$ l1 Z6 l3 Usupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]  h6 Z5 o( ~7 ]: J0 v( c+ p1 v

    ) ^8 P6 p: Z+ c$ \( Tconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    0 A: ?7 z& l& O0 b# P3 O: }; N
    6 a7 E5 b7 R4 J3 `* g) Zlift(A->C) = confidence(A->C) / support(C), range: [0, inf]- m* ?: l1 W% t, T/ t8 a, B

    * C: q3 y! g& J' Fleverage(A->C) = support(A->C) - support(A)*support(C),3 u+ V( B  b& ?" f: h5 p8 z4 |
    range: [-1, 1]6 r( z6 u+ A5 G( n: c6 w; {, y8 g

    1 P$ Y/ J: M( o! E, dconviction = [1 - support(C)] / [1 - confidence(A->C)],
    4 g5 F4 R: c5 ^. crange: [0, inf]
      l9 |9 x  v/ b& P
    , P+ H; V& C/ a5 F) P6 w3.实际应用案例; H# w9 J# @5 Q
    以下为完整的调用实例:2 p7 H6 l+ @! r9 t1 ~' U, Y

    8 D4 h% Z- b7 O  H  o! C, W# H9 }import pandas as pd+ k4 d  V8 P( w. f' `
    from mlxtend.preprocessing import TransactionEncoder# X6 \3 L! q& B# ^$ Y( N' V; i
    from mlxtend.frequent_patterns import apriori, f/ [  v; G; m
    from mlxtend.frequent_patterns import association_rules
    0 N/ d4 Z6 a2 K. U: _9 C9 |#1.构建测试数据5 A5 k8 g: v& C: S1 h
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    # T9 U- }1 ^9 f. Bdf_chg=df['product_list'].str.split("-")3 H/ ~) J7 u1 a5 F
    #2.数据预处理
      y5 g# z8 Z6 Q3 b, {$ t& U3 o+ o#将传入的数据转换为算法可接受的数据类型(布尔值)
    9 @. J7 o6 M" `7 z8 t6 Qte = TransactionEncoder()2 i9 E' A5 h& p9 S/ L7 S) i9 O
    df_tf = te.fit_transform(df_chg)% u( N  b! b( v6 |' X# ?7 q/ }
    #为方便进行查看,生成dataframe
    - Z2 F" h, a7 D& D" ddata = pd.DataFrame(df_tf,columns=te.columns_)
    3 K' L, V7 D8 x+ c5 c#3.建模/ K5 ]- S7 w+ U" @/ G+ ^
    #利用 Apriori函数,设置最小支持度为0.2% M: U- |- T5 C
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    ! k, g" X3 S9 N0 t5 Y#设置关联规则,设置最小置信度为0.159 J3 z* {4 n9 |( Q; R. b
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    0 a8 c4 x# b8 l4 a4 I#4.剪枝并控制输出
    5 ?/ i$ ]: ]# R- w2 ~#设置最小提升度,并剔除对应的数据9 g4 k& m6 w. Y+ _# P
    min_lift=1
    4 g6 n. D1 {( yrules = temp.drop(temp[temp['lift']<min_lift].index)
    4 ^8 N% I7 h% A9 K#筛选需要输出的列1 q8 h1 ]) s3 o0 c
    result = rules[['antecedents','consequents','support','confidence','lift']]
    $ G8 _6 G; m, hresult=result.sort_values(['confidence','lift','support'],ascending=False)% S% \& R. V8 o) m4 l9 P
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')) l# o2 n+ L, Y- s- l  n4 e

      V9 s, d) D3 w2 W1 W- K1
    ; t- Y2 F; S9 ^; P: o0 |$ h2
    ; }  U/ M: ^0 l0 G. y& Y3
    5 ~7 J7 q. V# @  I* c- x0 B4; Y# r. {7 }, Z- i" h) K. l& x) k
    5; k0 K' y6 m4 s- Y) g
    60 \0 h( a) m& r' B( D! i
    7+ f( l% |7 W- \% Q0 d
    8: I- M" R& B; ^1 T" d7 [
    9
    ! c0 M' b; ?% z2 Y0 d10/ @! O( ^  E9 U8 a- S1 [  }* A
    11
    / h7 q/ e# Y9 r- }: [" H" P7 \. R: q2 q12
    , X5 g7 f; D# K6 V$ X7 c' D& g13
    + R# E9 o# N% z2 h' H144 r4 b2 o: h9 `  o  o: V( w) g$ o
    15
    5 T6 @' M* M, f0 F+ s1 k- m16
    , C1 c5 L4 r1 ]5 e1 J& \6 \17: `  H3 c% o3 u% j4 T' j0 p
    18
    9 y0 ~; I& P2 P3 ]$ c9 u19
    $ ^6 a2 |' A. X" {% O% A' ]$ Z' E20
    5 q. w, q+ L# P9 w. k8 I21
    , `- k$ k: n& \) z2 x. z0 y3 F22
    8 @9 v; b0 j7 A7 Z0 c& J3 q- E23- r) ~3 R! c) E' H
    248 {9 k* N7 m. X5 U5 I, H' A1 c
    25
    8 m) h% l: U- I, S5 z' \, ^268 f6 ~1 n  X1 |2 G
    输出结果见下图:
    7 d: p/ q. v0 {1 @) u
    4 n7 j! \' p+ {) N* m! X* ?+ ?————————————————
    ' O* w' ?& g' ~# U版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    / p) Y: b. E/ {2 B, R3 c( G! `; F原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    + q- ~5 H$ G! C7 h% b* _
    9 U, x; a, `# Z. h6 V. j
    3 v% i3 q  g! S( w
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-13 11:26 , Processed in 0.420752 second(s), 51 queries .

    回顶部