QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5054|回复: 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算法篇
    + ~8 a. V, b% a! l. R
    % m, R( `* T- a' d+ a/ \" @在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。0 {- r) ]9 w. K, g

    + v4 C- h; P. g- {. U4 H1.准备工作
    ( k, U, K2 @: X+ \8 O如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    . |( R" Q* p% F* y" z8 b
    , n7 C' k9 @3 x5 _7 y* Wpip install mlxtend
    2 \! U$ T/ a# t+ H# p, L1" e0 [7 o& m3 R0 \" m- q. W2 [' S
    为方便进行过程的演示,在此构建测试数据:6 U8 O) u  n; D0 c- }: `
    , }% a; y1 |8 f; g; d3 g/ b
    import pandas as pd  \& E1 N+ I# Q7 Y# ^& a+ a: U
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* d4 P* x* Z. ~7 Y* J/ K, Q6 |
    1
    " j& S3 {" a( y+ \' k2
    2 Y& |7 o  s' Y/ E* p) @) f; j测试数据截图如下:
    $ x+ Q8 y6 m7 }9 S
    / L1 I" N5 d, i+ I/ R; E: ^, i, b# z4 T, E" P
    对上述的数据进行以下处理:' W3 P8 q; S% A0 `% h* u7 a9 n7 D, W
    + w+ a+ A# E6 W6 x. I
    df_chg=df['product_list'].str.split("-")
    % F5 d; R' G6 e& U) r. c8 y1
    " {% A( o5 Y7 W" v' H; h数据处理后,结果截图如下:3 M0 N3 c$ _" T7 i9 f/ W
    " _# P; ]: P5 D% p
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。0 K$ U8 n! P" s, ]

    ' d* Z8 [; u# }2.核心函数及代码8 K) D  U: X) ^
    2.1 数据预处理6 `" K' M3 |4 b+ h6 Q( `) F
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    # t5 ^8 b+ D) r5 z& w: i
    & y0 v; R; t1 v, ]7 r3 `3 r#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    8 t  w, @9 A; w: zfrom mlxtend.preprocessing import TransactionEncoder2 ~) |( p3 z2 k! b' L
    te = TransactionEncoder()
    " n/ ~/ Z1 ~! m8 u5 X& Pdf_tf = te.fit_transform(df_chg)9 e, U7 P$ ]( l, Z: Q, [5 \
    #为方便进行查看,生成dataframe
    9 `8 h7 @5 I* h0 sdata = pd.DataFrame(df_tf,columns=te.columns_)( v9 P: A. f  J8 p  O
    1
    1 }) J: X* F( D0 j' g2
    - I7 @2 ^& t% w3. o' ]) F9 u% Q+ x) Y# S9 @
    4
    ' h6 i1 K! D  F7 O/ K5) V& `, b! x+ L0 @
    6
    ! y+ R* }( n* f+ S( q运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 }* Y- Y' O0 Q6 w3 j

    6 t! t, {6 H8 }1 L
    # p& U& n3 Q4 S) h/ ^2.2 两个关键函数
    8 l6 \+ f  ?1 s; napriori函数, _) c9 s  b0 B+ ^" \: c- ^; I
    语法:
    1 q, d% }" j5 I3 Z7 n( R6 p/ Y5 G+ N  ~6 `# O6 }$ s
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)+ r! Z1 w$ ^% i5 h& X6 G5 I
    1
      ?  G" `9 r5 [9 K1 Y$ N参数详解:1 ]- c- \1 ?2 B/ n
    : x3 p+ z, p: u& t
    df: pandas模块中的数据帧,DataFrame形式的数据;
    . `' E# N; W  S8 q5 W6 W; Umin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, a  a; ~& V$ B) J2 D
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    * K2 h5 v9 i/ n" emax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    " Z0 q- K  B, N) q% ]0 u1 bverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。; v( u" q2 Z. s% l8 K3 n
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    1 ^. N9 f! K/ h8 v' ]association_rules函数8 ~  U2 A& Y5 s+ U$ Q2 }: \
    语法:, }  l$ s; L; |( f" W/ U

    5 M8 {; H( }) `# }/ }2 z  ~( @association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    6 F. ^0 ?* o8 k# [/ K; L0 E1# ]/ a! Y+ B! d) P. H# l$ D
    参数如下:
    1 s. v" r  r9 l5 L# A
    # k! w1 K' a& G$ udf: pandas模块中的数据帧,DataFrame形式的数据;6 X8 ?1 K( f: P: e# f
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’4 T! Y4 e* e( u! C
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    8 d; s( h+ d4 Z' @6 S& isupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。5 ]0 ^* m0 }" G, c& v
    附带metric几种参数的计算方法:
    + V7 _+ s6 M/ q  q
    7 y4 q% a9 Y% z" @9 A0 d& i2 K, Asupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]% F: u& p5 `+ {5 A8 O
    * B1 x# l( G5 L& h+ ]2 c2 n. c( A/ K
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    , w6 [6 @' d$ ^* J, r0 ^3 l0 @0 A+ L( C; ?* m4 A
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    2 r: x  s, }# {/ S5 z: a: G$ X3 h0 g1 g$ T1 S
    leverage(A->C) = support(A->C) - support(A)*support(C),9 l, i/ p- M& e- g  P2 |3 Q/ r
    range: [-1, 1]
    0 p, _; g: J, C. N6 O+ m5 p2 O$ g+ M) ?6 N) X
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    # c; p. |4 ]6 l0 lrange: [0, inf]- _( i( s( C+ m4 C! g! t2 k  J: B

      v0 P; o1 }$ H& f7 B. V( D3.实际应用案例
    ( D8 |  V% g) ^# J- S: S以下为完整的调用实例:
    ) D( i3 {9 }5 O( s! K% ?
    ' L' F% S: g3 Aimport pandas as pd" {6 ?) S* `5 B2 b
    from mlxtend.preprocessing import TransactionEncoder, F" D: {2 S  G( l1 |0 v3 f" v# M
    from mlxtend.frequent_patterns import apriori1 [0 c5 P; t% `! ^1 ]: q
    from mlxtend.frequent_patterns import association_rules5 R% t3 m! a) K* R) A" T
    #1.构建测试数据
    ; X7 \/ c! }, u1 b5 P+ [% [, |df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ) F3 _9 i# X  V/ s8 ndf_chg=df['product_list'].str.split("-")8 y+ e8 c0 g, j) g' ~0 Y  t
    #2.数据预处理
    # ^1 m, C6 n4 t2 W8 x7 Q& Y( m#将传入的数据转换为算法可接受的数据类型(布尔值)
    5 X( Q- ]  }9 ~te = TransactionEncoder()0 W: ?6 `$ q; \0 }( V& F
    df_tf = te.fit_transform(df_chg)
    ' |: I! d  v2 j( n/ P( z9 l#为方便进行查看,生成dataframe
    1 J6 @* o4 g) E# \- n/ u% s9 Zdata = pd.DataFrame(df_tf,columns=te.columns_)5 u# Q' J6 {: Y0 y. O
    #3.建模) y7 ^% b1 V6 P$ C+ J- U7 y" e3 P! u
    #利用 Apriori函数,设置最小支持度为0.2
    5 ?2 {! H" y* h6 P2 v+ H5 C$ F6 cfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True), u1 ^# O# @9 S. X9 _, C) ]2 d
    #设置关联规则,设置最小置信度为0.15& H$ D' e& ?% D5 a: o1 f4 B* z
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    ! c& q% {. q  M$ v) X: q' T: |/ }#4.剪枝并控制输出! X( p" o/ k9 |) `/ T9 D
    #设置最小提升度,并剔除对应的数据
    2 B9 ^% ]! n! d# Bmin_lift=1
    7 t: d0 X% n6 ?: krules = temp.drop(temp[temp['lift']<min_lift].index)
    . [0 a3 ?8 n; t! Q& q#筛选需要输出的列6 x3 _" |' X& R4 I: U: `/ e  J
    result = rules[['antecedents','consequents','support','confidence','lift']]. B1 V" V% o5 M; B) C
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    " F0 ^7 a- h) Zresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')1 s, D, L9 U& U: r* z) e4 u5 y

    % V+ m( \. ^; b0 I1
    ! M3 {& X9 |7 B; d2 T2/ o, q  `. K6 N& A9 M  `2 }3 ]
    3
    2 C% ^0 @( H$ E) H. Q  N4% t% b6 D" D4 _" C3 u
    5
    " F, P7 B& [  m' g. s8 K6 _; x2 `) d& q6
    % ?9 \; Z% W6 a4 ^74 W& M. u% S2 l2 b
    8! [/ u. H) C+ R# j! T3 s
    9
    ( _3 Z! T2 q( N+ O- i: e4 I% b: e10
    0 s* F; Y; ]. [7 C4 Y11% x& C6 ~( ~- c7 k/ _; y; V& B
    12: |2 F9 ]' e3 G, o  X
    13
    * L( P6 ]( l3 {, P: H14- Y  X2 @0 [4 Q. T
    15
    0 S; S0 e0 V3 A16+ a! ^( v  E8 T4 n+ z$ B4 J
    178 n9 S" I& G2 D: k5 p
    18% E+ |" f- G- T3 a5 H
    19
    ( [* _- `: @0 b" Y* n" }- Y20
    + W" t5 b% q/ @2 n4 j7 d& r21
    ; {# _. @* ?- C: r+ }8 {22
    ! {" k# q# S4 w6 O. c: {' L23, ?* V5 T6 Q7 H  d" y
    24
    7 u; \" P( R, M! l+ o8 W4 N$ T( W* U25
    5 Q  L  g/ \% V: K26
    4 R9 u8 Y1 y( X4 d; _9 K7 W输出结果见下图:
    9 \1 E4 b( |3 y+ u9 z6 E# M9 J8 H" Z) i3 c  P" @
    ————————————————& u3 ]4 E8 a4 |! o
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ m; x3 a) X7 x6 W3 p7 x$ I9 E2 M% X
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759: D/ h/ e. r# r, t* l, W- N

    3 U6 z2 o3 l) B7 O% u; B) H. c+ V* q) J* E9 w* p! d. v) f
    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-7-30 12:13 , Processed in 0.409662 second(s), 51 queries .

    回顶部