QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4970|回复: 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算法篇: l. H6 D7 \# B* \# R' V4 r3 s) ]8 @

    + g% h& Q3 c  A在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。. Y. ^6 }0 z8 k3 b% ^) W

    . S1 \# }5 `- J) p1.准备工作9 F$ y) z% x7 x. U* a
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:8 M  ^- v* H& ^/ p& S0 y5 O! _

    : [2 [6 x8 w" w- ~1 z" P: \9 @/ `pip install mlxtend
      ?9 H' x9 n2 O! M6 ?$ a1
    5 l. a( Z+ G! K6 U为方便进行过程的演示,在此构建测试数据:
    4 ^4 G  M/ e6 P
    9 @# o0 P3 D2 n2 K4 A6 S2 Jimport pandas as pd1 ~: X) j' H: E. r$ R
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    - h% {1 {: F0 Q# S" H5 x3 X1
    5 I. V% n3 U5 z2 O( E: U! b2$ A3 o3 p( `( _3 ]0 O  r
    测试数据截图如下:5 A! {  ^, A+ g& \# K9 N6 e; s
    " q* H# y' J+ a: ]7 Y9 a/ b. }
    9 U9 v: E3 q$ L6 a2 s" a- R1 @" l
    对上述的数据进行以下处理:# x3 {( b* ]1 B1 M3 B
    6 n, j( Y. Y8 C2 H/ H8 |  a
    df_chg=df['product_list'].str.split("-")# q2 J9 r1 O2 z: M
    1# l6 ~" e6 m( N. S6 `% T
    数据处理后,结果截图如下:
    . D( X- `; w2 V/ h+ U
    : G2 I7 l7 H1 i3 k7 F$ P截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。  f. h$ L$ ^8 _' h

    4 V( ]; ], p' N# O# ?: D, e" i- i2 I2.核心函数及代码
      b, r- I, Y4 N) k% i2.1 数据预处理
    / ^9 y7 b" ?) r- e3 l对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    1 v4 c- t9 v' c- u
    ; a0 b. r/ F( Q1 H) R5 N+ {5 E9 ]- L  `#1.将传入的数据转换为算法可接受的数据类型(布尔值)5 Q7 Y% R* G7 S; A
    from mlxtend.preprocessing import TransactionEncoder
    + A" t4 f4 ^7 u5 R" u, \8 Bte = TransactionEncoder()3 q. ^/ v+ s- c4 z! z% y
    df_tf = te.fit_transform(df_chg)# Y9 M7 u# [) s: I) c
    #为方便进行查看,生成dataframe# I: t. i! t( z" A- o
    data = pd.DataFrame(df_tf,columns=te.columns_)
    4 [! \* ~$ k  u8 b2 P1
      A, w8 C) I7 P" |/ ~9 U3 _* X1 L9 q2
    8 f2 K4 H, B! t- ?! Y' ?3
    $ y5 S0 Y* b- I' y4
    7 E7 e  b' ?8 U% V/ S, a5
    4 P' R9 {! m  f8 E( O! x; B+ a" Y66 K$ O0 \; j4 S. [9 Z
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    ( e$ X: L/ k! }- O! w# M! H; H$ \3 T
    ' i; Y8 _  h! `3 v$ h2 c1 A1 H* C- w( T
    3 T: U3 }" v5 X5 \, ~2.2 两个关键函数6 V$ Q; t1 O  }
    apriori函数3 V' e9 N) y; K0 I8 s! |
    语法:* V) d0 U5 W$ x0 V1 d8 R' O' s

    ( N/ `% a" V- V) ?# qapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    & i$ m# X! o! K- `) h# K: j0 ]- t& Q1
    / v( Q) Y% {& K( _) F6 p- Z' ?7 z2 e参数详解:
    6 x4 x" B1 [1 f& g# R% k7 X+ W/ B3 ?8 z6 M: J( o
    df: pandas模块中的数据帧,DataFrame形式的数据;0 E  W% l  T0 w4 H6 U( i: S
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, x$ [9 g9 U* Z" y/ w
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    & H( c8 Q+ ]/ M$ N) T4 e- R( e+ M# vmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。9 J2 u- W3 N  g) s
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。! v' D4 Y) b0 j9 ]  S
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    0 n7 E# N1 x( ~: ?association_rules函数
    4 l. k0 r0 Q8 c5 \* n语法:6 K, R6 J5 e4 J: h
    5 s& r' L3 ~: S- ?5 X1 ^; [- U
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)% @5 O2 t# C8 A: |0 ~" w4 U3 s/ a
    1
    1 R: F2 p2 i! M3 w; m- w参数如下:
    # @3 |/ o" ?1 f6 K/ r8 R+ j3 ]6 `# W8 Y$ U0 j+ P$ o3 W- A
    df: pandas模块中的数据帧,DataFrame形式的数据;7 s1 L' U2 }. Y2 |- p0 K' a
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    / [' V0 E1 V2 j, Hmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。! \( p" T! X8 `* I
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    / @7 B5 \/ ~5 `) L附带metric几种参数的计算方法:
    * y% Z" L1 A- X8 u$ m
    * J( G% {: y6 k( V; S8 C9 u4 Fsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    ; u7 V/ ~( _2 x! ^; ]' D$ e
    ' K1 R; H" {$ ?9 `# q1 u; \; _confidence(A->C) = support(A∩C) / support(A), range: [0, 1]/ d1 i7 j9 L0 K/ m. \. X
    . W( @6 R* a) y7 k* B; k# |* ]) O
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    ) ^% H8 @( q! N! o5 N9 _& Y) h' t: U# o8 @/ ~
    leverage(A->C) = support(A->C) - support(A)*support(C),
    1 N" [0 E" ?; I) m5 [' l) e6 J' Irange: [-1, 1]- j, M1 f0 p5 C. [7 {

    4 v! g8 i1 {/ |! H/ l* U$ T2 aconviction = [1 - support(C)] / [1 - confidence(A->C)],
    * i; N0 d0 |. `( c6 b, }/ Prange: [0, inf]  B, V& @8 X7 V+ V* L1 l1 \* a
    $ Q& S( R, m( l3 Y8 ~# U# {
    3.实际应用案例6 l% D& U! H$ ]( g2 Q- {: |/ w
    以下为完整的调用实例:9 G+ Q1 P: \( v

    , [  X$ |; K: Bimport pandas as pd# }. x) x5 n4 l$ J: ?4 W" O
    from mlxtend.preprocessing import TransactionEncoder2 k1 y* z# F( f
    from mlxtend.frequent_patterns import apriori
    # S/ G# K/ s9 S9 d4 Qfrom mlxtend.frequent_patterns import association_rules: k6 ?: W" I" d4 n& @3 [0 `- W
    #1.构建测试数据
    : L& b6 J- N/ r* t; i3 Q* E% q/ m5 Vdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})6 k* j0 A8 R- n0 N3 V! c
    df_chg=df['product_list'].str.split("-")
    + w+ y4 ^" ^8 @2 j#2.数据预处理
    ( ], Q% }4 H& k" ]* Y3 U#将传入的数据转换为算法可接受的数据类型(布尔值)- n0 j) ]9 B1 j7 y6 J. X
    te = TransactionEncoder()
    " Z. }. \" D$ _df_tf = te.fit_transform(df_chg)
    : O  w6 X* W2 v% C6 i#为方便进行查看,生成dataframe+ P- V8 \: h9 M1 _/ R6 q. @
    data = pd.DataFrame(df_tf,columns=te.columns_)
    " Z% q+ v5 @& V' z$ {: U. g5 C#3.建模9 _7 h2 h2 t/ T. G
    #利用 Apriori函数,设置最小支持度为0.2& B6 R2 Q* c9 {$ |/ c
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    " B$ W+ V) r* A$ s0 O$ E$ a#设置关联规则,设置最小置信度为0.153 G" J& u) k/ {% I# r$ f
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    ( T; i# E# {8 W. D#4.剪枝并控制输出
    ! l; ^. Y. w. G& P#设置最小提升度,并剔除对应的数据% g% b; C$ b5 z8 y
    min_lift=1
    # J4 h) x7 J5 qrules = temp.drop(temp[temp['lift']<min_lift].index)4 P, H9 [* J' l/ z3 g) Z
    #筛选需要输出的列0 U% i/ v9 H" h' t0 T5 p' p2 x. C  s
    result = rules[['antecedents','consequents','support','confidence','lift']]5 g+ K6 j& K9 T. Z% }7 [3 W- C
    result=result.sort_values(['confidence','lift','support'],ascending=False)0 g$ s4 ]6 }* B/ V3 b/ s; T+ x
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig'): p: n2 N) l  Z0 r5 B* I1 U

    " h5 `4 Z  [" f# M6 |1$ t5 a! ?7 p! |( O' Z
    20 M3 g0 U1 {2 Y
    3# s0 ]9 f& D0 m) Z/ p
    4
    2 t; b% u% e' T0 t, @' F3 e53 h9 x+ Z6 Y/ S* v
    67 K4 y2 j: y0 P& s/ d1 n
    7
    ( w/ z+ x" a  B8% w/ p/ z7 E1 s& k; b3 t/ K
    94 v. D5 }5 t6 q
    10- Q7 m1 k+ o; C) @8 l- ]6 V
    111 e  ?# u! x. Y0 j+ c2 v
    12
    " V: Q0 {6 _% A1 L13& ?8 x8 b1 U' S0 ^+ \9 J' B' j# u
    14
    1 X+ h9 j: [" B+ Z15* Q: y( r  F% C" m: A4 w
    16
    % q; C2 n) j" {8 F+ r, ^# H17
    7 o  `7 D9 |. h! B$ l2 K" Z7 t18
    ( a7 A* L3 C" i: X* p# z+ K( e& G3 l19- y' }7 ]- x* {. z) t
    20
    ( }, X+ N7 W' @, j$ ?% M21; o$ A+ H% y% K3 v7 C# `" v; s
    22, O9 {7 ~. q! i) n- E
    23
    7 y$ R% ~# r7 ]. a2 R+ o- X9 V24
    2 k5 U& A; g, Y/ `; L- K25$ n# X1 t  M! F% t" x* v! J
    26
    7 \& t3 X" O8 B6 Q( G输出结果见下图:
    / p9 m5 U# J! [/ D% d- V' M: u. d! ]9 [% F; c( d) R
    ————————————————
    + A) G, }* H. A. k) e, f' q版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ {5 a, Q) p: F5 C4 \原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    " q6 q* d. i9 N' I7 i0 m, Z
    + X# B* }# f5 }) C% X
    2 T6 u5 z( U7 @- H6 ]  {7 }- [; J) U
    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-4-10 12:33 , Processed in 0.375278 second(s), 51 queries .

    回顶部