QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4366|回复: 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算法篇
    % X2 e! X% s" M8 ^6 I) k9 |+ Q4 i: Z
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。; O; F' b/ @4 s8 ^! z4 x

    $ u( d( {# s& x8 k: U1.准备工作
    ; S  [0 H, b4 q# S0 U% [如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    / H' o5 E( U: b+ B2 Z( R! g5 D: j3 ?8 \6 ^
    pip install mlxtend2 R) b1 A; }! y3 x1 t( D6 y/ k
    1
    " G9 l; L8 z# c/ p& a. s6 P6 L. e为方便进行过程的演示,在此构建测试数据:
    , m# [+ Y3 O# K# I# [5 g6 M% t
    ' Y3 |8 {3 C! m& x$ n! Limport pandas as pd1 q  M5 M% j. s
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ; M: Q8 M& B1 Q' z1
    0 C! `% f8 g7 D( f3 f" ?0 J5 c1 G25 E  z9 l- j" U9 Y3 W
    测试数据截图如下:. c3 q8 ?5 t( p! ^# L  T0 I

    + m  O) T. {0 v  g- E" C9 F7 ^7 f# U  k" N! l3 X; K
    对上述的数据进行以下处理:
    , N; L; k+ A$ b& ~4 c( p- {$ u1 t2 M3 A$ q# g
    df_chg=df['product_list'].str.split("-")) l* j9 K3 N: C; @
    1
    ; y0 I0 [- S1 V0 V数据处理后,结果截图如下:9 M, g8 w  A0 Y4 t5 J; t1 Y
    $ i( G$ Y( t) @( g1 s& ?
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    ) H- Y2 u( M4 D* X8 ]. `" |* f" Z+ l. y
    2.核心函数及代码
    1 ^, {; N$ \+ I* w  @6 T2.1 数据预处理9 k0 M& n0 N# Y1 s5 B; t
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    3 M: f' ]6 _  v. P1 l, Z, e" b
    ! C! f5 @6 ]* n0 k+ w#1.将传入的数据转换为算法可接受的数据类型(布尔值)9 l4 Q. W  ^! R$ U7 T1 E  S2 _
    from mlxtend.preprocessing import TransactionEncoder4 u) K2 T! \% j( s6 j, \2 T+ F
    te = TransactionEncoder()! O* }8 U+ }- ?6 P. ]- ]
    df_tf = te.fit_transform(df_chg)( X; \. D$ I* F. p  C" \4 \1 T$ e' k
    #为方便进行查看,生成dataframe) n% U9 i9 e7 U
    data = pd.DataFrame(df_tf,columns=te.columns_); y" Q9 ]- T" q1 j1 ?
    1
    5 b: \* C  T; k) i# a# Y; a& u2: _* B4 l  @) ~9 j4 a5 e
    3
      v6 W8 ~, l* M1 n, |5 H4
    * H  {0 j8 u7 c/ U) H" s/ C1 p5! k& `: H4 t' T* j! X& Z7 T
    6
    : j1 I' w) f4 M# u运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:0 e" d+ f/ i( }/ _
    % S2 @) }8 {; u
    . X# Z' K$ Z" u- K0 a2 p& U1 _
    2.2 两个关键函数7 @4 H0 J7 k) a, Z0 u
    apriori函数$ P2 t1 `) W5 q. |9 |' E
    语法:
    - K5 R$ w7 i6 C" T9 T7 g6 X+ B; J7 p
    : h, ~  O. j# V0 K0 \* s% mapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)5 {7 D* W( c$ S% B; b
    14 k2 B6 T- L5 V  f
    参数详解:
    ; ]9 m* i, n. w9 R# |% @) A+ V% R3 t. I* p0 |: d5 }2 y
    df: pandas模块中的数据帧,DataFrame形式的数据;" I' d6 L  A3 D2 ~9 x0 N
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; N# T8 D: t' f% m9 D- u- m
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。# p8 B! q$ z6 j, \4 X$ ^8 I
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。$ a9 |/ X0 |/ s' b7 ]
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。+ q8 Z2 }6 \7 H/ x6 |3 q* I
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    # r# ~* K3 |: rassociation_rules函数
    , \7 v6 `4 e- g语法:
    # S/ w. O* C+ d: i% `4 n8 A7 g; M1 ]& `* w: Z) H& P. A, }
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)! y: C8 R) O  i4 u5 A% o& t0 S
    11 k. D: n  }4 v6 G8 \
    参数如下:5 F% |8 k  y+ I) K
    / q0 D2 H$ g  x' C3 o; p. ~
    df: pandas模块中的数据帧,DataFrame形式的数据;4 H6 Z% F2 W) J  ~4 p5 p* T
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    $ j) u* Y  A8 U4 J. e" z, _min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    0 m0 H1 H5 \% ?6 k. l, Ksupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。* q5 G+ W2 U: D. E( E. V
    附带metric几种参数的计算方法:* ?8 h3 ~# S" S& ~5 x( }

    ; N6 o$ \& s, jsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    & q) H% I' Y5 K* L9 h% F3 U2 m. u0 Y$ E0 B
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    ; D! c9 I+ `# I0 h8 K  n
    8 G' v' d. }: Y! qlift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    " l/ n: p4 q: p# H
    1 |% o1 O; [4 ^" Kleverage(A->C) = support(A->C) - support(A)*support(C),
    . @! d7 U- s" h+ |( h1 V. Mrange: [-1, 1]9 D" W4 X( v. p; D
    2 O& Z6 I3 y9 @; c
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    5 o4 _' K. P& f$ O6 Irange: [0, inf]/ S3 |# I1 O  E  I9 n9 l# v

    3 B0 F- u2 q3 \+ V& V& M; i5 e: ], n3.实际应用案例
    2 N4 _9 x: @$ n6 |9 j- {以下为完整的调用实例:7 _- [; e6 l; m
    # b+ T  M  z0 k; \+ O/ A. X: N) o
    import pandas as pd% P! ?; y$ r* C) Q3 ^- Z
    from mlxtend.preprocessing import TransactionEncoder
    ( R% g# R% X1 ]2 O/ Z/ F  Vfrom mlxtend.frequent_patterns import apriori! B5 ~# i3 A% I$ q
    from mlxtend.frequent_patterns import association_rules
    6 m5 x; t$ c  P& s- w4 x: e, r3 M#1.构建测试数据% f1 o, R3 N& o1 M9 f' B
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    / S- d: Y# {: @5 W( M+ l( Hdf_chg=df['product_list'].str.split("-"). T# k& d5 u$ X7 L) ?3 m1 {5 M; G
    #2.数据预处理
    2 o& \* \* u4 L9 ?7 t( L( v2 x" R#将传入的数据转换为算法可接受的数据类型(布尔值)
    * w5 }. J4 e) V7 g! [5 Ote = TransactionEncoder()
    - s$ T. n( H, g7 Z, i' }df_tf = te.fit_transform(df_chg)
    ( E- f9 q0 s) b6 P6 Q: S1 O#为方便进行查看,生成dataframe
    ) ~8 A8 w/ m' @; _4 P, gdata = pd.DataFrame(df_tf,columns=te.columns_): E' i6 P5 _; s2 O$ Y: S
    #3.建模
    + S( h  t4 s; h3 q# d8 i$ c#利用 Apriori函数,设置最小支持度为0.2
      ^. Y+ ]5 f% E# G% l2 S5 |frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)- V; J0 }4 _5 \7 B8 v. y9 q
    #设置关联规则,设置最小置信度为0.15) n" O2 y" Q/ W( R
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)/ q5 N/ i/ _7 L! I/ @% |$ W" n! G- D0 V
    #4.剪枝并控制输出
    % e! N8 V+ y* x" R( f4 t( u4 F#设置最小提升度,并剔除对应的数据( H. x( k0 G; t% o% M
    min_lift=1
    : y7 s( I# M* }: ~- J# A% brules = temp.drop(temp[temp['lift']<min_lift].index)
    ) w. J* i9 M& N7 G, G#筛选需要输出的列1 [) A# s5 S. J( s
    result = rules[['antecedents','consequents','support','confidence','lift']]$ Z8 K. U- R7 B2 L/ O
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    ) J4 `4 v; s3 E  @& |result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    - p0 `' v) ^( ]8 S/ P- g8 e& s  ~# e; n, J
    1/ ]( n% k- W! Q5 h
    2" a. q5 I0 ]9 O: t+ Y6 K) e
    31 e, ]$ D. |) h: `; \
    4
    5 H$ |9 T0 y" X% d& M, E8 k5
    " n& q( X6 l! X# L& Y2 C$ O6+ X1 E, G1 z9 f# }3 ^: c! \1 s
    7, E% Y1 `+ f' |. c+ S& E# h9 ^& d) c
    8
    3 q" v3 k: z8 f! O3 C% Y6 j9
    - G# F4 |4 N- X. \, y' {10, R# f' n1 q/ C" E
    11( `" O, G; \7 c* p0 B( h
    127 H9 G( R3 ]4 [* Y' {
    13
    9 [/ \3 ]+ p0 ?5 k. x* ~14" ^# U3 m: H; D  D3 m
    15
    7 l) E/ G5 o0 p* k4 s16( v+ _7 W9 C/ Q) M+ @0 s; k
    17+ `2 k+ I' f. H
    18- t- `, J: z3 A) L6 v2 P) F7 X
    19
    ( k8 _7 H" o. k20
    + v1 o7 G% o  |- b3 Z5 R21
    8 x2 F$ F2 U! e* ?( \22
    4 D3 w6 q& i* V' U* r+ C. M233 K0 {. x. E3 t$ K; o' A1 F% w
    24
    + W1 b! J( B. C, f  Z25: M1 c# b% ]: R* i$ z
    26# \# c# Q$ V  L# A) t
    输出结果见下图:
    3 f# s( ^% m; M4 H
    8 v# h- j: X/ C" X9 x& r  l. T————————————————: f! \# n# k0 S5 n
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 N! g- {" G1 u5 d) R原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759+ p1 d0 [6 e5 i: a8 d2 C* Q/ L

    ) w; e! p/ B9 q3 h
    ( e" p' l# n: x3 S( F. ~$ _1 v
    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-9-28 23:40 , Processed in 0.311439 second(s), 50 queries .

    回顶部