QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4980|回复: 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算法篇  S! D! L* [" P6 v8 k* q6 y5 X5 u
    / D1 v: s! R8 f$ c: c
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    6 H7 l+ c- l/ W9 ~! N* p* |% i0 [1 U( w* Z0 Q5 M
    1.准备工作
    " Z' i5 }, R3 a* M如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    , Y4 j, f0 v0 ~' {9 s
    " E! y3 Y9 l7 y3 `. f2 Qpip install mlxtend
    & s# r0 {+ @' K1 X+ i1/ `$ d, N6 o- n; o3 f9 A
    为方便进行过程的演示,在此构建测试数据:
    $ m6 U# p# n9 r* h8 N9 }0 k( j, ?
    0 `, M# _3 j+ z1 V9 limport pandas as pd
    9 V6 l! t! }) `: ^7 kdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ) l% c7 A0 ?8 n3 ~1
    2 Q# {# s# x' |2 m' U- W2, b) a7 I! ~7 a1 o! a! C" {
    测试数据截图如下:3 G$ H' E8 A! Z* E8 m# H: u
    2 p2 @. M# ]) V- Y0 L5 X) ^* V
    0 ~  g7 o9 C& x5 Q8 _9 ]
    对上述的数据进行以下处理:, d/ U; k6 ]% Y" u. r
    ; f- Z3 N& q  g# v! S: k
    df_chg=df['product_list'].str.split("-")
    1 i: R, t1 q- s( }19 N, W+ B/ ]7 g3 \3 t
    数据处理后,结果截图如下:" I" h3 |1 \+ B* p- v

    4 T7 g% L6 d9 @. }, \$ J截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    ( G: D# m# `1 \1 e1 E$ Y
    - G2 T" Q0 W; D/ n5 p  e. g# O2.核心函数及代码
    ( y- |7 u/ c% E; P3 N! K  [0 h2.1 数据预处理
    & L9 m" `  Q0 o9 J! v. Z" q( k对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:$ C  W+ y$ X8 B/ Y

    % F* g; [$ u9 \+ O+ V6 g# y0 A#1.将传入的数据转换为算法可接受的数据类型(布尔值)$ y& J( F. P$ q
    from mlxtend.preprocessing import TransactionEncoder
    ! d! j" P8 L; P7 Z& l# l. P1 e5 |1 yte = TransactionEncoder()4 t, e% s$ ^$ ?  X  d
    df_tf = te.fit_transform(df_chg)% S$ }* x+ F4 p+ U1 N
    #为方便进行查看,生成dataframe0 [5 {/ i" W' t: O) ^1 G
    data = pd.DataFrame(df_tf,columns=te.columns_)
    0 u. I! U( t1 h% c3 ]1 x1
    ' M- \$ }/ P( T7 Q; T$ u) V21 }% A; m1 V- b2 [
    3$ `) I  u8 ?+ Y9 {5 G5 b; Q. S# [
    4
    ( |; Y) N1 H0 A: S5- D# M7 o8 _1 e, {, P$ K2 h
    6' A% e' j. ]& }0 h, i
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    9 r7 l, X9 M& H' r% q
    $ R7 k( ]- E9 N: s, r. |* p' X) S) g- D' R) M# |+ b3 ^
    2.2 两个关键函数& n) n0 a1 o" O% L' X
    apriori函数
    & C' L: F1 {; E. h! B, |语法:' u0 v' J  U* `6 y

    1 R: F+ d" z! X  l1 bapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    , L. K6 h9 A' \1 M. j, C0 w1
    / Y& ~2 J; P# I; z$ I2 o参数详解:4 n2 R* c$ v& B) d- R- z

    . D# Q8 A3 J* o, G) n3 Sdf: pandas模块中的数据帧,DataFrame形式的数据;
    , l0 _* b+ M  c. q+ ?: a: Nmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    7 g+ e* Z! C2 q' e7 c/ g# Vuse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    : j4 N7 Y# D# O- Xmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。6 }3 p( x+ j& W8 S
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    6 X9 V+ Q1 D( `1 wlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。$ W  H5 N, G3 r  I! x2 _
    association_rules函数
    1 z; l( G8 _. \2 t  G# ]语法:8 Y1 K# O7 s9 u. b) |
    - z( W' [2 O5 z3 p7 n" Q7 _! h& l: Q
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    / p! ]8 s" A( Q5 g, v) y7 I7 i& x1
    / o# r" D7 h/ L0 \+ _) \2 @参数如下:! u# g; H6 ^; m
    1 g! C* I3 T4 [% O4 V
    df: pandas模块中的数据帧,DataFrame形式的数据;' P4 p2 B7 \4 l
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’4 o8 F* ^' \- _  H/ l
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    - Q& M: z# C( R7 ssupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。# j- C3 ]: C2 z. \1 h0 E6 i: {
    附带metric几种参数的计算方法:
    / K% H$ [# y* N) b
    6 b  u6 z6 Z& a! J4 A; Ysupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    $ [4 S; l( B7 P3 ~4 Q; a% b, a7 u+ ]( K- @" n2 j4 C6 U/ w
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    # M0 `# S0 j1 G' ?2 q' v9 {
    : H0 `; s- m8 G. U8 olift(A->C) = confidence(A->C) / support(C), range: [0, inf]$ W8 \* A& ?/ o. [9 z; b) |

    " ~! ^! T9 S4 c6 x8 p& K  o1 r2 ?leverage(A->C) = support(A->C) - support(A)*support(C),
    5 x: Y8 E' a* v0 e- U% [* q& c# O# urange: [-1, 1]9 Y5 n0 v# a7 l0 q% c+ p

    $ D0 b, y; U9 c& Wconviction = [1 - support(C)] / [1 - confidence(A->C)],
    . D' {. q2 G, j2 \range: [0, inf]
    " ?- A, \+ ]! N2 L" q/ _
    . D  r" H5 G: r3.实际应用案例
    ) ?1 R& I! F5 D' f  Z# O+ o/ z/ Y: k以下为完整的调用实例:
    & z- W! P1 I( y+ P2 s; q$ D) Q) {: P2 w; C3 x' P1 P: B2 f4 n8 T
    import pandas as pd1 n: K6 V. Y. S( f5 ~) `
    from mlxtend.preprocessing import TransactionEncoder% s) L" n8 g: K# F8 ?
    from mlxtend.frequent_patterns import apriori
    " |* c; a! y6 x* F' [from mlxtend.frequent_patterns import association_rules9 Z. F7 M5 }  J% h' f
    #1.构建测试数据
    0 F& w( n9 ^6 m  T" xdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ; z1 Q6 i; n7 W: B( Zdf_chg=df['product_list'].str.split("-")! ]3 Q2 k* b3 |# I% `# X
    #2.数据预处理. b5 I% O+ K* U3 |
    #将传入的数据转换为算法可接受的数据类型(布尔值)  }# I+ A8 x0 w$ U4 Q
    te = TransactionEncoder()  U  I2 U1 a  s. d( A
    df_tf = te.fit_transform(df_chg)
    ; q! h% `" x% \8 J#为方便进行查看,生成dataframe
    # H5 m% j  Y5 x& f6 s! wdata = pd.DataFrame(df_tf,columns=te.columns_)
    $ L3 O/ {  \% I5 r; G#3.建模
    , n$ b  s5 B% h3 b7 W# [8 U; k#利用 Apriori函数,设置最小支持度为0.2$ [& @! u, T  G# L  H/ P7 W" Z  L9 @9 ^
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    , a" s& {3 a, K6 b# s#设置关联规则,设置最小置信度为0.155 J% B' @( L- e; Z+ F  \4 I
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    " ^* _7 q& u& O+ e#4.剪枝并控制输出
    : D' p8 E3 Y# b" `/ Q5 t4 Q#设置最小提升度,并剔除对应的数据9 u0 L2 j" `9 a: _. m
    min_lift=12 A# Y& [( y: G! ?, y( {
    rules = temp.drop(temp[temp['lift']<min_lift].index)
    5 p4 }' U2 L. p! A6 W4 A* [#筛选需要输出的列
    6 H& V2 N. K+ d6 B$ j: Q. Z+ p. sresult = rules[['antecedents','consequents','support','confidence','lift']]
    ; }8 }+ A8 T3 T7 hresult=result.sort_values(['confidence','lift','support'],ascending=False)
    $ K5 B& b) M3 o+ F: j" {result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    " j) Y# W# s' s6 T2 O2 D9 I+ ^( m8 u4 l( y- G9 \
    10 A$ o2 D, v  U2 i- l* v  C
    2# ^% f0 ?+ W, H3 @: g
    3
    ! t, A& }7 l; S) f! I' z  X4# |; m% n* d  P
    5
    , r/ p( i/ Z. E) M6- Q6 p) Z! R* ?, `1 z  Q; f: ?9 D
    7
    " b  c  c/ n: r8
    9 S1 d+ x7 v$ u6 _2 U9. Y5 m+ p% x5 O
    108 \$ }0 _6 j; K/ x- {
    11
    ! E% ?- y0 T6 h12
    * b5 I- _' `, F13
    1 Q% X; [# J/ A# Q. i) k4 o6 r; j4 P& P14  ?  N7 O# O' [
    15
    9 x$ X# F- J& w( Q2 t* f16% P" L7 x0 m! L! A+ _3 f$ q  H
    176 |* @1 r, X7 j$ f+ p
    18
    ( J8 p' O1 e3 z5 H7 I; n  O19
    & v+ r5 `- j) G' O9 P" U6 i206 d" F  W2 [! S( O
    21/ ~4 Q' H9 o6 @* i1 `
    22$ V; c- W; @8 y2 ]3 h
    23
    & V( ]: [: m; [/ q247 }4 c* f. ?# ]4 _
    25+ j0 i& F- d2 o# O
    26
    , ?/ v' T! F' I$ M# b- n输出结果见下图:
    ( [- @1 _* l0 O
    $ ]; M# z1 x9 j$ N1 U————————————————$ E, l# u) k4 I
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 w/ M: ]! S9 c0 F原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    0 Y5 _0 N1 q$ ^, H
    ) N' P$ ]. O9 r( J$ E7 K# p+ u  v2 d
    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-16 11:51 , Processed in 0.401140 second(s), 51 queries .

    回顶部