QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4975|回复: 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算法篇* B$ {: R3 Q4 v5 r, |" T" M

    7 X8 \5 m" f1 Z$ h6 [2 W; r4 z在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    1 z1 \. _1 N( X  P6 p8 l- g, g: ]3 ^. J
    1.准备工作% D# g* E. J/ D3 B% F3 F) @
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    $ j: R6 b. G) ?( d; X: Z# X% a( o! ~
    pip install mlxtend- d6 H3 u; I2 [/ h+ Z( T
    1+ T* g  k0 ?& z7 |% R+ x, U5 V
    为方便进行过程的演示,在此构建测试数据:  M/ k& o) }1 b" a8 _5 H

    ; E0 }4 f2 k5 L. Qimport pandas as pd
    1 j2 p$ p! T9 _( zdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    6 n5 h! e* h  ]1 m/ g, d9 R1* w) U: o' P' _6 C: G. d
    2
    + h( {( G+ L1 O% G  _3 o, m9 n测试数据截图如下:9 V  B+ p2 n' a7 H6 g, d
    + }1 |( \7 T2 A8 R0 R" a" ^& n: b

    7 d9 {( C: Z2 m* E对上述的数据进行以下处理:
    ! J" R+ S$ }# a+ [4 E& }) Y0 X1 n% C7 J
    df_chg=df['product_list'].str.split("-")7 r  N  t* ~0 n
    1
    $ u  O2 I6 Y" y6 c9 b8 ?数据处理后,结果截图如下:  F2 h1 f6 r% C# ?' o* c+ a

    ) \# z+ v5 |0 h7 @5 Q: y+ v7 B截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。! ?. C9 Q- Z! x: e- b( a' e2 p' z5 h
    . N9 d9 I. W: w2 K2 ^, o9 c) Y8 ?* P
    2.核心函数及代码
    ( D6 E7 Y4 _0 O( s2.1 数据预处理5 W* k% P8 O7 M) B
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    4 T: i$ F, R$ y" a" _9 M' z4 p. I
    % `$ Y& }0 V1 k#1.将传入的数据转换为算法可接受的数据类型(布尔值)  n$ o% @! r- p% P
    from mlxtend.preprocessing import TransactionEncoder+ e7 ^, k$ r# ]7 O# x/ \7 A7 W
    te = TransactionEncoder(). M( K' S6 z* J  f6 [
    df_tf = te.fit_transform(df_chg)3 Z1 r/ Y" w2 ]0 Q1 ?
    #为方便进行查看,生成dataframe
    7 W( X; h' |: {  o1 n! Edata = pd.DataFrame(df_tf,columns=te.columns_)
    1 Y% _; Y( F0 E) j1' ?6 g. H. }9 M! T1 h' e' h
    2
    * z- [" T1 ~7 ^' G2 j3
    , d' n& S2 C4 c2 w4
    . X" N; F# q' }8 F59 U9 H/ R" y! v6 P5 Q
    6
    0 F6 w& m3 [5 s: [: |8 \2 q$ X运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:$ U1 N- T7 Q5 @6 h
    ! C0 f0 @& H3 {) v' d5 e" e  M, p
    : c. j8 I7 ?4 ^& t# }. d/ D
    2.2 两个关键函数. w  s5 j  W5 T+ X  X
    apriori函数8 I6 ?: T/ x- T! h) o; `6 R. o' N7 U
    语法:2 d3 s" Z, u  K3 x; l% ?
    - s- D5 c  W1 `$ E. x8 O$ U1 O7 v
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)& ?$ l8 o) h7 Y& I* C
    1
    $ L$ D: f& {  n# }* t3 t参数详解:
    & v3 i; b, ]+ k1 v- u0 n! v0 {2 Z7 L6 i' J+ B
    df: pandas模块中的数据帧,DataFrame形式的数据;: C. w( E0 b* f: o
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; t/ i% Z( _) d4 y/ t0 }
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。- i7 j6 ?- R. {
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。* L+ j% E) F  c# Z
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    ( e7 }: ?- h6 g( Y  Z7 @: rlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。" X+ o# [9 A( _1 r, H: z
    association_rules函数% ~+ s5 e( L) G: n" @/ e
    语法:! h. \, }. Q$ Y. p
    6 ]0 R& ]) O: c* m
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)/ c! h3 f( I8 ?# j  B% N3 Q- c
    1: h4 p% m% ~* x, f/ ]
    参数如下:
    * t/ a* }0 C9 G2 O8 x& `- E8 I8 `2 P4 ?, @
    df: pandas模块中的数据帧,DataFrame形式的数据;
    * {( R! w. _! G0 {* i, a. [5 R$ mmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    " q7 I: ^; P% h# z5 K2 O+ T  Xmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。, h$ ?  S' m0 O' M
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
      w5 p3 V$ X, Z. k+ T# J: j附带metric几种参数的计算方法:
    + p+ f( t5 I4 ]! G+ \! n" _" j
    * s8 E1 w1 [8 d4 r8 v1 d4 nsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]& l2 v6 ^8 r4 U- l) M3 A& T* X% S- u, b

    ) Y% ]; \$ S! n$ oconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    + r5 H1 W0 K& x" ~) X. c
    - ~7 F" Q' N+ g, blift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    * T8 W2 c1 p* C
    : Y% ]2 R" ~* w& Yleverage(A->C) = support(A->C) - support(A)*support(C),
    4 b/ R  U$ S7 w2 |! Nrange: [-1, 1]8 o1 U& i  U5 P: X$ h

    9 c1 d$ E8 F9 L5 J2 ?) e* Zconviction = [1 - support(C)] / [1 - confidence(A->C)],
    4 t/ ^4 C. `( `range: [0, inf]4 p$ G4 L, r- i  ?& O% O7 K, A
    5 S0 R. P1 x% Y
    3.实际应用案例
    / ^; K: l3 k/ t8 ]# a" K, Q以下为完整的调用实例:
    ) a/ Q; p2 I) J" L- I3 o% _' ?; P3 T. g
    . J1 C) A8 C" N2 v% P6 \- @8 Q2 v0 Vimport pandas as pd9 o8 P8 C8 [2 N* M, ]
    from mlxtend.preprocessing import TransactionEncoder
    " p3 j9 J* R% n1 J  F7 k' Ofrom mlxtend.frequent_patterns import apriori
    2 q! J& b  j. V5 Ifrom mlxtend.frequent_patterns import association_rules& j) t3 E* Y& ^- |
    #1.构建测试数据8 V& ?! S0 U" `* H$ Y* h3 J4 f
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* f* r, Z6 e3 S8 Z, _# y
    df_chg=df['product_list'].str.split("-")2 u3 L2 }9 y& a+ j8 Z
    #2.数据预处理
    2 B, ^4 M1 X6 J. H( V. P. q3 Z#将传入的数据转换为算法可接受的数据类型(布尔值)
    4 N8 e8 @+ F9 k& K- b$ b( rte = TransactionEncoder()
    ! C2 r2 o4 p, t8 ]df_tf = te.fit_transform(df_chg)
    * x% r' D% Y7 t7 h( v$ r#为方便进行查看,生成dataframe8 D: o- [( Q1 n0 q. `- }0 f% U
    data = pd.DataFrame(df_tf,columns=te.columns_)( v9 i( K* X. J- b2 |* u5 k( i
    #3.建模
    . U% }8 g6 y( i#利用 Apriori函数,设置最小支持度为0.2# ^. X2 g6 i" ?5 m4 z, c* F
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    " ^, ]- j* T& A3 r, r/ y* t#设置关联规则,设置最小置信度为0.15! n0 F0 P% K% f% m- q/ f- B- l8 |
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    : ?7 c1 C7 X, c1 O4 P#4.剪枝并控制输出5 `: f2 ?! T# ^) S& B2 G" J/ e3 N( W7 j
    #设置最小提升度,并剔除对应的数据
    7 M" W/ S7 a: s, j$ @+ i/ W7 Bmin_lift=1+ g1 n0 s+ L- A
    rules = temp.drop(temp[temp['lift']<min_lift].index)! ^. u' u4 P% o# K, G+ j4 _5 m
    #筛选需要输出的列
    " q2 s) k( x) m2 O- d& Kresult = rules[['antecedents','consequents','support','confidence','lift']]
    6 U9 f7 Y# k7 Q: j/ X4 g( d* ?5 mresult=result.sort_values(['confidence','lift','support'],ascending=False)9 p' ]0 D# }/ v$ m8 w0 q; b
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
      E+ @1 v/ v, C  ~; [0 J; w8 \" P$ J& c: R( ~3 g8 I* Z
    1
    - q: T) ~0 K# t" A1 I/ F! i2
    7 O& l, ~8 d* M39 l& D  @# i# C% J5 v" s
    46 o! N$ c# N! ~$ `* U; ~
    5+ e8 e% f8 G( H' Y' g9 W2 ]: S6 g
    6, }# ]9 V+ M9 Z$ l) T% m; r: H
    7
    5 l0 i8 `) H/ W' x, j85 o3 F* J3 j$ E1 s
    9
    ! l$ L; p+ B( B* A8 c- ^10
      V5 p& ?% E8 ]7 |- O8 a11
    + d& o# M& _0 \1 K+ z12/ X2 x3 x% K3 i( r6 i' ~% d
    13
    ; g) K% Y& Z% A* ?14: a' S  @/ D( w; F. Y2 ^: B
    15, r3 l/ m7 m5 i$ z
    16) w& Z1 d" E% |0 f
    17
    0 }  g& F' F( @18
    - z( G$ V4 R4 i8 L19
      e: P- q0 R/ B. t+ j  e5 e: ]9 z/ @5 H20
    + s) |: v4 d% E$ e8 a  j, G8 c5 P215 `% w9 P$ A9 G
    22
    % S5 j# f1 r4 n/ a* c# ]4 V9 y, Z23- t- _" N+ R" `8 Z, ^
    24% N3 V  t6 m: y
    251 ]* i$ |3 v% s+ Z4 w% Q
    26
    5 Q, ~, E) O& k2 \) v5 d$ Q输出结果见下图:1 q# C$ [. T3 d6 _: ^- |* r
    2 H0 F% B; H! _2 I6 L- o
    ————————————————
    # l  }0 w, b9 L5 W; q8 d0 \版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# w( D' a# N1 V- R# ^* S
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    % r, G% M0 ]. }0 k1 V
    ! o4 s- V3 \2 m. \5 }9 H. s4 B
    . p' p/ Y+ b: h3 B0 a
    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-14 21:01 , Processed in 0.428653 second(s), 51 queries .

    回顶部