QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2107|回复: 0
打印 上一主题 下一主题

[其他资源] 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • 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算法篇# K) R% R8 q' D1 D; c: @
    ; x! n0 a% t) N# q" M
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    ; I8 ^' b& ~0 g/ d* b' p+ u& x4 [2 V6 K
    1.准备工作* l. v; ~# J9 v
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:' ?. r+ `. `. X3 v9 a1 F

    3 L7 A8 P1 l# S; M7 V, U) Q- f: Mpip install mlxtend
    : O$ g7 {8 X4 w/ ~; M  |! ~3 D' h7 i12 O) E. f" b) C
    为方便进行过程的演示,在此构建测试数据:- v/ S& W/ M; ^! t
    ; l1 _3 D/ a, X" T3 R) o
    import pandas as pd- F; ]: \! X$ s, l
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    3 l5 r3 b8 u4 R# `7 H6 W! j1
    - c* ^, d/ f9 o" e% G0 L9 I3 M3 }28 N5 @1 m5 i3 @5 |
    测试数据截图如下:
    8 {% G$ |8 D$ M! [3 a: F& R
    1 e, e3 s2 K1 m4 I/ q  a/ T" n# C$ C4 d; i" x
    对上述的数据进行以下处理:
    0 A0 @3 N% B5 g9 N# s% t7 L, @* s5 V, f4 S5 [8 A- n% c+ r
    df_chg=df['product_list'].str.split("-")$ ?/ t3 U1 Y) {% J4 g! l, ]8 u
    1" K8 [, x; S2 z3 [7 g/ p7 d
    数据处理后,结果截图如下:
    ' g, y& D8 b* Q" @5 @' W, r  a, {& B( \7 w$ G% U5 x$ G* \
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    2 A" G! e  E) q+ X$ _
    , t. B3 N$ y; |, c, l+ m2.核心函数及代码, H$ |* @  c8 o7 V8 {2 [
    2.1 数据预处理
    / Y* p6 h! }! `( e2 l( ?对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:$ F/ R3 t$ t6 Q9 K$ n( g& {

    6 u7 ?+ v2 k( ]8 L#1.将传入的数据转换为算法可接受的数据类型(布尔值)' }* E4 M6 t" P( I" `; B6 w7 k
    from mlxtend.preprocessing import TransactionEncoder6 I0 `' R( v$ n+ }, k- |
    te = TransactionEncoder()
    0 K3 G, R6 i" h/ Gdf_tf = te.fit_transform(df_chg)
    . V6 G- u5 {+ b  b4 H2 G0 A#为方便进行查看,生成dataframe+ ?; D6 E- \. H& o* z
    data = pd.DataFrame(df_tf,columns=te.columns_)# ?8 M. b) t) E- \& H: x0 R" u5 J
    1
    6 u2 |. }5 n* Q2 F- c  P, A5 ?) U2, v( w! w1 E2 `1 X3 l
    32 k0 r. q: o3 Z- S- L1 w: ]
    4
    : o5 S& u4 I2 H0 T) _% K4 c5
    8 l6 \& C% a& Z6
    ) k/ B* ^4 h  ^$ {* m! ]运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    / T) Y: w% K, F1 W) n7 `2 o7 G  k# d
    ( }7 _3 I# d* c3 I
    2.2 两个关键函数8 X: L, p# \; }: p3 X3 ]
    apriori函数
      C# H% l. v8 u; F- e% q9 A3 Y语法:$ M7 v( c3 k: Q6 u9 x: h* A' z

    0 f( p/ B: L% P$ m  d" q! Z2 Tapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False); H: s% F/ F3 O, p6 \
    1; W  i. V9 e1 J5 R5 w
    参数详解:$ h* P" D. Y( t0 v9 q5 ~

    # x5 {5 L1 K$ V2 edf: pandas模块中的数据帧,DataFrame形式的数据;
    " P, }+ J% u7 smin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    - J! E% r6 P3 V' Y; _3 {; Xuse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。- u" h& R0 v! c" @" ^( a( {; O5 e
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    0 K+ C2 X9 C+ P- ~9 O4 g+ zverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。6 `2 u' K2 \# z5 T: E
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    1 v( _& Q9 {; b+ u2 w/ Yassociation_rules函数
    ( B6 R4 r& y* c7 D/ ~语法:1 L4 m. j8 T9 P6 }" w  P9 D

    , E0 R4 W9 ~* q6 u7 @8 ]association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    . E0 `  O% S  J1
    9 U  J% x$ d) X. ?参数如下:3 z# [. d3 f& H; e# ?/ o% B

    $ g9 }+ ~: D# y9 U1 {df: pandas模块中的数据帧,DataFrame形式的数据;
    : x2 }- y; a/ B$ ~; k3 S3 }metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’; x, z# b' g( P! {
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    ) |6 U& F# W9 m  Q2 F% xsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。- [9 ?# t- \- b  k* U
    附带metric几种参数的计算方法:! u& O6 j; Z  H8 z# Z" }: h
    / a8 |- P0 y% @8 C) T
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    & }' l: w" b% \* O" P- S4 q2 ?, q( f/ y( g# m
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]/ f0 L$ J% r2 `: q/ V% k( F" u4 Q
    , |5 V% b; s; a+ ?) g
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    ! K/ j3 f% h) v8 C
    3 {. G0 i3 D9 i% J# A0 }1 C5 |/ r8 zleverage(A->C) = support(A->C) - support(A)*support(C),5 x3 a+ L& u! T
    range: [-1, 1]
    6 I3 b7 p, d: f1 G, w! A# Z' t" B1 a
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    8 l* X# q6 u/ I/ N3 orange: [0, inf]& \- k. y) s' g' @: I, |( U8 O7 h0 Y

    3 b; W) o! R0 ^* @7 Z3.实际应用案例0 T  Q' f1 ^  |% v* }( D( s) d# }; i
    以下为完整的调用实例:
    1 C% `. P" g4 c" ?7 `4 p4 T( N! |
    import pandas as pd
    3 ^8 a' n! @9 O( S* P/ N6 vfrom mlxtend.preprocessing import TransactionEncoder7 r: s6 E+ g* N! G3 x" ?
    from mlxtend.frequent_patterns import apriori. A, m* l$ K6 I9 ]2 Q
    from mlxtend.frequent_patterns import association_rules
    - w. }' {; }5 g: n( i! p& R#1.构建测试数据- h% }$ H2 G) z5 j3 K) v' ~7 F
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}). b$ ^* e: I3 Y2 k; Y) \
    df_chg=df['product_list'].str.split("-")* ]# k  J4 _6 a3 R4 }5 R! }5 x
    #2.数据预处理
    # A* g" U5 G9 G2 ^% F* Z4 E7 `6 x#将传入的数据转换为算法可接受的数据类型(布尔值)( C" s9 J/ y9 h
    te = TransactionEncoder()
    6 }2 g% r; r0 ^( @df_tf = te.fit_transform(df_chg)
    5 C! E7 C8 v/ |2 A" |; A#为方便进行查看,生成dataframe
    0 J4 J0 ?! s* I% U4 L1 w& L7 {/ P% Mdata = pd.DataFrame(df_tf,columns=te.columns_)
    2 P  I5 @  {/ ^4 A4 v, O#3.建模% t0 }! K* Y! K
    #利用 Apriori函数,设置最小支持度为0.2' M( B3 ]8 l1 {6 V% W! f
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    " D: n3 ]& O& L6 O9 M#设置关联规则,设置最小置信度为0.150 ^/ D3 f3 u9 K) k9 v9 I
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    4 {# T7 B* a- u& Y! K. f+ F7 g#4.剪枝并控制输出+ [# y. Q* Z" V0 u% }' ~
    #设置最小提升度,并剔除对应的数据
    * o( G4 h! _1 z2 K% h3 p- {min_lift=1. H+ X) e; y7 T; c$ P
    rules = temp.drop(temp[temp['lift']<min_lift].index)
    9 i- `! v" S" B- S5 P  B/ \8 ?+ w% I#筛选需要输出的列
    ! O4 w. R: s' g5 c# q& wresult = rules[['antecedents','consequents','support','confidence','lift']]; v* K5 l( q4 ^
    result=result.sort_values(['confidence','lift','support'],ascending=False)) N& _9 E6 R" T: g5 s6 |+ w
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')2 }* B1 V. L. K; P) q0 @2 l6 V
    6 M( u' o/ k% k- L% u
    1
    & Z  [9 u' t- [+ A26 Y% V, m. w" e4 T+ G
    3
    ( s' C. ^! L4 A3 }* a1 s  R+ x4/ ?1 M4 T$ S: _; b5 J
    5
    " j5 S4 k6 E( Y9 r2 E! l5 g: [) X( F; X6
    # I( a9 \4 @. D7
    ( j: R( W7 G  w2 E- V0 y3 P& S8) Q: \3 u" }; f4 p& N
    9& W3 c& w. c# h
    108 t( y7 B6 l" I5 I
    11
    ( k! H& n, g, A5 U# s6 H9 V1 P12
    5 U4 |' L" o, o3 o* C+ o+ X. k13
    / X* Q2 ]% k7 H  D# X14$ ~. P2 H/ q4 T4 R2 b$ P3 X2 A/ @
    15! z) W5 z( I; ?6 j' I' F8 y
    16: d" U+ E* o  X3 f$ @: W
    17
    ! V5 Q4 L( |6 F! r# F( Y18/ m; S* I8 W) ]8 ~* ^) X/ r
    19
    & W& \9 ~7 Z0 z, b20
    : A# B/ X  z, }- b( C) }" [21) k+ x3 b: M7 b# P( d
    223 D+ G* ]  v2 g' v' x; X! m
    23
    8 A9 \8 F1 @' f. M9 \# B% P24
    - v; O+ C0 f  X- M# q8 b' V6 o25
    # H& j9 H6 n) q26! n" x/ c* M8 m' T* K0 h5 I. P
    输出结果见下图:) u) a  o! T1 Z! X
    1 K$ U8 j! Y3 i' G
    ————————————————
    ; h$ v$ T4 A; T版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    0 k- z+ h3 l0 a原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759- g4 u/ x" Y7 e3 |; k2 X9 X
    4 S7 U/ j/ q' D
    # O/ t* @5 V8 b4 R% T
    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, 2024-6-6 22:15 , Processed in 0.648022 second(s), 51 queries .

    回顶部