请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5044|回复: 0

[其他资源] 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    发表于 2022-9-12 18:44 |显示全部楼层
    |招呼Ta 关注Ta
    数据挖掘——如何利用Python实现产品关联性分析apriori算法篇+ V+ w3 ?# @/ L2 J9 q" l

    % N, T& B$ {9 e5 U- `在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    - E2 M: R5 g* Q  K  _! R0 q% t2 W; F: d
    1.准备工作
    : n+ H, O- }. P% `( K$ o如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    . F. N3 g; X* [' _
    : r# h  a* f3 y" ]) `+ o& Cpip install mlxtend
    / O+ q2 g0 l0 B3 K7 @1
    ( E+ C) A1 J8 Q! w) w为方便进行过程的演示,在此构建测试数据:2 V7 a( [% r% a

    . B7 \6 W! T' j4 r6 l; Q+ fimport pandas as pd
    ) Z9 N4 f1 l  ]5 Y+ odf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    1 P6 j' D( \8 w& k1; \5 {! k; D3 W# p5 L
    2% i5 b, t6 H' c0 G
    测试数据截图如下:
    1 f6 A5 q7 N# [( C3 y
    . P# H2 u5 p) K- ]8 K% E* k# e. R9 w4 N: f  j4 X
    对上述的数据进行以下处理:' t  J/ d$ R/ u

    0 i/ I7 S3 G& G9 J8 x; S  Mdf_chg=df['product_list'].str.split("-")1 b8 K+ R( `" ]
    14 |2 f  I1 r, D# i2 ~: L, u! P' }
    数据处理后,结果截图如下:: a/ g) P, ~/ v' }" D6 @- X

    ) `$ [2 W) p; N9 C3 L8 `截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。, w/ ~$ I" l7 z( t% j' m4 D

    3 y8 T& |, i* m4 ^% P" v( ~/ L) n2.核心函数及代码
    0 P  o  l: g) _" r3 r* J2.1 数据预处理  I6 F  }' n# ^# K, o7 r
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:# ?9 F5 Q& t  ~- M

    * F0 I. D+ {5 P  ?' ?+ T5 d#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    $ @% u$ o, Y# \  P# ~& n, y! Lfrom mlxtend.preprocessing import TransactionEncoder" H  |0 X' V% l* L6 H
    te = TransactionEncoder()
    , r/ f9 U2 Z. _& x" cdf_tf = te.fit_transform(df_chg)$ e4 U$ {* k7 d
    #为方便进行查看,生成dataframe; O* b' D2 _7 s
    data = pd.DataFrame(df_tf,columns=te.columns_)
    ( s2 g0 l% y3 \4 [; `- g0 w1; Q9 x# d0 x" q1 H# n+ a$ L
    2
    ; C8 q* G' T0 @3+ f+ T& g& ^/ ?, @+ [; }& ~/ x
    4* ]' s- [* g! J4 u4 h9 ?# ^
    5
    + e1 ]6 Y- a  O/ b, E6
    % R( b0 N" X! f7 M0 J# t+ N- h运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    3 e* B+ F, L% D7 l6 B& D0 ~, w  u! ]& {6 m- ]

    6 P: ]. U# @: C  ]$ O4 O8 K2.2 两个关键函数  m# L. x; `2 m) }
    apriori函数* O+ B$ @2 L  c% f2 o2 w
    语法:
    6 Z. L& ^4 y/ b. O) `* d' L5 B$ ^# ]( P
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False); k# _+ D6 i0 P5 X# o
    1: F$ O% R: r4 r# k7 x# ^: i4 [8 [$ }
    参数详解:3 W+ g- L" p4 P; R: O+ E! P& G

    * ?) R7 B+ }" O% D0 V1 z! adf: pandas模块中的数据帧,DataFrame形式的数据;! w- ~, ~9 I, u% ?! h( r+ E
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。# \* y% ]% S8 R6 l* K0 c- R
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    ; |, Q5 \1 U. a, W( g, Pmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。3 q' V0 d9 H/ [& v$ j7 z" d
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。  I$ o8 n7 b: N  f- U5 K
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。7 P9 j6 c5 p; J3 L- ?
    association_rules函数
    7 w3 d: C1 ^/ n0 @语法:
    ( ~. ]/ y0 m1 U5 {- q  U  d
    0 e2 U( b* o+ r6 ~/ V9 Vassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)$ r( e. j0 }; H$ }# F8 q. u+ w
    1
    9 I% S* B, z3 I; K参数如下:& F& w4 a- }$ |5 c
    2 F+ \  z$ ^$ u( q  ?3 c) L) l
    df: pandas模块中的数据帧,DataFrame形式的数据;3 |) H! O) ?# `' Q0 x5 j! S
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 R  z5 l2 @' [( b
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    : g: R+ I. k# V  B3 csupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    . M1 k) c. ~. L+ }  ?3 R8 s附带metric几种参数的计算方法:
    ! U6 {* z4 \# k2 c# }! ^
    9 i! |( I1 e3 n3 Ysupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    - ^5 y4 n6 V9 M8 a- \+ ]2 \1 W* O
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    0 e! @/ a( @( m) Z  o" }
    % U: u9 k* b1 nlift(A->C) = confidence(A->C) / support(C), range: [0, inf]5 G) o9 [9 j# b( l

    - u* z9 ^# `, Pleverage(A->C) = support(A->C) - support(A)*support(C),, n7 J, i+ e" q( ?* d  l8 r
    range: [-1, 1]
    ' o! Y! T& r7 F( A& X# q/ U
    # e3 ?9 O: n/ O. D  Y# i9 aconviction = [1 - support(C)] / [1 - confidence(A->C)],0 k2 U7 c* Z" Y9 S1 i4 {7 X5 {
    range: [0, inf]
    * c  ^0 b5 G( V+ |2 {7 J3 N7 y. y* V- S3 C4 U3 p2 s3 z/ g
    3.实际应用案例
    * u  E# T& T& Q# O$ S0 _# [以下为完整的调用实例:/ O7 c4 l8 M" Y

    8 }6 {( b7 K: m/ ]- n3 @% }0 nimport pandas as pd
    $ b. j% z) [4 P: ?# z) ?4 pfrom mlxtend.preprocessing import TransactionEncoder
    + ]; {6 |. Z. O- @& v8 Kfrom mlxtend.frequent_patterns import apriori! {4 j6 G% K0 R2 v
    from mlxtend.frequent_patterns import association_rules) k; t5 n8 ^- I% b2 L5 [/ p
    #1.构建测试数据
    6 t8 l, J7 o7 L5 b# h  Fdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    & u& L& F; e1 D4 d! pdf_chg=df['product_list'].str.split("-")# j) H4 T8 v. M8 ~
    #2.数据预处理
    6 _0 p, F; P- k5 Q6 \#将传入的数据转换为算法可接受的数据类型(布尔值)8 K! H% v% y3 D( H
    te = TransactionEncoder()
    " `; B! C  \$ X. U8 {7 Sdf_tf = te.fit_transform(df_chg)
    ' S+ [$ y% v9 O; P3 w8 C#为方便进行查看,生成dataframe+ g, h, q$ [( f" S3 w  W% S
    data = pd.DataFrame(df_tf,columns=te.columns_)
    ( ^% a; F4 B% l, B7 ?9 J2 P. K& w1 V  L#3.建模9 Q9 x& j3 p5 s) s7 R* _" A8 p
    #利用 Apriori函数,设置最小支持度为0.2
    # r6 t* D; u7 a9 v1 Ifrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)2 r5 u! Y- K7 f" I4 a8 m7 I
    #设置关联规则,设置最小置信度为0.15
    / |# o+ q% h( r9 Qtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)5 U- L( ?+ u5 j0 R8 e  X: d
    #4.剪枝并控制输出, r$ I9 a1 m1 X1 U  l; E
    #设置最小提升度,并剔除对应的数据- d& G  b6 Q* A4 P. C
    min_lift=17 K% H# k% Q2 B) ^
    rules = temp.drop(temp[temp['lift']<min_lift].index)* u* {/ A) @3 P' e9 m) n" v
    #筛选需要输出的列
    2 t9 @# K5 O4 S9 |' S/ O4 u) Mresult = rules[['antecedents','consequents','support','confidence','lift']]( g& y# e* k- F, e$ Q
    result=result.sort_values(['confidence','lift','support'],ascending=False)9 P" _* ^( i  E+ v5 H
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    : V! _! a; {: k0 `, R# h
    9 u+ K& Z' @* L2 ~  Q1' R2 v- u* a& f' ?0 d
    2
    " @. _( T8 j& q3" P- N. T8 `" Y% A0 [# U" j9 o
    4
    % b6 v0 n0 r! r+ }9 r5
    / b6 b9 \; a9 q0 F69 R1 ]5 o$ U2 B- Z- }) L
    7
    : d& _: S( T: l  N( k, M84 e- n" F) ]$ v
    9
    4 Q2 T8 B6 T2 I6 y& ]10
    . y- k: ?6 c3 `* c" p2 C' v, S11
    - \9 U" y& }# }7 X2 a12' U# C4 W  S* J, y! |) c& G$ q
    13
    ! O% z' |0 ?5 Z# N4 }14  t2 x* W: M5 }! c
    15: `5 m, J( _2 q$ n, ?3 P  |8 e
    16
      B/ G6 w  F* a  n174 E4 i$ i, G  q/ X) X+ ^" k
    18
    ; J2 \9 ?/ B& l. C. \5 ]19
    * q. ?8 r3 P% d% P: P20" B( w; ^# x6 b  C2 W
    21/ F& J2 B! i4 h# h9 Q; T
    22
    . @- {, j! ?2 _235 r9 X6 M1 m, ~1 {. h' a1 H! X: R
    24" B- k( T% J# W$ F' S8 p
    25$ M1 G6 }; t$ j7 `4 `' `" P
    26+ O+ u3 B# Q  l  S5 J& n: u% }0 R
    输出结果见下图:
    8 o; O: ?9 l7 z9 c/ m
    7 g+ R) }$ O9 R, t4 _! H————————————————
    # j) D  L. V) b+ \, {4 c  ?- h版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ t4 p. T# _. V0 X  }) ]原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    ! U+ T- Z, K+ x7 g$ S4 C7 L/ m
    ! \. O" X( @# V* {3 Q1 D3 z
    % X! I5 ^9 r7 M$ M3 ^9 W  M7 P' ?
    zan
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-15 02:43 , Processed in 0.367251 second(s), 51 queries .

    回顶部