QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4981|回复: 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算法篇: m) t; Z! j  z6 B
    5 D* d$ z( q2 O# c* |8 W& a
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    3 y5 w( L3 h& D) ?& I9 v8 J& t# L/ Y% i2 ~9 K7 ~5 J6 L8 Y& o
    1.准备工作) T6 m. U* I0 g6 O
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    : Q- S0 n% c, f, a4 ~# d; I8 \2 \' b) U( [" i+ U8 x3 p5 Y/ a7 X
    pip install mlxtend! M. u: Y3 }. v) ~+ n
    1
    $ r+ z& E3 K9 K1 b+ ~1 T. a0 [为方便进行过程的演示,在此构建测试数据:( G' f9 ?. i2 ~* y+ }0 V8 X

    4 t) y' [/ F5 L% cimport pandas as pd2 Z6 G* M( w3 V" p. N
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    0 z' g* D2 H1 O1
    / l7 v( Y3 t! v/ B! b5 `8 Y22 l! q& }; @! t' j
    测试数据截图如下:
    - t- e3 y) Y" Q$ h" y
    $ x' `: t* I9 w6 }1 T5 X. R
    1 B% o% C8 [6 B  ^! }对上述的数据进行以下处理:
    ) l5 p0 R" i& \$ s  {* N' m
    + W0 R5 P: n4 N/ Tdf_chg=df['product_list'].str.split("-")
    & c( u) w6 v: d5 B1" Z; D2 a( _1 m4 v: ~% s9 Z+ G
    数据处理后,结果截图如下:
    7 {( ^6 c; x. I+ \+ P1 M9 {: C! F$ ?; A! T& D
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。3 n6 L. u+ U+ ], n3 I" V; J: h

    7 o1 |; ?- o4 A) z% V2.核心函数及代码: k: `. X1 h% @/ X7 P
    2.1 数据预处理, y7 ^; k* O% R* o# L
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
      F6 o" t8 h8 I" Z3 H! R
    ; T- R- O, w# u; w0 x1 A#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    ' L* c  X: k3 ]+ Sfrom mlxtend.preprocessing import TransactionEncoder
    4 p6 ~" V6 X, d. k4 Z6 ?te = TransactionEncoder()" c6 L: X: |- M0 _, |1 R0 k
    df_tf = te.fit_transform(df_chg); p: [: P! P( u% [9 N
    #为方便进行查看,生成dataframe
    1 f: b, R; m' m* ndata = pd.DataFrame(df_tf,columns=te.columns_)
    # o/ D6 N: {6 D! Q4 }1# v5 g+ N- a  \, @3 p
    21 x' `% a$ t! ]" }0 e% h, l
    3
    ) {6 m) n  y- @8 Q' D4/ i0 G) m3 N: j* S
    5, l! K$ ]7 j$ X( H7 }7 q1 u
    6
    / I1 g: r/ b5 R" h运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    4 u- G5 v1 I. W# M' p/ Z9 h, ]
    . }: F2 K) T2 X: @1 y; t
    . O# K9 K: i- K2.2 两个关键函数
    ) [" n! Z6 b7 S! k3 v( U9 qapriori函数9 g6 H( h0 m! D& R0 `, C
    语法:6 X5 b. A) l! O- }* D

    ' y  k, l/ B% n- |8 vapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    8 T$ }! h; y& [9 \( q% g! h6 y1# M1 z  A, \8 \( h+ x
    参数详解:! y. m7 G' H! r3 H9 W0 a

    - O) k7 _7 G4 }! `8 W( z- D- jdf: pandas模块中的数据帧,DataFrame形式的数据;/ P% T( w! j+ B' g) r* U/ k
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    2 s6 h1 k+ I3 }use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。6 m/ P6 I* {; Z6 O) b
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    3 }, @( ^) ~  ^' ^verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    & \7 x; ]: m& S+ o$ Zlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。, ]+ t/ x- `! l# R* L
    association_rules函数9 O, ^# _4 {  T, Y- H6 n3 l* x
    语法:
    ) h' W& ^/ m) v% N
    " r% o9 S$ P; V  x; Jassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    ! K2 f. a& c, P: z9 b1
    ; q2 S7 }  ]4 j* A" t参数如下:) @& W) _) O- F7 [

    ! @, P* T& z' Odf: pandas模块中的数据帧,DataFrame形式的数据;
    4 |7 b3 O0 W9 k! M% x( Fmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’- x& F& D  Q7 {
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。2 t$ a' j- L1 Z! B
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    1 y5 [* K! S- \/ r* f& g7 d附带metric几种参数的计算方法:
    $ M1 D+ z$ H0 f$ ~5 O' T# G( |, `
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1], a. n( S# m, Z/ W0 m- ~
    - A6 W& E- |3 ^- x# S$ z8 O
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]4 K+ W# N9 ]$ A6 b3 J

    + w5 ~% i$ t0 \% J% Ilift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    . d; R9 Z# H% J5 C- Q* L, k5 @  m% a% y6 y5 w, l) p" `- P
    leverage(A->C) = support(A->C) - support(A)*support(C),* Y9 F! x; F. [2 a3 O5 ?  O/ E
    range: [-1, 1]  i4 i; h) n2 D" V% v: A( g& r% |

    0 U) J4 H" N; Kconviction = [1 - support(C)] / [1 - confidence(A->C)],! L) J* q9 U6 |4 N/ |
    range: [0, inf]" C, w4 X9 J3 D1 }- c6 Z
    + K; l' h4 q5 T/ ]1 J4 g. ^$ A
    3.实际应用案例: ]% ?/ p1 r' T- J+ \3 H
    以下为完整的调用实例:! E) H: @* z! d: M+ S  F  C" \

    9 A8 @; W. k' a2 z( Eimport pandas as pd
    ( S2 ?7 I4 f+ pfrom mlxtend.preprocessing import TransactionEncoder
    ) q# ]+ r/ t$ h  N4 D+ M8 Tfrom mlxtend.frequent_patterns import apriori
    & X# N$ {4 y" y6 I0 F$ y" g! M' mfrom mlxtend.frequent_patterns import association_rules# l9 \0 X7 N# d! o( `& }
    #1.构建测试数据6 R  v) d: s. Z; Q0 s
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
      v, x' Z3 {) wdf_chg=df['product_list'].str.split("-")6 B; v0 S, t) T5 N+ r1 W3 U5 ?
    #2.数据预处理/ v$ m$ F: i8 b* u
    #将传入的数据转换为算法可接受的数据类型(布尔值)+ R( {+ G/ u" r/ W0 V, L* A' p( V
    te = TransactionEncoder()
    0 k* Q+ M3 L: N+ `# j$ }% _df_tf = te.fit_transform(df_chg)
    ! e$ R! Q5 l/ V6 B8 E; T#为方便进行查看,生成dataframe
    " V. @: ?# E  xdata = pd.DataFrame(df_tf,columns=te.columns_)! Z" Q& f& y$ [4 x9 ?& o
    #3.建模
    0 ]9 _/ d8 R- G6 b! ?; w: m#利用 Apriori函数,设置最小支持度为0.2
    # u: A# C6 b9 D' U% x4 w4 Wfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    " s) L& U- q1 m4 a- ^#设置关联规则,设置最小置信度为0.15
    9 k: A, {7 ^! r  etemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)& x" e/ l% @* D6 a* I
    #4.剪枝并控制输出
    1 G% k6 [% |8 e. X$ z- h( o#设置最小提升度,并剔除对应的数据+ @8 w$ ^2 N$ ~; d8 c3 K
    min_lift=18 l0 x: e* f( G
    rules = temp.drop(temp[temp['lift']<min_lift].index)
    % q: R% P) \7 q) T/ `#筛选需要输出的列
    , M* h+ A. s' {% ^3 y3 j) J3 Aresult = rules[['antecedents','consequents','support','confidence','lift']]* f% f8 d! L# X5 Z  Y+ E
    result=result.sort_values(['confidence','lift','support'],ascending=False)$ H# x3 M1 ]7 y) Z
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    6 M( E& `2 J4 H+ \
    + W+ R5 L* g- ?4 q2 |1+ u- I, b2 E$ S* Z
    2
    * {+ k- o) X, M- X6 I* O3
    ; q1 O' |2 g  @7 F$ [4
    , p5 y7 }& L( E) U/ @# v59 ]3 M7 ~( p  B1 K/ ~8 I8 T7 y6 g
    63 g: ~: l$ }6 z. Y
    7$ L$ d9 B; S/ {* y; c
    8% q0 a8 @+ j$ w1 b' [* C
    9: Q+ o( ^+ g- M* P% G+ l- }1 P
    10
    , \- |7 ?% w9 Z115 T( d7 @5 V+ @2 n  o, A
    125 S! R$ \: k2 ?# U6 V) W& z
    13! R# R' P, |* c0 ^+ H6 d5 N3 P! ?
    14; \, H4 f$ a0 o  E9 [9 ^" P; E
    156 C( O3 t0 }# O8 A
    16' H! c4 ^( C  }' L
    17
    ! Z( a1 z9 B7 a3 n, ~181 s- {& P* i' c# ]0 H0 K! K
    19' l+ V, `% C5 r# t; _# t
    20
    3 Y& `& h4 c) [21# U/ V0 B$ Z" b! r* j
    22/ v( b4 }# l0 L- W9 B4 Z8 H
    23
    " D! Z# s  V. Z6 o/ R8 v' L24; W1 \7 b4 ^% Y. [. E, k3 d! ]$ v4 E
    25& _, E4 A* s" n% Q
    26
    9 r) i6 G- l. k& P输出结果见下图:$ A" [0 I% G# N! `5 I' [; l

    $ g& p/ b1 N7 \( e) L————————————————# U- q# u8 Q* c3 k! k2 h7 W
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; d) g9 H3 A5 U8 I. x) O) `
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    . v7 n2 c, o7 z( j9 I* h0 v' _4 Z
    - S  K; T  c8 ]% G0 y+ I$ ?
    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-17 09:49 , Processed in 0.405973 second(s), 51 queries .

    回顶部