QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4976|回复: 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算法篇
    ' j+ q7 I9 e; I2 Q( j( S
    ! }: I; r" b* C2 G% Y* P在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。6 S% c# W5 W- h$ V. _
    $ x. s3 ]' b% D6 R
    1.准备工作
    # R2 c" i3 L+ L# }- H, I, i& b如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:* H& `8 e0 X$ p$ h/ @& F0 c& ]. r
    ) ^7 G- x) I+ Q7 o2 {8 I
    pip install mlxtend$ S- Y1 t- R! E. {
    1
    , h# Z4 O2 N; W7 ]; ?2 R为方便进行过程的演示,在此构建测试数据:. l- `' T: W! {* r+ B3 R

    9 f3 u# u- B  g  K2 ?import pandas as pd0 I1 O0 K" ^; c3 C2 F- b/ x9 M
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    , N! Y+ o! r6 \: b1
    ' @9 _) a, _/ k- d  }2, j# }  m0 a+ C2 _2 y9 W8 D- P5 Y
    测试数据截图如下:/ p2 ?5 p4 ^; F7 s( {

    2 i' I7 z; u& P# m
    ' h" |$ d2 i4 D' t+ S# G对上述的数据进行以下处理:9 i4 X6 E* m8 f4 S: A& Y( Y

    # e/ p3 C& Y: H6 _& cdf_chg=df['product_list'].str.split("-")8 ^$ I( p4 L* J. L0 w$ U
    1' I/ d  t9 Y  [! F/ r) k
    数据处理后,结果截图如下:
    - {: n  r4 w8 F& E0 F/ s! N5 ?: K
      V& j* G* {$ A$ p" _% S/ G, [. m( S截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。6 f( ?4 X( n# r; N( ?
    * G8 S7 U& y/ Y- J  g7 m
    2.核心函数及代码6 p9 X& g  {+ S/ h
    2.1 数据预处理
    4 {0 I6 U4 ~- k; i% h对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    8 t" Y* ^! C5 b9 S' K, b" y4 J: \" E
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)
    . t+ B2 v9 L) Z' W7 F  T$ c( vfrom mlxtend.preprocessing import TransactionEncoder  D- ~! R; a0 l' _+ m. a2 Z
    te = TransactionEncoder()
    2 M% {+ w+ i1 U, q/ O. ]df_tf = te.fit_transform(df_chg)! ?. d! }& k7 T+ ]  Q
    #为方便进行查看,生成dataframe
    / f6 m& Y: l! `' a3 ydata = pd.DataFrame(df_tf,columns=te.columns_)
    * d6 {  W+ h/ z- o- `, f1
    # {: K1 q; A; Z: z, Q& w7 B2  G# B" F. T4 x1 T; Q( e; y. H
    3
    ) z# _$ a& t  [5 K3 [4
    % b7 U$ ]' k+ @( d) S/ e5
    % T, l1 x! a0 Y/ r6 i1 l, |2 g6
    ! p- X3 F0 K" s4 C0 I运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:: X3 g4 V* m0 D) b
    + c' j' n, ], L: w
    6 ~# H6 I. |) p% j4 k
    2.2 两个关键函数: l8 n3 @$ m, ?! ~/ J) B% h
    apriori函数
    : k0 ^5 i, \3 A: ^5 m2 f语法:
    $ u4 D0 m. E# j
    ; Y, ]7 \1 }1 e5 d5 r- m; \apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)+ A, i5 y9 u) n+ z( ~- i
    14 T0 g7 o$ f. o/ Q( f2 z
    参数详解:' H' o" o9 D  n6 E- |9 V  X5 W

    4 u4 k; e( ^: s& O2 tdf: pandas模块中的数据帧,DataFrame形式的数据;
    ' f) F! T' E  E' ^3 Y/ e% Emin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。* a# T) s4 O" e  V; @0 m3 r
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    " W% h4 \% u# ~8 q8 e; _0 Mmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    9 {1 @6 @1 P5 {verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    + a4 a) K! b$ u2 K, d; tlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    4 X' k! ^2 z  nassociation_rules函数
    0 t  o8 y$ R, L; d7 _语法:
    : S. R) y, c, t$ R2 _: V* k/ b) W& j% m0 ~7 q* L+ r
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)8 e, F3 O( C; l% B, `
    1% ?1 \4 n* g( ~/ T
    参数如下:
    , `7 i- {4 @0 l' w+ p2 k, s! g, Y0 I9 \! f
    df: pandas模块中的数据帧,DataFrame形式的数据;
    1 U2 `, H# k# `$ Q' J( r+ Jmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’  p5 z* S" b5 v% }
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。0 O% J' Z1 J" ^0 W* S
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    5 |& j) s& d  A2 o6 u附带metric几种参数的计算方法:  t7 }( v  N# v- L, N" V

    / [! M" Z' q5 Ksupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]. j  q) D: G7 V4 |- r6 w

    6 U! P0 P$ G; r, r4 l( u" hconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]8 {6 ^+ Z, h/ ^  [# {, u

    % q- L8 q' N5 w# ]! @, L+ nlift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    4 [0 F* p: `7 H8 V: r4 q8 I$ R6 I+ R, p, C, T
    leverage(A->C) = support(A->C) - support(A)*support(C),+ v* r, h8 f. x; o# e; j3 H& E
    range: [-1, 1]
    - g! M# V& r/ t5 r* g# K* b) O6 r2 {! r7 J( h
    conviction = [1 - support(C)] / [1 - confidence(A->C)],9 N7 w; S. A- I4 s& f/ p+ X( x0 O+ t
    range: [0, inf]
    , q; D& Q4 w9 _4 p8 P5 L" r
      _+ f" U$ d6 v9 I" }3.实际应用案例
    ! l; M8 @! I. }# _以下为完整的调用实例:
    ) i2 q; E8 A  y5 J% d) k) X9 _8 P# Z. b
    import pandas as pd/ r' ^  n" d- p% m. g) Q( A
    from mlxtend.preprocessing import TransactionEncoder. G1 N' j, E- ]/ c$ e' C
    from mlxtend.frequent_patterns import apriori# d* W+ d& L: k( Y1 i" ~2 I0 k  f
    from mlxtend.frequent_patterns import association_rules8 ^' k/ e8 K+ k# Z1 ~+ w- g
    #1.构建测试数据
    ' w8 ?1 B: t( wdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})7 d* I. f* ^' h7 w  b4 A
    df_chg=df['product_list'].str.split("-")
    ' y: q: v9 Q$ B0 r#2.数据预处理8 l0 J7 z" m# f, r; h- A& U
    #将传入的数据转换为算法可接受的数据类型(布尔值)9 r8 N$ _: I* L
    te = TransactionEncoder()* T0 d2 @  G) l: f" m/ E; p4 G
    df_tf = te.fit_transform(df_chg)
    + v, A. W4 [7 \' h% ^: x#为方便进行查看,生成dataframe
    9 Q, t& z2 _1 x3 ?' @- jdata = pd.DataFrame(df_tf,columns=te.columns_)
    7 p. g& g: U! K; _#3.建模
    & w: V* U/ `! c9 a# V+ u# N#利用 Apriori函数,设置最小支持度为0.2/ S4 m3 t* h) t  Z, u8 @8 M8 i
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)8 ?, e5 {4 J' T3 L0 C
    #设置关联规则,设置最小置信度为0.15/ E9 j9 P5 X3 A
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    # v) X7 o) q/ C3 P5 u; ^( \#4.剪枝并控制输出7 |& |; z9 c9 x$ @1 b0 W
    #设置最小提升度,并剔除对应的数据
      `9 |) ~# ^- m4 \. Ymin_lift=1
    4 r: x1 g: \  b2 O# A5 o% H+ t( grules = temp.drop(temp[temp['lift']<min_lift].index), y1 t, t* \& p5 c5 n
    #筛选需要输出的列' g4 u: z% n/ N" w/ h
    result = rules[['antecedents','consequents','support','confidence','lift']]+ }" `: m/ s; \) z- m' |
    result=result.sort_values(['confidence','lift','support'],ascending=False)0 H8 O7 ~3 Z' b& U6 k) O- i3 r8 g8 p
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    9 M3 y) H- q+ Q$ t2 }4 ~& e, t7 m8 r- y4 `3 O# S/ x, c% `) z$ N4 e9 w
    1
    1 ?' o# U) ^! E. M- \2. t) F* @1 y: y% U/ p' E  _* m
    3+ F$ v6 e2 o. t, @) Y' n5 y
    4% ~5 @# |& y2 ~; g; @+ t. F/ S
    5" b8 Q. W$ t: T4 _% O) O6 E
    6
    9 f" D7 u0 e0 `3 e! R70 U/ N& |( p" q: m/ K
    8
    ; S5 h/ W+ W; O  d  O3 ]92 u! {: H4 Q' Y  |* u
    10
    6 O5 I, w; C' p11. W& \! n$ l) P2 O2 A$ K" D
    126 d, D$ X; J# _! {0 z* n
    13
    ) I% X0 l' A7 c8 p9 T% X14
    7 i: C7 v, W1 L; I! M3 \1 A# Y15
    # \# q) O3 {5 ]" u  {% o16* t$ ?6 p% D- a; {
    17. m5 o# K) U( x+ q! c
    18
    ) t" x4 ~8 f' S& B. k, V4 @19
      ^" f$ d2 n4 q8 h5 J4 ]+ f2 V" O6 K202 K1 R" S2 @, i! X. s$ ^' p6 P: I( p
    21
    / f. X2 i0 H7 {# @0 M! F22# i& u' g! h6 B
    23
    , J4 d/ U( }8 ~24+ a$ y) D) K, m6 b) d! r* t
    25/ k2 u" Y: [& j& E7 {1 `
    26
    " {* x1 V/ I" n输出结果见下图:
    ' E2 L4 Z( V, f0 E, a. f  J$ g' f, t0 R4 S' n* E* o0 J3 `- n4 n
    ————————————————& R3 e/ n& q4 O" ^
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* X2 e* a7 G& P4 S8 Q
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759) W% U. i0 y" p( I2 S1 k' V
    ' T$ v0 f; d/ u

    8 A, B* @! H8 h7 G, z: y
    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-15 00:49 , Processed in 0.413913 second(s), 51 queries .

    回顶部