QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5042|回复: 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算法篇
    + h  w# W- C+ t% M% d. ~% P. A: Q+ R6 s# {5 Y; H. P
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    & s* i- G1 f* z
    * W1 L, I  u2 T- Z1.准备工作
    6 F' g2 e- C+ f$ X如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    - _1 }/ P* c- S5 h0 D
    0 c1 q  z* b# a" ]  j6 n+ fpip install mlxtend
    ( G# w0 N9 G+ x10 ~7 N2 H( c. \* A
    为方便进行过程的演示,在此构建测试数据:
    : @  Y3 e% o9 p; t
    ' m: F' k) C1 {, C( I$ jimport pandas as pd4 s7 Y+ H4 y; w4 v0 V0 N1 n
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* q9 n  K0 H3 a: d4 d1 |
    1
    " Y2 T3 `. F0 `% G" L5 H* h1 N3 K2- K6 e1 j: Z4 f; A" e, \
    测试数据截图如下:- }: @/ b/ z% m' B
    0 C5 J1 t9 r% W

    2 ^7 L9 }, R, Z3 N对上述的数据进行以下处理:  }5 p$ {$ J8 W  _, |

    2 q8 Y& L; K' edf_chg=df['product_list'].str.split("-")
    6 N5 w! i1 I+ a( @! b1
    / Z; k, e4 D1 h数据处理后,结果截图如下:
    3 d# k/ E1 q; o* [9 K' r5 q6 }% Y4 a3 E. z, y) t( ?$ `
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。: r/ X! U" I$ B
    3 Q: V& O! Y0 v  P
    2.核心函数及代码! X6 L) B( V8 S# i2 Y& @& R1 w
    2.1 数据预处理
    3 T. ^7 n) ^# V: A! A6 k对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    . B6 z9 d$ x, U* r  l
    + \- s6 ?3 o6 B/ m, h& K#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    ; ?( \* x, V8 s) Afrom mlxtend.preprocessing import TransactionEncoder
    0 Y7 A3 K& Q! }# |8 N3 ~te = TransactionEncoder()( o- p5 _( A. _3 K) ~* m
    df_tf = te.fit_transform(df_chg)0 D, F0 k4 o% D
    #为方便进行查看,生成dataframe/ f% |. T5 v9 n( _$ ?
    data = pd.DataFrame(df_tf,columns=te.columns_)3 I& B( s6 _' F1 I7 o- h; ~
    1# t7 F! Z' P/ {1 u* x
    2
    0 L8 O2 V+ u3 S# V) R/ D3 R+ s6 W3, M! `1 K0 e1 F# t8 s
    4
    % }( K) G/ h: s; b$ m4 ?$ _. K1 l0 X. p5& A+ P" g) z/ @/ U1 `# z$ F0 @
    69 K0 [7 k" R* l$ M1 {
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 V- f" }; D$ d1 @  F
    + H* F# E1 C! {& M+ f# H3 Q$ w
    1 O% U2 N3 K. d% C8 y
    2.2 两个关键函数
    , o* y+ I' r" Zapriori函数
    0 K; e- G( d* m1 d9 o8 D5 e3 J; I语法:
    . z- Y. g; o. A+ ?4 ~1 r/ i4 `: A9 ~# G' `" m, ]
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    , M& X0 H6 P7 F; @, R: L1
    8 O( f& s5 i3 c* g9 Q8 ]8 _参数详解:9 {5 w; i2 u7 z/ @- P$ L- Y

    . l3 I" m5 q' Zdf: pandas模块中的数据帧,DataFrame形式的数据;4 r9 O; ]& w/ e/ C& a) \3 p
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。2 L# [+ ^8 }$ d0 i7 H
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    , h' p% t' A8 ~3 m2 nmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
      A$ i6 B. `: O4 bverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    ! y8 ]( x9 w/ j3 l3 alow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    ' E, Z! B0 w( _+ \6 R* s. n  ^association_rules函数
    / t9 [; M; t  a' ^* ~6 C% D语法:' _) I) m; d+ T7 ?6 Z4 A

    8 f/ C2 D+ w5 rassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
      F5 g# Q9 m* m3 e! B# d1
    2 u7 J4 \: C: L% u8 }  _参数如下:
    0 v7 F$ V: H: V- b  k
    0 S4 g8 `2 D- r3 Ydf: pandas模块中的数据帧,DataFrame形式的数据;
    * z0 i. C: G/ jmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’+ r7 e- N9 }9 h( b5 I  H, J
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    * O5 z% [2 M: A8 z) `7 W8 qsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。4 F" t' L  F1 {: R/ T, B& `
    附带metric几种参数的计算方法:
    3 l6 d4 s9 q; x5 K* U3 X- N* U
    5 v: z& R8 n4 A5 i' osupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    ' ?% j) _; t! v: D& Y( X
    . x- b9 R( M% s  C" lconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    2 W  V( @* o# G% x: i* Q8 U* [% `2 u  p/ F% A
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]2 q" b1 w/ F9 S) i
    6 u& j) n9 I4 s( z
    leverage(A->C) = support(A->C) - support(A)*support(C),
    1 g& P& C6 E; c8 d3 z5 C# r6 Erange: [-1, 1]) I. ?4 T" J2 D& l8 ?) F- T
    4 V% q/ J6 H! R+ Q4 ^
    conviction = [1 - support(C)] / [1 - confidence(A->C)],7 `+ R: l! y( j( y: N3 k, r8 K$ m
    range: [0, inf]3 W1 s0 y+ _, X2 a% i  c( L$ S5 M. u

    / ^% D  g+ I5 n5 y3.实际应用案例
    ( C( Z9 K! r/ ^  F1 Z以下为完整的调用实例:- m- d! G0 u0 G/ D  r9 L
    3 X* |$ n6 g& i' J) m
    import pandas as pd. m! q# H+ I* d$ I2 @
    from mlxtend.preprocessing import TransactionEncoder6 Z1 q' d% y0 a( o  c2 R2 E* \
    from mlxtend.frequent_patterns import apriori
    * s! _' x4 r6 [' |9 V. A* N# J( Rfrom mlxtend.frequent_patterns import association_rules
    2 Z2 ?; c7 }$ E4 Y+ \( z/ J#1.构建测试数据( _8 s7 G" a9 C. K9 x" V
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})/ k! K0 ^# h" Z- Q- Z
    df_chg=df['product_list'].str.split("-")# ?8 g/ C# G* v$ h
    #2.数据预处理0 f$ k) ^( q, c7 S
    #将传入的数据转换为算法可接受的数据类型(布尔值)8 T8 s1 d3 h/ {6 N
    te = TransactionEncoder()
    , d6 @* \5 e- ?* J$ o' Udf_tf = te.fit_transform(df_chg): V- {% X6 F* C& n1 F+ W  f1 D
    #为方便进行查看,生成dataframe2 t7 V; p' N. P; u
    data = pd.DataFrame(df_tf,columns=te.columns_)
    9 G5 D; Y  A) I' q: X+ {#3.建模
    & u1 J: p9 y3 s) d1 ^5 k/ i#利用 Apriori函数,设置最小支持度为0.2
    ' p* R# M9 P; T# b8 r. d8 I1 hfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    " t5 ^  w3 m( n4 z1 d/ G0 O; G#设置关联规则,设置最小置信度为0.15
    8 }$ B* a- G, M" S6 Htemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)3 d- W# T' s/ Q$ I
    #4.剪枝并控制输出: S5 u; f$ e" m
    #设置最小提升度,并剔除对应的数据3 X# j3 f2 C; y6 Q; `
    min_lift=10 _' K6 J$ o- W& b
    rules = temp.drop(temp[temp['lift']<min_lift].index)
    $ `: I' J, _  [; g0 e6 I2 Q#筛选需要输出的列" ^( }, t- T: G* g
    result = rules[['antecedents','consequents','support','confidence','lift']]
    ' D. U/ H- l0 j3 F. ?  E  \- S4 H0 aresult=result.sort_values(['confidence','lift','support'],ascending=False)% G; K* N/ t. {* ?$ V  x$ ]
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    4 v) |% l+ x+ c0 C1 T7 ~+ j+ N* E: F: l) {2 I: q1 A' N4 r0 D
    1: w: y$ E. q1 {1 q1 b
    2
    1 h$ N% b8 w7 ]" t+ \* A2 ^3! G9 _! _2 B: U, L) U* T5 ?
    46 P3 T. m+ B2 u+ V. W; }
    5
    - r& }5 P& J: e+ f) F# L6! e* n0 j. U  O7 G0 B" z2 J
    7
    0 _) g7 p& \% w0 d$ |5 A& m8# P0 G$ o# i% y' {5 P) D
    99 z) ^2 M  j& I! @) k
    10- V7 l$ W$ K5 A5 ^
    11- R- r8 F" q% m
    12/ b: L4 s. r0 f' t  L
    13
    0 y$ K2 N+ N: [, q* |; ?14, M+ D- A4 _, L( L" x2 j9 R
    15
      R6 c9 V- b" ^+ \4 M, F9 F16" `; f8 y1 @* `* {0 S1 w: g
    17% b2 d/ I9 {( z7 l8 ~
    18- x! A) R: x  H! I* b" H2 {8 U, J+ z
    19
    & @7 V9 o# H" U- i4 k20
    * y2 Y, L" t3 y/ {! q; ^' s21
    ' w) [" P" [* \' b# e- j) u22" y1 X4 }7 V7 C- O
    23
    % k6 {$ {% w/ f9 ^4 {, H: n% R24
    0 ~* V! b' i+ k25
    5 Q0 U3 \) b0 H1 [26
    0 w/ P& S' D, [2 I' ]4 A! q8 [输出结果见下图:
    8 ~9 g3 j2 v8 G) y1 Q& e+ J: b! C/ O" f$ ^- H7 G
    ————————————————
    8 e& e$ r6 k( n, C$ p4 y版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! V1 G: e- {. D0 c, |* B
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759  T, ^  B7 S* _( ]5 N# t
    7 q! O2 u& h* R$ d1 j
    & S4 u% G+ _/ f7 l5 g
    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-9 22:18 , Processed in 0.334522 second(s), 51 queries .

    回顶部