QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4184|回复: 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算法篇
    1 Z7 t% _. L, H0 s# ~. L0 A7 {. D0 E2 k+ C; P
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    : P1 E' b4 l: c, r) M! c7 E1 g% F' o0 @% B
    1.准备工作
    ) p8 I8 q& L% m2 f1 N如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    - }+ S( f( D! A
    0 ^. M7 Z5 n# i; S0 C9 y7 D' spip install mlxtend
    ( U0 r' v" t6 @5 ^' f6 v; l( b1
    7 S5 V+ Q1 e8 E" }/ ~为方便进行过程的演示,在此构建测试数据:/ [3 \- m, d6 U/ R, N0 ^4 k

    0 K( f0 |1 @6 h  |8 Ximport pandas as pd5 n  @) Q- U- l6 ^5 v, ]2 O- e4 M
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}): B3 ~" ~+ k! Y( v. q
    1
    # b& O* P0 A$ K2 ^2
    7 D/ l# [! p8 n0 z$ h8 e4 l' q% S测试数据截图如下:) m' i1 E6 F) F. a

    4 s* ~- }/ t! n: _# \9 R; Q! m
    * B( Q* K, }$ k8 M5 T  i3 A8 V' R对上述的数据进行以下处理:7 o7 n$ w/ w0 {. W
    $ A- N  O2 F! C1 R7 n0 j4 Z
    df_chg=df['product_list'].str.split("-")
      m' g3 P9 q/ x- k8 f+ I5 L7 A$ d& U1+ b7 v3 E5 [7 N2 i- o( E1 Z
    数据处理后,结果截图如下:( i+ r1 F# I; g* E( Z- o! D" J! s! `

    0 C$ J- ?- g  G: M2 Q) \3 |截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。# V% Q; g' L3 r+ b' s
    5 j2 ^( L) i- P% b+ o3 e
    2.核心函数及代码, c$ p/ S$ E0 o
    2.1 数据预处理2 {: k; t/ J2 h6 g) R. Y, s: Q4 g7 \% c
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:3 k. j6 f" G, A( W% u* y5 `% X

    . b. ~3 w' _, u' D& m0 S#1.将传入的数据转换为算法可接受的数据类型(布尔值). o6 i2 B! X6 |8 d5 s6 m
    from mlxtend.preprocessing import TransactionEncoder7 r% g9 u! m0 U) [# x; q! D% C
    te = TransactionEncoder()3 t9 Q8 \$ r, B
    df_tf = te.fit_transform(df_chg)" Y. R  n3 ?- A! S' g2 @
    #为方便进行查看,生成dataframe* t- O- w. `- R8 b5 I+ d
    data = pd.DataFrame(df_tf,columns=te.columns_)( X( @6 a! P2 I! b
    10 T5 _, \# t# ^
    22 C+ Z, j* ~- I7 z4 d0 z
    3
    ) ?8 L! S; H6 ?% |3 g+ [4
    7 `. R7 ~3 H# N: a9 v0 d5( R/ D& S  l& w! n2 o
    6- W2 m5 \* W( A6 b/ @- j, s0 R
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    * B- L' z! u8 t9 l! L8 R. ?9 \0 B( G) a3 f& N3 J: `
    # B+ S6 R0 W( H. K  r% u
    2.2 两个关键函数1 w0 w2 Q1 K* q2 Y
    apriori函数# g* V, `- o) v1 m- \! Y) w0 I* U8 t
    语法:
    5 Y0 z+ e$ H5 @
    * ]' L- W  W3 W2 qapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)( f) s% x0 p9 m8 r+ n  N
    1% z( O/ A- ^+ `$ m5 c, s
    参数详解:
    $ s( Y" {* z' u1 d+ d7 U4 W5 L( t, ~9 v6 H) P- X
    df: pandas模块中的数据帧,DataFrame形式的数据;) C: P$ c! ^& }: o5 s, u
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。2 \$ I8 H; j# f7 X9 b1 ~: W# r
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    $ c7 W& T, G+ M' g' K7 I- R  wmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    . r" Z% ]/ A& jverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。; x* x: A( T" t9 a
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。# v- W) Y7 r& [% K
    association_rules函数
    6 X) p& W3 ?2 k) Z. m( \语法:3 ^2 d: F6 O( ]8 n: D' G
    # r" }, A7 I! A, ^! ?2 c" s
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    7 y5 L, H; `/ u% a5 S1
    5 a& ?* R, ]! q0 k( {参数如下:
    # g8 Z2 D9 G# y3 m& K  e$ ]$ _& i
    df: pandas模块中的数据帧,DataFrame形式的数据;
    0 [' i5 a) }4 j( H1 wmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    0 ^' M) s0 e, t) m+ F! umin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    * Y& ^" l) X1 q1 C" hsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    " D9 D, n, z0 l: v. V! q附带metric几种参数的计算方法:
    4 `' D, d6 D" a, X
    . X# B+ c5 o6 z9 D% A0 q! M" n! U, esupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    0 [: F8 Y; J' ~8 D& t: o( a
      w9 e9 f7 D5 _* Y6 Oconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]: H0 i  D% _+ J6 R

    9 _. V( m% |" Q- {8 flift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    ! F' e2 \- N9 h' z. @! |* x2 h$ x$ t% m0 S
    leverage(A->C) = support(A->C) - support(A)*support(C),
    0 a* [4 {4 [$ f; k' G$ C2 Crange: [-1, 1]
    $ o% Q' H' T$ h" P0 r4 G6 K6 ^# O7 q5 h# N& `# Y
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    - Y" W4 {$ D& e* S$ B  [range: [0, inf]
    5 B+ a# P# y0 W! v" G, r* f7 l& e' N7 l6 r
    3.实际应用案例: [% i( e% z6 Z* S8 K& |
    以下为完整的调用实例:# n2 L0 A  a8 ?/ X$ t

    3 H& A3 b% p5 c* P/ dimport pandas as pd
    % d0 U0 ?5 \% |9 B# P  r& Hfrom mlxtend.preprocessing import TransactionEncoder
    5 Q, W$ _3 y  k* Ifrom mlxtend.frequent_patterns import apriori
    ) H5 t1 j  ]+ p* Qfrom mlxtend.frequent_patterns import association_rules
    * F. l/ T3 i* j3 L( L#1.构建测试数据) W. s  a/ ~3 J
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    / @6 c" J# K  }" K7 Gdf_chg=df['product_list'].str.split("-"); U$ ?* j8 w6 E0 |0 b+ T2 C
    #2.数据预处理
    + p! J; T. y4 Y7 ?  f#将传入的数据转换为算法可接受的数据类型(布尔值). X" I2 {+ L+ G' K  @
    te = TransactionEncoder()
    8 f( b* |" F: cdf_tf = te.fit_transform(df_chg)
    ( ?- D3 ^- T" {' L) l#为方便进行查看,生成dataframe3 o+ c5 Z# i* I$ a; Y5 R# q) K
    data = pd.DataFrame(df_tf,columns=te.columns_)+ l6 a, y- p( v: S0 I
    #3.建模8 `4 H9 B# B8 }+ s. {. u  e1 N6 s
    #利用 Apriori函数,设置最小支持度为0.2
      L% f% n0 a* d  L; hfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    + f" Q5 C6 z1 T/ ?4 r#设置关联规则,设置最小置信度为0.15
    # r* R$ J; [  C- o$ itemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    7 v5 X$ v% K$ s#4.剪枝并控制输出  H3 n' t0 Q+ T- m; ]" ^  g
    #设置最小提升度,并剔除对应的数据
    : G' i$ H! L; U" ~- c7 `5 J0 z/ I- Rmin_lift=1( L# w2 A$ Y+ x/ M
    rules = temp.drop(temp[temp['lift']<min_lift].index)8 i$ V* G+ w* i5 c$ `8 D0 a$ m# M' O
    #筛选需要输出的列) o6 c' a( r$ J; i* G" w. }
    result = rules[['antecedents','consequents','support','confidence','lift']], C1 G6 _; J- G. e' v0 W, t4 U
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    % A- \# d; L2 ~/ T5 Y* x: P* H2 ~result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')+ X! v  N" `$ I- M/ r& C5 K: `

    : A: ]: l$ @! l1 }) n1 D) n1
    , R3 q- [# g/ Q5 \, w# k- b21 \. e5 d5 ]% K5 H: H' j
    3
    * N  m: E  z; D/ M4
    0 {7 O0 T* m* R5 r$ _5
    + J2 C9 S# c1 j3 X6/ y/ a, j* F4 z
    7& A4 c7 ~+ R% b7 `. {
    8
    / y2 q' [+ j2 {9 t3 x. L9
    2 c& u% j, L- r# n# o, F10
    % i/ y# O9 ?4 W) [8 f3 e11* [* K- _2 Q! w0 f
    12) x1 L3 c+ x$ P  A: o# }& `+ |; p
    13  ~* w- X2 d" `
    14+ s$ u0 E2 b- E+ S1 m% {
    15: z0 d; d- z. `. V' r
    16
    9 t0 q* E  d% t5 u/ Z17
    4 R7 F+ R. y2 h) u" Z181 {2 t1 E* a" |0 G$ S' N- p
    19
    ' v6 T; C0 d4 {! l20
    : s9 R" l1 z, U3 m* C- r! z( @. I21
      V6 P6 B) V. p4 @# @* \8 B- s22
    , u" b- b) B6 \* |0 u. G  C: ]23
    8 j7 R/ F2 M) g/ V/ B& ~24: @# H9 K& C4 `( D7 B2 ^) L
    25
    + B4 _0 I, L0 B9 b/ k- {1 O261 M# H- z# j3 x- d  n+ o+ w" R
    输出结果见下图:! O, e5 e' v7 O4 j, l; u& j3 v

    ; x3 P6 ^. D/ X! l————————————————4 X" A3 B+ N( H2 s
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : G6 ~! z3 Y. u2 T5 ?. q原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207593 i/ a0 E% Q0 N* M9 M9 x
    1 h5 m- P7 c5 l4 y
    ( c& l# ?; f& ~- x& ~
    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-8-14 21:26 , Processed in 0.836651 second(s), 50 queries .

    回顶部