QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5053|回复: 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算法篇
    . d/ r- V5 L& k7 s# O
      a$ e- y. a5 @# i) T在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    : i. W, B5 H5 T
    . Q0 a3 n/ U# c& c4 i7 E) G1.准备工作
    / o$ @' y; A8 m* G6 y如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:* g0 S! {( d- @: O, r
    9 V  r$ A% j' n/ o
    pip install mlxtend
    ' f% e" J2 r, w1$ ?9 y6 l) C+ ^+ `+ K7 X# \' h
    为方便进行过程的演示,在此构建测试数据:0 k+ B) n# I/ U! t" L
    2 a2 i3 K2 k& V& ?" N
    import pandas as pd; Z1 o0 q! h: @0 A
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    0 `' P  z: ?1 `4 \' i2 K$ H& v1) w) f( Q  O9 p
    21 a( G* H4 ]) `+ n& E/ [) l; j
    测试数据截图如下:
    . E/ s( ^2 Q% v
    ) ]3 T4 K( @! v  {. D+ y
    5 e0 N; i+ x, w: K, P对上述的数据进行以下处理:5 {5 _  H8 Q6 `7 H

    6 Y! R" P. r. I! j$ \1 f2 vdf_chg=df['product_list'].str.split("-")7 n' b& R, I. g7 b# L
    1, X) p! w- \% H1 }
    数据处理后,结果截图如下:; Y; a' V6 U" l# e) k! B

    9 F2 s" p) w7 K3 a: M' w9 W截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    / H8 z& y  \* W6 [- t. X$ Z+ v2 Q7 ^: r# l2 n$ S8 J0 M5 f
    2.核心函数及代码* k1 ]) F( l) n& w# I2 a
    2.1 数据预处理& d! q+ N2 G) S# N8 E
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:* A/ l0 T. s5 F9 j0 R3 u9 s

    ( h. M  }1 s& I#1.将传入的数据转换为算法可接受的数据类型(布尔值)- K% z6 j. \- m# T5 q
    from mlxtend.preprocessing import TransactionEncoder
    " V' i+ a, I: {2 G+ K( Bte = TransactionEncoder()
    % g2 \% N  _  Edf_tf = te.fit_transform(df_chg)
    1 ^* p/ J$ ^6 e#为方便进行查看,生成dataframe
    - W( i( I- }' X+ W1 Adata = pd.DataFrame(df_tf,columns=te.columns_)8 r- X: t" z0 B
    1, Y9 \9 I9 ^! o$ j4 Y* v( V
    22 A/ C  R7 N* b2 u3 d, V% Y
    3
    ! _# c. m4 Y/ Z4+ P& s1 Y% i' P- X5 |
    5
    9 F. |# D+ g. M+ o8 J, w69 d0 h3 b6 m9 ^8 G7 V( x0 `
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:2 W6 J$ {! v9 I9 b) Z: U4 ]8 T% X

    0 ~8 {% v* `. h& ~) G3 ?3 w' {( ?7 {) c( V+ r
    2.2 两个关键函数
    ) S' @+ P# K& \* T- Q  `# l6 |apriori函数8 s7 w8 [( `* b7 W% e
    语法:7 n9 e! C0 L, b/ o

      S8 C1 ^& L* q/ w/ H5 |apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)1 U' G, P' O" I, s% [
    13 w* v* E7 C9 `
    参数详解:4 n5 i7 e6 t( A$ n9 }% n5 p. U

    % m" s" n& j9 R) F$ @; A# }/ ]df: pandas模块中的数据帧,DataFrame形式的数据;
    . r/ R1 I! g) o! b6 h% wmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    0 |6 ]' b9 B* D5 o) Ause_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。3 r1 {$ s9 t& q# X/ S8 _
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    / T/ x8 j$ d" j9 e! Dverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    % ?. r% ], y1 V" s* \' b9 Ylow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    2 W' e5 V! s# e& v: V9 \association_rules函数! E! p' V# B; c& [2 j" @+ q
    语法:
    ! |$ I) B, y# a! d2 l0 ?- h; D( Z7 b( w3 s+ g
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    + L% ]! A" _  ]' b' K1 j* C1
    * g; O+ ?3 I/ j6 B! m参数如下:
    $ X+ f8 o; _# K0 f) W! ~* k* s# O# w5 l4 t3 J' J% s( C; w
    df: pandas模块中的数据帧,DataFrame形式的数据;
    2 T  {# r% B8 b: r, @8 n8 v* o) }metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    & E6 T8 c% C. {. v- z+ Zmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。# }& e  Y; U, D+ [* q
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    6 E! F0 }" G1 `- L) Q$ s% R, U1 @附带metric几种参数的计算方法:
    " e; ~: |' N9 Q' h. o" p, ^/ v% }1 V9 b# y2 b! k
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]# b( D& i/ g( E5 R+ w- {; H5 M

    ( H6 ~' w  [2 e  q5 E& ?0 B  Econfidence(A->C) = support(A∩C) / support(A), range: [0, 1]& x3 k5 i% U% w1 l% P3 ~( O

    9 F$ g3 ?# d  _/ {, E, A: ulift(A->C) = confidence(A->C) / support(C), range: [0, inf]# r9 D0 I( g: l0 D4 G8 t

    1 g. o/ M7 \7 i3 i2 Sleverage(A->C) = support(A->C) - support(A)*support(C),
    - d) n9 v- k+ w6 x6 b# orange: [-1, 1]( n6 q6 h& c2 ]3 M! ?; d; s
    " C% ?. h  q; O8 |6 R
    conviction = [1 - support(C)] / [1 - confidence(A->C)],1 G7 V0 s0 p& L7 y: T$ X. h
    range: [0, inf]
    5 a3 e4 T. m: }. X6 E3 {' c2 y# p! R$ u' s  e
    3.实际应用案例) u- S  E& c1 b. i7 S+ e" V
    以下为完整的调用实例:$ [( {) l* y: {" e# R
    / z9 O( ~! N6 {1 T6 n. R$ i/ v! N% ]! d5 e
    import pandas as pd- E+ T4 l8 ~2 _* |6 Z! n& |
    from mlxtend.preprocessing import TransactionEncoder& @0 x$ R, V; e/ I  w" F
    from mlxtend.frequent_patterns import apriori1 u0 N3 I; G7 Y1 K3 K5 z
    from mlxtend.frequent_patterns import association_rules
    , s/ w$ [8 S. C/ S0 n#1.构建测试数据
    % R% p1 O5 T0 [; e6 E2 xdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}), K$ P- N1 H( x
    df_chg=df['product_list'].str.split("-")
    : \; Z+ N5 \( A: J- C: E#2.数据预处理7 \# P/ R  p- A, D5 w- O
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    " f! l$ H( @' [4 v' S$ ]* Xte = TransactionEncoder()7 a9 k. v- p3 }
    df_tf = te.fit_transform(df_chg)2 {' m9 E, T0 u& ^
    #为方便进行查看,生成dataframe
    ) b8 q1 o0 m2 V  o+ y! U- n, ^5 Jdata = pd.DataFrame(df_tf,columns=te.columns_)
    1 ?' W# C# f1 D" Q8 ~5 }#3.建模
    $ E8 ~1 ?7 Y) K6 B#利用 Apriori函数,设置最小支持度为0.2
    , z( c  S, X: S9 q( lfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)2 N5 b: H- V4 g, P1 V# a
    #设置关联规则,设置最小置信度为0.15
    " x$ ]0 j5 x" Btemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    4 O, f3 _9 o; B#4.剪枝并控制输出/ R2 e8 c8 m4 w  @% v
    #设置最小提升度,并剔除对应的数据% ~- h4 v) i7 b' x0 x. K: [" B& u
    min_lift=1# q( F  d. H4 [) W5 c7 I5 R
    rules = temp.drop(temp[temp['lift']<min_lift].index)& z6 B6 X# |- f8 q
    #筛选需要输出的列
    + \) o, ~% u- [/ [result = rules[['antecedents','consequents','support','confidence','lift']]
    9 h+ t+ z( b5 E/ v( qresult=result.sort_values(['confidence','lift','support'],ascending=False)
    5 I  L& C+ `/ p3 t/ jresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    # }3 J* e1 b  a3 Y8 V; e
    ' U) p9 E% z* R7 J1
    ! _. Y9 M% A, o3 G6 A2
    ' K6 |5 Q9 K. ^3 Y( [$ X30 C! B6 Q; N. o4 K+ J# R; t# I
    4
    $ V, \- [( \8 |5" X+ k, j- v) U3 G! @
    6. `$ q. |( p6 I/ I$ b/ w
    76 j# J% |( L) u2 B( z% z
    8" T  _& ^: Q+ c( j% D
    9$ S; q: X$ K/ z$ D7 _- `* A8 |
    10
    3 @1 s. S  r+ I4 q+ A* e5 F11, h; R% r/ f$ B* L
    12) w) i3 X* u. Y1 S/ I3 f& K1 @
    13/ b8 V4 x3 K1 u! {7 }
    149 f% S- P: _7 Q/ i5 h6 {6 i- M
    15: k* C/ n) @% C- a- w" n8 g2 o) ?& `
    16! u) D0 i% c. K& }; s! ?# M
    17
    4 ~" d: }, o. g7 m" D+ @8 F  l18$ {" `, \0 ~0 `# W) x8 E; B
    19
    5 o& {, S( ^! ^. N; B20+ c# K7 l" Y; v2 v9 d
    21
    ) e- ^( |  c3 {22% ?8 |, ~) h1 W  }$ `5 ~2 w; c
    23
    4 {9 S* w% ~5 G. H# s* j! I' z4 D24
    8 g! I" J- Y, S6 c25
    ; J. a6 D/ l! N: S( ^( @7 @$ ^26
    6 H/ g3 B, u  j3 P7 L1 w: i2 @输出结果见下图:' O! I( P6 S, m0 Z
    # Y7 @3 ~8 K4 Z
    ————————————————
    4 x% q, r. c9 ], _版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    9 f6 z" V4 t9 R. A# J6 X原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759, L# x/ l: }5 B7 H
    + e0 S1 h0 L; d! Q

    ; k7 w: {$ q0 z% F
    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-30 04:12 , Processed in 0.410725 second(s), 50 queries .

    回顶部