QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3882|回复: 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算法篇
    " w( ?; R2 q* ^1 a; }6 O+ n, V1 I
    0 h+ |  g/ C* N% S8 y在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。( Z6 D; t6 [3 ]- w; T$ S

    ! \+ M% S& s" [* \1 `: O: z1.准备工作, X; ~* s0 s! |5 t
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:$ l7 G8 J/ m0 q  T4 [2 ^3 h. k
    - R9 i, x% z  s. z1 i2 r
    pip install mlxtend
    , C6 F0 F* E" i. Y9 z1  F) d7 [; [) p: s- K
    为方便进行过程的演示,在此构建测试数据:
    7 x) f6 b+ Z) H" q0 f6 f' K; v5 [( ~) O4 u
    import pandas as pd
    : Q3 Q& d  x: G3 Z. Jdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})( B  x% V% L" b. l# J0 i
    1
    0 P+ y1 f# ~4 x; v* @2
    3 a2 a/ s+ I/ x7 o" D  o测试数据截图如下:
    4 h9 v- s/ a+ ]; J: v% D
    + y0 Q! C# p5 Q3 \' Q) ?1 s
    / R+ r- G& p6 P4 d$ [) n7 Q, I% V对上述的数据进行以下处理:% M% z: M, [, m2 U, K7 n6 r3 r

    ! r. `# m# `! ~: v: zdf_chg=df['product_list'].str.split("-")9 ~& d  X9 t' ]
    1
    9 Y4 B: [4 f2 C: a; n: s8 l数据处理后,结果截图如下:
    , i; ], L6 |  `. {+ H* d& a
    " Y8 E3 c; a: S* Z; S4 \截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    & h, Z3 B5 _% k/ o% t* O' w
    1 J, W, A  Z% A, A7 p( T- c* V2.核心函数及代码" d3 Y5 Z+ _" |
    2.1 数据预处理
    8 j3 D, E" M) ?- x# d! X对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:- I) }' X9 O$ r3 S2 `9 Y

    8 d+ F$ v; {2 u#1.将传入的数据转换为算法可接受的数据类型(布尔值)9 K- ?5 `: [$ z) @% D1 W  g7 O. C) t
    from mlxtend.preprocessing import TransactionEncoder$ j3 H# ?. O1 z7 n% f
    te = TransactionEncoder(): q$ }/ l( q: y8 C
    df_tf = te.fit_transform(df_chg)
    1 c2 ~) ~' g# T1 d2 x  R#为方便进行查看,生成dataframe
    / ~3 N- _7 r% T' `2 [1 Udata = pd.DataFrame(df_tf,columns=te.columns_)
    # l* q: o, Y% ~2 p; P1- R. k( a( i; b( p2 @  _$ u: Q
    2
    3 q. v5 s8 s3 K) A  y0 G6 p- C% V3
    3 J2 k, E# U9 w: h) _( ?" z44 q% p8 g4 u7 k- ]) o) ~2 H- t
    5
    5 W0 ^' y5 n" m" ~6
    , u4 c8 @1 l3 T+ c$ j: V, f& y运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:& q4 V# x+ l4 Q& G6 c3 V+ J5 C' y
    $ r  I0 K8 P5 U2 C9 ~% k

    . M  ]. ^% ^4 }8 Y( `. J7 n. e2.2 两个关键函数
    ) l# w" b( L( `: wapriori函数9 U# A* [: A$ e
    语法:
    ( d; G) _/ a$ o, Z5 j5 j9 t
    . R6 O6 {) N3 X/ e$ P9 O0 f$ q8 v# eapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    2 O  E: I" ?! u. V18 J/ U1 a8 m+ t( O; A9 l# \
    参数详解:
    0 }( n) v% N& g) a& r3 [) g2 `: ^+ h( v% j
    df: pandas模块中的数据帧,DataFrame形式的数据;
    2 W2 |- L8 J: Fmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。" G. A% {5 d) J) `+ K3 D% z+ ^
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    1 Q6 ?2 r7 o, C6 F, X4 Emax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。' Z$ y) o. \! S& V8 }2 K
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。9 ^& S+ T( [4 L3 W9 s/ g5 v
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。( Z9 F7 k9 K" c; Y+ |- x" a
    association_rules函数
    ' v  F  J3 o' _. q0 @$ B0 T& ?语法:0 l- U! x& s1 H7 j; n& W

    + X5 j6 U1 ]" V, H9 H; J# oassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    - A2 t; A( A! o3 ?' c/ t2 E1! @, G* P* f9 K3 s# _' P% ^  N
    参数如下:+ y$ Z8 D0 |: w

    ) e7 {1 y' \$ x/ ]3 \7 Vdf: pandas模块中的数据帧,DataFrame形式的数据;
    ; ?/ H4 ^6 D5 o: h% O2 V: Ametric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 W: z0 e3 f( n7 C9 l
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。" M- k- ~3 Z1 q5 u' S/ J
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    3 k4 Q( \) u9 ~) O  z8 o附带metric几种参数的计算方法:2 m! ?. _2 V! T
    5 N! u1 @& `2 Y# x  J  B5 }3 H
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    . }4 s$ g) }; }! I7 j3 c/ R" J. z7 B
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    0 s/ a) }( K/ k+ A, [* @6 E+ A& }; b2 S4 }+ A# _& T
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    4 A* }* {" f2 A; v3 M& q$ G: _  h2 {: ]1 q: {
    leverage(A->C) = support(A->C) - support(A)*support(C),
    $ a" P2 J1 t9 h% prange: [-1, 1]
      h; K% o. J6 g9 c3 h8 Y! ], ?
    ' e/ d5 ~) c9 p: Q! |' S' n5 yconviction = [1 - support(C)] / [1 - confidence(A->C)],
      _. f. {7 E; I( M: _0 G. D4 frange: [0, inf]6 k4 O5 I! W+ P& U1 ?" h

    : P8 x" @& d1 n3 W6 G  _* p3.实际应用案例
    2 h, Z9 F7 @& ^  T$ H  j0 R以下为完整的调用实例:
    6 F" b. Y, V7 d5 o/ Q7 A3 [+ u; u: y1 A1 a) e; Y( g
    import pandas as pd
    + z- A7 v. Y2 f- V1 u7 h7 k  _$ ufrom mlxtend.preprocessing import TransactionEncoder
    + k. Y% f/ S( @, w8 Wfrom mlxtend.frequent_patterns import apriori# Z  b0 P; }$ ?* O8 m" c( I, T& i6 P
    from mlxtend.frequent_patterns import association_rules
    9 I" O- p, c6 X+ F& O- }1 j#1.构建测试数据
    , `2 d7 b! @4 Mdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    " a. T7 u& m3 u, Q, u2 zdf_chg=df['product_list'].str.split("-")6 w% f, A1 S* M$ h9 L4 L
    #2.数据预处理3 ~$ Q$ {; J% i& p
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    # N7 ?- d5 ^. qte = TransactionEncoder()
    9 s, Z% \  q& y5 N! ~4 i. ~5 A5 jdf_tf = te.fit_transform(df_chg)
    ' e; u3 U. T" Z6 Q7 b0 p#为方便进行查看,生成dataframe
    # a- F1 U# B% X$ L& Bdata = pd.DataFrame(df_tf,columns=te.columns_)
    5 ~+ P- }. e/ }* `, E" _) a* B/ R#3.建模
    " A) Q) U3 @) @! U) e9 |; m#利用 Apriori函数,设置最小支持度为0.24 S: A3 u& ]1 V8 l' i
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)8 m7 _3 w3 ]! d/ V
    #设置关联规则,设置最小置信度为0.15
    7 ~+ T4 u9 x- [/ etemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)( E5 G% k" n9 l* H1 @( M; W# W, k
    #4.剪枝并控制输出. ?( e) N- v# s& U5 }
    #设置最小提升度,并剔除对应的数据! E# D! G0 L4 M. }' W8 _
    min_lift=1
    , x: D* e/ C! krules = temp.drop(temp[temp['lift']<min_lift].index)
    # {4 H9 g+ D: Y. m- `6 e. A, E#筛选需要输出的列
    / G% E8 M5 w8 {& K3 x2 Jresult = rules[['antecedents','consequents','support','confidence','lift']]3 N7 A& a, G$ {( s3 X. t
    result=result.sort_values(['confidence','lift','support'],ascending=False)* b0 A! z+ U7 E: ]1 E7 D) t
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    ( n! G- t5 n/ R1 Z
    2 W: T7 S: n3 j0 V. B1
    ; A$ Q. ~# D' j9 f9 Y6 E9 K& x2
    5 g* ~9 ?2 q% c* L! E% Z/ H! z. E32 @; r) J& ^, o' Q. k$ F0 m
    48 n* k) J# Y0 W* ~# B
    5
      D6 g0 M% w% u' E$ V6
    % J  j( ~* D0 T, h7
    $ ], s) w% v- u' r& G) H' o6 C8 h$ @8
    / i% {' }4 h# }  L90 i: @$ T4 H6 ]% x0 x# [2 C# P0 p
    10% A$ m, v" o! L6 b" C
    110 D$ _8 R( `  g  [
    12* E& Q& ^' }" A& q& n
    13- F- J1 D% F+ O: m; z  m
    14
    ! _# V. h1 c8 `; ]9 i0 F15
    7 x0 F# U2 z! g& m16, H2 U8 X- @+ M; a. L3 Y: ?) l
    17* b7 K; R7 l% X$ x- \4 r, Z
    18
    5 Y! J9 o- F3 a7 T9 F19- @% P: A( [2 ], V/ K# |
    209 T. b4 ]( e2 U" U& m* p
    210 M& B$ n! G& ^
    227 o: D  u- R' H( V% l. Z/ J( J
    23& n1 G7 e3 c8 F7 H0 Z6 @
    24, ?  P, ^, @; [$ }* Z! c
    25
    0 X/ P9 u) `! Q! I+ W5 ~267 V4 o' k1 A8 {$ w' R
    输出结果见下图:/ X! ~: l- R0 C6 r4 S

    0 \8 W( a( g& a4 Q5 l————————————————
    ) j$ V5 N4 N; F0 A7 r& U版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) G3 e) r9 C! n/ Q4 q
    原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207596 i( b) o$ o. F0 f0 |" v+ X. V

    8 v/ e" z! o' A9 c# q- d" ]. e6 E, T0 G- Q+ P% {; _
    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, 2025-7-8 06:04 , Processed in 0.404557 second(s), 50 queries .

    回顶部