QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4369|回复: 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算法篇
    6 l+ D0 p  ?" L' d, \7 |7 |- b
    " J6 k, }0 ]! d0 H在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    8 s( Q9 |/ }6 N# I* s& G! c/ G! `: i/ Y' ^( W( i
    1.准备工作
    ) q; L' k$ B$ o2 j, v8 H% G如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    ) n$ M  D, g5 J6 l# I# A. r, d8 B) U) l8 o, m  W
    pip install mlxtend- f0 T) }8 r2 d/ c) B
    1
    % H4 D4 `  }; D6 x为方便进行过程的演示,在此构建测试数据:  {5 A, t* Q: K$ ]! Q8 L3 Z
    3 m5 w9 ]+ W) [; D" g
    import pandas as pd4 z4 L. K  b! J- O4 l) d2 i
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})9 e" D8 T, ~7 J+ S; X+ D
    1; H+ Z, x4 P" I, R9 F9 B
    21 T5 ^- D5 J+ N0 ?
    测试数据截图如下:
    & H( C9 D1 S& }
    + L2 p' M7 ?' F8 e0 u1 z( s3 H$ d3 ^
    对上述的数据进行以下处理:! n' p  [. u# W: T  m$ E$ j
    - U- B' y+ u# k6 T6 _0 W
    df_chg=df['product_list'].str.split("-")
    + W  K3 |- n' G: \1; Y$ C. A0 H/ S5 t: o0 N' b7 M. U
    数据处理后,结果截图如下:. J( t1 C: }. n" j6 [
    5 |: l- H% r* Y
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。3 E4 t/ Q7 B3 E
    " f% s9 B$ [* T0 g$ @8 `" k7 ~
    2.核心函数及代码
    # g2 ^4 H# s) f! k4 R2.1 数据预处理* f5 r" w% ?  Q
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    - C4 o4 V7 Z  w) K  p
      z' ~7 e: c7 Z0 r#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    8 G9 G3 U  Y% W  rfrom mlxtend.preprocessing import TransactionEncoder- q. N( B" y, M- c% X
    te = TransactionEncoder()  X) G$ R7 r4 T# H
    df_tf = te.fit_transform(df_chg)
    % ~3 k% R2 r6 w1 @; X; H4 U#为方便进行查看,生成dataframe" l, {- o8 n5 _: G1 D6 b. e
    data = pd.DataFrame(df_tf,columns=te.columns_). ~6 h% a* |3 v* C' s% o! o
    1
    % ]. x# p6 q9 N/ |26 f4 M" b0 e. O7 v6 W9 S
    32 r4 H$ `9 b' c
    4
    , T+ ?+ x# y0 E5$ q5 h, `+ g& N% b7 x
    6; F: O1 `/ J! l+ F
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:  J+ Z# X6 ^! r: P, l
    ! k( T( P% \! U) }" ~

    * h( Y  x! z1 ?2.2 两个关键函数
    % P4 c0 }( h! {/ h. S  lapriori函数9 Y+ x+ v* |- S% I3 p5 Q
    语法:
    / Y! U0 h' @. W# S
    / Y5 y( N9 h+ b8 v: aapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    8 S# V! D, Q! X& i5 W; H1  @, u$ C/ V& z* f/ k
    参数详解:4 M0 o* O" g9 _4 q( I0 b
    6 R! h* m2 e$ S; {7 ~! h& `% L: ?
    df: pandas模块中的数据帧,DataFrame形式的数据;
    ) u4 x4 O7 n# X6 E% Vmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    . n" l; b3 Q! T7 p! J+ H4 euse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    + D! h0 p' j# W% Mmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。0 q" w* ]0 D1 n2 I
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    4 n1 m$ _7 Q1 H' @1 `low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    ; F( ~7 Z5 V. c0 M# T) dassociation_rules函数9 }) X/ A1 @  _0 d/ A6 ~/ I+ K
    语法:# A1 a/ Q+ M7 O( \0 W% \

    * q/ c2 N7 r* b3 E* oassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)! h$ M' Q. C7 |& D
    1
    & x2 t2 Z7 \2 I; B( a& P, ~1 n- n参数如下:% g+ l! Q) L+ z$ c; _& {* P
    & v, ^/ `! H4 W
    df: pandas模块中的数据帧,DataFrame形式的数据;/ M1 {! R& ^! o9 y* U" x: ^+ I# S
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    # y5 F- @% R. d( G- f; `min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    # m% D) G0 m: F& {! ^. [support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    4 P5 I) N3 u: |# U- N! L0 T6 G* |  R附带metric几种参数的计算方法:
    7 d% p/ O) }2 x1 M( r
    ) J0 E9 d. {' Q: xsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    " A  o& _9 w6 F! Y: \4 m. H8 o' @
    5 G9 C. \' q  }confidence(A->C) = support(A∩C) / support(A), range: [0, 1]- x/ A# B) p$ @7 w6 w2 U/ g
    & ?9 d2 t" c2 p/ a4 b' l# c
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    ; p& ]/ j8 s! C6 `8 M9 M8 `( s8 J% E: r6 d) j- H& k  \
    leverage(A->C) = support(A->C) - support(A)*support(C),' l; @7 w' z7 b% E0 O$ C
    range: [-1, 1]# F& g0 U# M: X/ }' M2 l# n

    + a1 O. N; K- z) {" Tconviction = [1 - support(C)] / [1 - confidence(A->C)],
    " I2 A) ^9 x' ?range: [0, inf]8 F; ]1 \; \+ c

    ! L8 Y1 S- d9 I' k- y: _3.实际应用案例
    8 q( Y' V$ ?1 W3 c2 [7 n! X3 m4 u以下为完整的调用实例:
    ; U; V1 a# c2 ?) k& W4 l2 T  o# z% ^, {' w" r
    import pandas as pd
    3 E2 E9 L! g! f4 X- Ufrom mlxtend.preprocessing import TransactionEncoder8 m$ j4 D+ S6 R& t5 c2 R
    from mlxtend.frequent_patterns import apriori1 P% p! g) `0 M
    from mlxtend.frequent_patterns import association_rules) f- c, Z9 ], |$ m7 [
    #1.构建测试数据
    - C6 F3 s4 _- b4 j+ e, Adf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* j+ i9 R/ C& t- b
    df_chg=df['product_list'].str.split("-")& k0 f$ U1 Y2 w5 K
    #2.数据预处理
    $ z' n& s1 t0 D% U  I2 D" j, i3 E#将传入的数据转换为算法可接受的数据类型(布尔值)) d( f1 n% |1 T( K3 G5 s
    te = TransactionEncoder()+ y( h+ H% l- ^0 b
    df_tf = te.fit_transform(df_chg)
      \& D4 W$ X& T% Y6 ~#为方便进行查看,生成dataframe
    , T6 |5 M& _6 N, Q" Fdata = pd.DataFrame(df_tf,columns=te.columns_)% g. _/ C! I6 [) T! |: E
    #3.建模- k' `2 m/ `; [, e
    #利用 Apriori函数,设置最小支持度为0.2
    / H1 o; e2 B% a$ U( \frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    + z5 n  H/ E( P' n#设置关联规则,设置最小置信度为0.15. B! a2 [9 B* z3 Q* v1 R) q
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    ; y+ y" ~) G& W  E! t#4.剪枝并控制输出
    + ^. Q* V4 m2 G$ z#设置最小提升度,并剔除对应的数据
    $ i1 v# e. v6 U& [8 omin_lift=1
    / M$ N* K% Z* X6 lrules = temp.drop(temp[temp['lift']<min_lift].index)
    5 A, m3 y+ \& \#筛选需要输出的列& ]* ?3 B& N' s/ x& }
    result = rules[['antecedents','consequents','support','confidence','lift']]
    / `1 B5 \# N, k# T6 o$ D& xresult=result.sort_values(['confidence','lift','support'],ascending=False)
    ' c; h* _% f6 q& q+ c$ P- l1 \" zresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')+ U7 ?9 A- h( V4 l+ t6 g( {

    % |" h( q! v# o1 \1, A  i6 V) Z( m1 l! X# _! i, e* L) W+ R
    2( g+ a3 o9 ?; V1 P$ |+ e! c
    3
    - m2 ^/ F6 F0 B2 o8 Q4
    ( R% }4 W( ]4 m8 N) y: x5
    2 q7 T2 k$ o% K5 A/ @$ ~: h6
    ) _% n- w8 o3 G6 e8 |7
    8 A) r% R1 a) G9 t8- P2 l: ^. `1 D$ A3 k
    9- e$ g  E, L4 y- {0 G: T, H
    10
    $ o+ c7 n* Z1 M) W4 {11
    / }1 u, x1 ~3 o9 |' W, \12/ P, w8 g( t2 Q3 p6 s- S; X
    13+ S' t2 x/ _' s" ?( w
    14
    - F, P( E! d. z5 x5 e3 c! @159 O* s1 \, E9 |
    160 o1 H5 z: P0 s2 L% d' B0 v* V% o
    17( `; P/ K! V- d, f5 v
    189 w( N+ Z. ~" o5 m5 \
    19
    / \& n* q5 b- m. j( d208 B4 `/ e7 e9 z' H  h" D) {
    21$ F* }% ?# t& c
    22
    1 d& I. h& p4 X& [; d2 j9 X235 A5 S2 U2 N6 x, s: a6 R
    243 M# _; Z# U9 }  `1 |
    25$ I7 e3 p, ~. ^6 s( d2 X, @" W4 n
    26
    1 p) K' J# ]" b6 a- E; ?2 x( V输出结果见下图:
    4 R! @' J1 Z* p. y0 U8 K! f2 @/ d! a
    * T/ D! w, ?& ~$ b/ I————————————————
    9 I& M- |2 ?; @- S3 m版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 y7 Q4 V8 }. a  D
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    ! T. W' ^$ \$ J+ ~2 C, d% H: q- M+ o

    / Q: b" o. t& V! [
    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-9-29 06:48 , Processed in 1.025801 second(s), 51 queries .

    回顶部