QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4990|回复: 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算法篇
    , C9 o7 m- n' o# n( _6 P# L" f9 n! Q. M$ r: F0 G
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。- o! |: m+ z; T$ n
    " a, K$ t7 [" z& J
    1.准备工作
    6 L# J$ l; D& e- l: G如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    # D* t  _& V6 K/ R* i6 a5 {) E$ n; r5 a1 N8 k- \5 ]
    pip install mlxtend6 T2 J8 p; H# ^
    14 \3 \6 F1 N" ?3 s. L' Y5 n) b
    为方便进行过程的演示,在此构建测试数据:! I" L/ J- @8 L4 r

    3 r1 _0 c! _" D3 L) m2 }' ~import pandas as pd
    % d8 I. G1 U  y' d( M" n+ g  tdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})) Y5 r+ j. \. ~, G& v) L
    1
    & ^& p( d' X9 C25 H& t$ [- ]& O6 h
    测试数据截图如下:
    : r+ r7 m' Y8 A+ `# _5 ?+ S4 c1 |* [7 j
      r* I" @2 _1 \' R0 Z
    对上述的数据进行以下处理:
    3 _4 Z3 G( r* Y. t, l6 B" i& O) a6 Y0 C* d( Y5 b
    df_chg=df['product_list'].str.split("-")3 I# }+ \+ _5 ^' }7 i6 {
    1. j* X/ q* `) g* d+ ?& m. Y9 z
    数据处理后,结果截图如下:
    : G! c5 x4 m3 y4 L3 O0 Q/ v5 C* c1 v1 F# E% `
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。9 T, ?4 F5 v3 }. {4 P
    $ z+ h& W: n# z  J) d
    2.核心函数及代码
    1 @; Q1 G/ y  _8 n6 }2.1 数据预处理
      X/ y+ H  @( n0 e- c( b9 j对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:6 U# Y! e0 e. V

    ' _! p" H% i6 P0 X1 E. p; N! r#1.将传入的数据转换为算法可接受的数据类型(布尔值)" X) Y* t& |+ t' @1 o
    from mlxtend.preprocessing import TransactionEncoder
    1 X1 v% B  O- [8 ^; W- e/ tte = TransactionEncoder()
    " s( h/ }9 C* P; Ndf_tf = te.fit_transform(df_chg)
    ! j8 c1 W& L" g3 B" d#为方便进行查看,生成dataframe
    / o6 `8 q9 t/ r6 N, }6 edata = pd.DataFrame(df_tf,columns=te.columns_)6 a! J$ R- d/ B6 @! N* f# _0 ~
    1
    % c6 i" {1 @. O" x0 _8 a2
    . J* i( K; M. z% T3. }9 \) i6 z/ b6 d8 J% b
    4" P1 a& ?+ w0 |, x6 j3 t9 L) z' h
    5: J2 ]3 h+ _8 G' l5 y. X* @
    6
    8 Z1 m/ Z$ \3 [" I* ~运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
      i$ K& [. q% d$ m* J1 C$ M" L0 M$ a* l7 E, m5 ?" v7 q

    6 V/ d2 H8 t& f: |2.2 两个关键函数& t3 J1 d6 D8 v3 p7 B
    apriori函数: ?& t& A$ S& k$ S/ l  _, w. y
    语法:; x* Z# A* s2 R, f

    : n7 N' _8 s6 l% o" V) kapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False); a$ `. ?0 k8 y! }% ]
    1: D7 }2 w/ Y/ A; S+ ]; D5 d
    参数详解:
    7 i: W! C: E1 E; E
    6 m6 x( s2 b* v* P6 P$ I  Rdf: pandas模块中的数据帧,DataFrame形式的数据;, u: Z6 B4 f) e" o
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    ; w) ]$ @: Y( |5 l3 Euse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    1 N& z" O' Z! M9 U1 g! A* Mmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。, ~  T" y; f& `1 W" }  T
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    , w. m+ x3 g8 h4 U' I6 Hlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    5 L4 c6 T: v# ?2 P5 P; n# Uassociation_rules函数3 Z$ l2 m/ c  q% w8 k
    语法:3 V$ B% [, V* U) y- V& `7 S$ I

    6 S2 F2 D$ N/ ?) iassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)7 a6 g3 Q2 Z, z7 w! l
    1
    6 d* ?' w, O" L% |3 k& l参数如下:
    * n) B" ]6 S1 d  L* ^2 _5 F% j8 z# K. x  B. p: A
    df: pandas模块中的数据帧,DataFrame形式的数据;
    ! ^. N3 m; V& [4 jmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    ( n% _! n5 R' q: P& v6 dmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。' \/ \6 h5 k: r5 ^! w- f9 q
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    ' G( Z$ }( t5 ]; o9 J7 ]附带metric几种参数的计算方法:
    4 k- |( d2 [  s3 i- Y5 v
    5 t- ^, b) E& [$ w/ n# ^( E$ v8 H/ Asupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    5 X9 {+ v" U  @3 d: s8 e" j) S) w+ M9 l2 Q6 G4 N6 q9 K
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    5 A+ _2 |& q4 O6 ]0 j0 O, F" N
      s+ b+ v4 A! J4 K9 B9 Hlift(A->C) = confidence(A->C) / support(C), range: [0, inf]& P! E/ m  q& N9 ]9 n5 S* L7 N

    1 v( \' j6 h1 y7 T+ V" p$ i( Hleverage(A->C) = support(A->C) - support(A)*support(C),
    0 r4 d/ J) @5 _. q; b- j) hrange: [-1, 1]
      m4 L( P1 _- Q( A$ N- G# ]) J2 Y, o+ T' j2 v" R5 ?5 m$ p2 p
    conviction = [1 - support(C)] / [1 - confidence(A->C)],( @5 P7 ^/ w- S8 x% X" @
    range: [0, inf]0 a$ K: u+ ]7 J) d! n2 _4 l: `

    4 v. P, h# }% R3.实际应用案例
    , N8 J3 Y8 k* b  @3 \9 D% e以下为完整的调用实例:
    # n/ G7 u; ~( }7 }) |6 e% l% i  K5 x/ k- C1 w, {
    import pandas as pd5 c) D; u- j& C# S+ c4 S) [8 M! P
    from mlxtend.preprocessing import TransactionEncoder# X6 K# L# p/ r
    from mlxtend.frequent_patterns import apriori1 w3 w* O2 B& f" S4 w; x3 U0 a
    from mlxtend.frequent_patterns import association_rules; s" h3 k- W* S. Y" R
    #1.构建测试数据/ v' O0 X# z7 f5 d
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}). t: \& m  N7 h. z8 C/ ~: Y
    df_chg=df['product_list'].str.split("-")
    7 ^1 Y7 u! E& e( _#2.数据预处理
    6 Y- ~; v7 ~! g" ]. w+ B3 k#将传入的数据转换为算法可接受的数据类型(布尔值)( ~4 }( N4 Y7 _, o  x6 p% ?0 r
    te = TransactionEncoder()
    " [9 `( Q) N# R0 L/ Jdf_tf = te.fit_transform(df_chg)& n/ j4 k! m. `" B9 H0 ]: s
    #为方便进行查看,生成dataframe
      T+ p4 ]( }  X/ Jdata = pd.DataFrame(df_tf,columns=te.columns_)# X6 }: _# J/ H# q& l8 l
    #3.建模, t" z0 E8 O  d" a$ Y" I0 J
    #利用 Apriori函数,设置最小支持度为0.2
    ) Q, i  q' F3 j, B* W1 E+ tfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)1 h3 B. h, \- ?2 X
    #设置关联规则,设置最小置信度为0.15
    & L& d; w: w4 j- X# ?9 z7 Ztemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)% S& i' j% z( e0 [; S! j+ U# }: Q& o
    #4.剪枝并控制输出$ |1 v6 S8 ?. [# {5 S$ W
    #设置最小提升度,并剔除对应的数据
    0 j; l  k1 F) x4 _min_lift=1
    2 K/ R- k9 B9 L% C* }) f( [8 Srules = temp.drop(temp[temp['lift']<min_lift].index)
    " `% B7 U# ?" `1 S. X4 E# t#筛选需要输出的列
    / o; j6 h0 s% A: A; [result = rules[['antecedents','consequents','support','confidence','lift']]
    . e8 X* _4 ]- r  @. c) q) G/ oresult=result.sort_values(['confidence','lift','support'],ascending=False)  Q+ F0 Z: u, Z/ i
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')3 v/ m& H# S0 k: p5 i) C/ O( f- S
    + h  q: D9 ]& |( H/ r& V: U7 S
    15 y- s8 f2 z( k! v$ e0 ?. V& i4 @$ t
    2' `! F9 U8 U% U/ Z" z
    3
    ) Q; y  w# C4 X4 v4
    ( r9 \/ m! f5 w5
    , i( f3 x. o; |7 G6
    & z5 w, k# a8 H' h! c& c# E1 a& G" J2 S7
    ; X2 s4 ^$ y( ~6 R+ J9 M5 m0 X8
    9 F% s% |& T+ X5 O9. Q2 C" C: G0 x2 X# Q
    10- X0 t. r3 e7 H% _' K: F
    11+ h3 H( T, |8 d4 f" @
    12
    ' I$ a. M, N+ E" [! u# u1 K( Q4 a138 k( x( u% o; e" P
    142 J+ K, d/ m- G, o* M  B6 g
    15/ X; C5 k' \: N: c3 p! B$ b
    16. I& ]. j4 R( |& k8 d, H! c- }* p: ~/ o
    175 y1 ?' o  h! F% `
    18
    / j; h  [4 ]& W4 [, c192 v2 h4 C: @7 E# |
    20( i5 `/ Y3 j- S9 c' i
    21
    ( V4 X  X. M, }7 c3 V22- \0 q2 F/ {9 d6 x" f0 S- H5 o6 L  F
    23( ^# A+ e' D: g% L0 d: }
    24
    - A, I$ ?0 g: L' A. R& v* n25: O2 X! m$ s& y+ U0 k
    263 \0 G9 O4 `' E: V
    输出结果见下图:
    : z8 R7 n+ A% N6 [8 L8 d( z/ i
      I* U  Q' m$ V$ M8 i————————————————
    1 G+ [$ _, T" _5 c- E1 y版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ ?" J+ p3 R* p; y$ m' D& @1 L原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    6 N6 H* g8 L( e2 x% Z" S6 |3 F1 H2 f# y

    5 R* S; A; G0 n
    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-5-2 17:38 , Processed in 0.464298 second(s), 51 queries .

    回顶部