QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5171|回复: 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算法篇0 t% G0 g+ J2 E. g" N) M1 X

    2 b0 h8 P: w8 l2 t) @在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    + Z3 K$ M4 I: j
      P& [* F9 I" h( ?( L1.准备工作
    2 M5 ~9 K1 J# f& F如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:$ s, p: @3 @/ p7 o8 d
    ! ?' s9 h, V; n% Z4 @2 M
    pip install mlxtend
    + m$ {1 `5 y) A# e1 Q4 U15 t9 e" j5 B8 }$ [
    为方便进行过程的演示,在此构建测试数据:
    # [( M( q* f6 X6 k3 u: x& Y$ Z& e, v  h2 s* ]8 m+ r
    import pandas as pd0 s* B. `, U/ n, q
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})9 x! `1 H7 n3 [7 {% n9 @
    1
    6 p- t4 N  {0 Z$ t! j2
    9 ~0 \$ g2 G3 ?* d# d; s; T测试数据截图如下:
    " ~$ N% O- ^+ t0 {3 k! u+ u4 t' o. q6 ?; W) c

    & R. H& ^: W1 h' |; X9 d对上述的数据进行以下处理:- ?% R9 A: b6 @) p4 ~( @& z
    8 L" x( h9 j1 |; d: b: m
    df_chg=df['product_list'].str.split("-")- h  e- |: l0 J) V2 ^" r! [
    12 g6 S' v  n7 P5 S' ]7 t$ o1 K
    数据处理后,结果截图如下:
    $ o+ y( G: X+ U: H
    ! e+ \+ g) O% A& c2 N- D. i3 @" i: o截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    7 }9 P/ g9 h5 q9 j; y8 v$ I3 J
    ' k( t3 l! v: }! M2.核心函数及代码/ s: a- b- B6 Z/ E; k
    2.1 数据预处理; _3 S; e* U# B1 a& n
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:2 O1 n" X$ s& t9 D" H! W' O

    3 X2 h4 u7 G7 A0 {#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    0 g( w2 \3 L& X* B4 R4 C" vfrom mlxtend.preprocessing import TransactionEncoder; |2 N; M7 t' b* J8 _
    te = TransactionEncoder()# s/ a2 \, D5 q( b! h2 h
    df_tf = te.fit_transform(df_chg)" O( p2 E1 `6 ~% E6 R
    #为方便进行查看,生成dataframe
    # i2 b& s% V" E1 B& p" U8 rdata = pd.DataFrame(df_tf,columns=te.columns_)1 E# e* o6 @2 H* Y0 ~0 ]
    1
    * t9 @& O' \% m% @7 s2. Q1 F) z  I/ }; R6 X0 K
    3
    * W. O. r9 c( T- w+ o) l7 r4 V4
    $ {0 l$ J. _% ?, y5; g# T# w  K. F+ K6 J
    6! X) w; P7 }0 O2 t4 V' @
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    # _: M4 v' G) ?/ {+ y% `1 ~8 x' s! e8 c* k- A9 @
    ' h* n+ W/ R* Z1 I1 a  W, j4 l
    2.2 两个关键函数3 {  \+ Q! J, h
    apriori函数; F8 \5 M* j- o
    语法:) K: x4 F9 D* e% A. y

    " L2 W& [' P4 P* w* \  m+ s, iapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)4 a& H5 ]/ F6 A
    1
    ! |% K  I1 F. X3 j! E8 l: R. X参数详解:5 u8 g8 V) c4 ?# S3 w- ]! |8 B9 Y

    * S; y" L5 ?! c+ B% o. qdf: pandas模块中的数据帧,DataFrame形式的数据;
    # V& V- O' {  a; O' u! Imin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    9 {  }( S9 A0 {' w' ~6 \use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    * @" o/ i) I1 h! a4 |  l0 bmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    0 J- @, O6 e: l( c: z4 averbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。3 `. \. r6 P9 _' [. O. c
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。6 t7 \' y3 n, Y% x
    association_rules函数% L4 q: ?, N+ Z! f# k" P# v0 y
    语法:0 K; j* F6 i% R: e' b& f
    4 Q( d$ C: {. i: B& H
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    1 Y& v- i; k) g) S3 r7 `3 g1" f  l0 r$ |3 `8 Q
    参数如下:/ }- l9 m0 l  E* \
    ' }. l* {% m1 V" F
    df: pandas模块中的数据帧,DataFrame形式的数据;" u8 X% k. E! v. K
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 |* _; P5 V% V
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。) h4 l, k' _- z- j/ A& f
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    ( y/ r* C. f+ |8 ^3 }附带metric几种参数的计算方法:& @. e6 y6 e8 `8 s$ H9 P

    * V% p3 a4 O" ?, l8 ]support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]9 w, I2 x( {8 s% p; p/ }, C% p/ a
    9 g: m3 Q8 d' t' g2 I
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    5 L5 }2 p1 e2 J& S/ p. _2 Z6 z% h# Q* Y0 a# @
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
      m- h4 R* v; J0 \6 ~# i8 v0 G, g) ]6 M9 }& j& F$ g
    leverage(A->C) = support(A->C) - support(A)*support(C),* n/ M2 ~' V, M+ Y+ _, A6 J
    range: [-1, 1]
    5 G6 t' i% |8 m  g1 o5 I! {. e8 M4 e1 w7 X( o  i- H
    conviction = [1 - support(C)] / [1 - confidence(A->C)],; _3 [5 j+ K2 w0 Y8 x
    range: [0, inf]
    ; a; }9 B1 j$ }6 j$ x1 h
    ) n% ]# h1 D3 F  X3.实际应用案例
    ; }7 A6 r+ Z7 C: T# r  g以下为完整的调用实例:
    0 _3 M% n# E8 a3 a2 ?
    , x$ f. |* W% _/ m1 d9 t. uimport pandas as pd, j( k4 z8 W; ?
    from mlxtend.preprocessing import TransactionEncoder
    6 t& |( S& h& |. X; Rfrom mlxtend.frequent_patterns import apriori9 S2 e) I+ b3 g7 z# A1 m& G
    from mlxtend.frequent_patterns import association_rules2 v# Q$ m3 ~+ _" t# e) n
    #1.构建测试数据9 r* }( o% B7 r  S: K" |
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})' V& R. _# f( t3 X* l/ p; f
    df_chg=df['product_list'].str.split("-")  \5 t/ I4 ?, u( [/ V8 {
    #2.数据预处理6 L5 y+ B$ K4 J2 T, z
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    2 V6 q- }: n1 \; Bte = TransactionEncoder()
    8 |- W3 ~( @- Q& P) Pdf_tf = te.fit_transform(df_chg)# r5 V4 v1 C  V# K4 p
    #为方便进行查看,生成dataframe5 F6 j1 k) ~+ f9 X* n4 X
    data = pd.DataFrame(df_tf,columns=te.columns_)2 L4 \1 b/ y& f
    #3.建模
    % G+ y- |# x1 @6 R8 G3 f8 a#利用 Apriori函数,设置最小支持度为0.29 z, Z* ?9 j! O: k6 g1 Y# r
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
      J; F9 D$ X8 B, B! E#设置关联规则,设置最小置信度为0.15
    . w  M* k0 F# H9 ]! \# i: vtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)  O# ?9 L  M6 F! U6 C0 Z
    #4.剪枝并控制输出
    5 _, k( D' @: G#设置最小提升度,并剔除对应的数据
    7 l4 b( y0 Q0 Y( E4 ]$ ]' omin_lift=1
    ! k) ?* F; ?, O' a; orules = temp.drop(temp[temp['lift']<min_lift].index)- @# b9 r& H1 R. w- T/ U- R
    #筛选需要输出的列( f$ }5 K! O' X) `2 L1 F, S# b
    result = rules[['antecedents','consequents','support','confidence','lift']]+ F, H2 l8 p# s" M8 T& Q
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    ) A1 S& x' Y* Nresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')' J8 y3 N3 g0 [
    & x; L# B: g! b$ X) W+ A
    1
    / G% x0 ~  W7 B7 x- @0 W2$ P" P& T4 s1 [& ]4 a! q
    3
    $ U9 T$ q# R1 v- ~! O4/ W4 S  C/ l) B; x1 \/ u
    5' d! f6 f6 x8 ^7 I! ~
    6
    % W* ~4 i1 Q9 A0 x% \7 I( G# g& f7! C4 t( I* m  R3 o
    86 J+ g. ~- ?% [) Q3 X8 y0 Z
    9: e4 u, q  G  `
    10
    ' @2 @& m# H6 b115 t( h% w) s0 Y% Z/ }( @. m1 A
    12
    - v/ W& J4 J  V1 l133 X: c7 V+ C6 J0 H
    14: _/ }% ^4 m" T5 z& E; j
    15
    1 B  T7 d7 t+ y# u1 o8 x4 ?16
    - q% W3 n, ~+ z- X" F! e17
    0 C$ s' b3 Y1 w! j( Y5 p186 ?) B( @/ A' d! E
    190 @2 e0 B, ?4 H6 j0 ]1 r' N
    20
    6 p: Y8 X! j% M# l& d21, m4 U' }' x+ F: Y& r3 @3 Z2 {6 a
    22
    4 |3 {# [+ x9 \) X( e9 Z23
      d1 a# p" F$ i9 J3 D2 S0 g24
    , f% F9 l  o' F0 r- V% q25. P+ u$ t1 q: t, [: J
    26
    , ~/ y6 R% Y" l6 d$ j3 q输出结果见下图:) ~2 }/ R! x8 l) M" r
    : D, t- G+ Z; X  d
    ————————————————
      Q' n" u7 X5 v' L2 ^2 f版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 d% w  j! I& d9 K5 n8 R0 i0 s原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    . F) w! X1 z! x' k: y
    5 f5 ^5 o. i0 ^) y' J: E5 J% s, }8 n2 d" D, E( h# w2 P
    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-10-8 09:42 , Processed in 0.374880 second(s), 51 queries .

    回顶部