QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4087|回复: 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算法篇/ x+ l2 D6 ^" V8 c# F
    0 H5 \  V2 q, h  W* n
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    2 i# }- @2 f6 o; [1 B* e1 X2 s# U
    2 M% f" Y$ g4 U+ L9 l1.准备工作
    : Y" X( Y8 h0 |0 m+ \/ C4 S如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    ; ^1 T" K2 h1 W  {, D/ c, T3 n8 `* j
    pip install mlxtend
    7 V3 t" @  V8 g& n# r! j12 K$ |8 O" G" `
    为方便进行过程的演示,在此构建测试数据:9 M6 g0 D$ s$ W6 O* j2 _+ n
    - d5 r. J: k$ R+ z
    import pandas as pd4 q! T- z8 R0 y
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ' [' O* Z9 M; w, P15 r# N& }6 D- O3 f
    2
    2 Z+ O% @, I& K测试数据截图如下:/ `7 c  E% ^0 {7 _( i9 M

    0 D1 f4 Z; k- n5 s7 w4 o; P& S. m" P; Q$ b/ \4 G  P
    对上述的数据进行以下处理:2 w, s2 q! H5 H0 L

    " c$ r4 P7 }  s! x. V( E8 Wdf_chg=df['product_list'].str.split("-")! P( ~5 \0 {; B: I6 c
    11 ?% W: V7 k: I4 ^* \- M+ U. |
    数据处理后,结果截图如下:
    ( Y$ A; E9 X0 ^
    % Q* [3 e3 s) B2 @截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    % v. Y6 G6 q( l9 R0 f, x7 S4 n  d, t0 A  _( a
    2.核心函数及代码
    9 w7 o7 r4 z4 z  d5 u3 |2.1 数据预处理" a5 M  X: H. t# l' S8 C) v# F* ]; R
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:! B& X. L' }# y8 w! P: s; a- F/ ^
    5 D( T* T" Y. O( E9 R0 B% b; X" U
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)
    1 g$ h' W% q3 ]4 e4 B( zfrom mlxtend.preprocessing import TransactionEncoder
      t2 x& {# h  K5 i1 ]te = TransactionEncoder()7 Y  [6 C/ T% w9 r, Z* w1 t5 J
    df_tf = te.fit_transform(df_chg)& c4 h* e/ D+ u5 c' O
    #为方便进行查看,生成dataframe
    $ E2 F9 K9 V1 G' i" ]2 H! n7 tdata = pd.DataFrame(df_tf,columns=te.columns_)
    8 S, N& c8 r7 B) H! C& \1, V" G  Y( M! N' x6 V. B$ k
    22 Z+ g, f) M8 J2 Q/ c2 z5 l+ M
    3
    . _6 [) R% U/ ~" n( g  v# d4' }) W. L0 R& ^
    5
    2 w' x2 E% e7 o& i4 A" Z* R63 r; ]5 o( ]' y# v5 c
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:0 b1 ?# m# M. B% v/ ]. t
    1 ]( c/ y- M' [- i. _2 ?

    5 C9 S5 I% S9 F/ I3 [2.2 两个关键函数: v; `. t, z. G  |2 N
    apriori函数4 I* g( p% L/ x$ t: s: J# o# r
    语法:
    . G) c( \- B! a7 u, K1 d
    ' }0 m- X: m! _" Yapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    ' {- D7 D; e) L+ m/ [1% B8 [, }' x8 N
    参数详解:0 \+ Z, V  l  M; Q, S! m2 ~
    - o% s7 r' V' G# G' Z
    df: pandas模块中的数据帧,DataFrame形式的数据;
    ' p* J& R2 L% m. G, bmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    6 I) C1 d6 @7 Luse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。" ]+ y) L6 T" b
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    $ K2 p; y  k, k! ^verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    $ ?2 |- J& K6 @& Q: alow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    $ l' t: ~7 f& P, f" W7 z  zassociation_rules函数
    # n* {# z& T! x% G' a' z; O语法:
    ( G: Z$ U# l; ]7 _% ]7 l  A  y6 m* t5 Z# Y' ]
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False), F! _$ ^' V6 h
    1
    " l. w1 g, w9 g5 k  r: \" Q1 B参数如下:' {. I% N' g4 r) _3 X
    2 c/ e8 \% Q$ Z8 v$ @
    df: pandas模块中的数据帧,DataFrame形式的数据;
    4 Q# K. E! c" M/ k" M0 hmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’3 _& Z! {1 [/ v$ B! C8 O8 S, n; F
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。# y6 O6 q# }+ \$ ]
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    1 b. B6 Y$ \$ f) I! G. h. h附带metric几种参数的计算方法:
    ( Z/ g8 S* H. l& |9 J! Y6 o" ?: Z2 T5 h
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]0 z2 S$ f* X! u1 f9 \/ r- a. |  c

    9 i7 X8 J3 Y  i4 B+ rconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    4 Y. |3 l$ K/ g% a. m0 }
    $ A" Q* e; y( Q; I9 L" m4 _lift(A->C) = confidence(A->C) / support(C), range: [0, inf]! ]+ _2 \  ]' C2 ^

    3 K3 r) X% M" y8 F. j5 Q; h7 Xleverage(A->C) = support(A->C) - support(A)*support(C),
    2 |% r/ g, U! K( ?) r9 G. urange: [-1, 1]0 f0 A" w6 [0 e8 O6 W9 Q2 a0 e

    - [+ v" L! |: S0 D# S$ x) c$ K( Sconviction = [1 - support(C)] / [1 - confidence(A->C)],
    ) v/ j9 f9 x9 O) w3 hrange: [0, inf]# C. O: p' I8 Q' M  f
    3 f; {* R7 r- Y# q. }
    3.实际应用案例
    + ^, J9 Y5 i4 B6 ~" H8 Y+ S以下为完整的调用实例:0 ?" ^0 X6 x7 I' E( a: F* \! |5 I
    ; ~% ?* F* ~: j& R
    import pandas as pd; _  @/ U5 d7 X4 g
    from mlxtend.preprocessing import TransactionEncoder6 |7 |; A) h' D7 ~6 e
    from mlxtend.frequent_patterns import apriori+ t# o& E. @5 Y+ o
    from mlxtend.frequent_patterns import association_rules! U5 u) I' |2 C
    #1.构建测试数据( m  E% y4 {) w" h
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ! h" X% r: ]1 a5 R- L% gdf_chg=df['product_list'].str.split("-")$ v/ d% d- @1 V: q0 I5 S6 }; z
    #2.数据预处理) e1 ^9 b4 Q" U+ l- n. C, |
    #将传入的数据转换为算法可接受的数据类型(布尔值)7 R! P4 B4 R/ o  k
    te = TransactionEncoder()$ |; c$ k7 P4 ^- w5 a$ Z$ q
    df_tf = te.fit_transform(df_chg)+ ]! @; [. g- h5 j+ b
    #为方便进行查看,生成dataframe
    $ q3 b" ?0 K+ W% jdata = pd.DataFrame(df_tf,columns=te.columns_)' w' x3 Y  R2 I9 t& c5 c
    #3.建模
    ; U, ]% b  V! _3 A; l/ |# R5 c#利用 Apriori函数,设置最小支持度为0.2) w( N  U* @2 a* ^
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    ( T) B+ f8 w& e) T2 n#设置关联规则,设置最小置信度为0.15. a- D7 J- \# \% a4 ?
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)! o; X/ C( x: d; c
    #4.剪枝并控制输出1 Y: M8 F' Q7 C& [
    #设置最小提升度,并剔除对应的数据( x4 y! a3 e4 c) V0 R- C/ P
    min_lift=1
    ; w$ b4 H! f2 Y2 n- |6 y$ Krules = temp.drop(temp[temp['lift']<min_lift].index)
    " s' ?* Q; R4 P" ^#筛选需要输出的列
    : z5 ]' a# U8 T8 k' ~, D3 a+ wresult = rules[['antecedents','consequents','support','confidence','lift']]
    $ a5 l) E7 B1 K# Z& Xresult=result.sort_values(['confidence','lift','support'],ascending=False)
    ) @% i' e1 I" Q0 x, c) \result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')5 C- V& |5 `2 u! ?# U8 v+ P
    / s: D7 b6 G7 M/ Y* u) m) [- [/ f8 o
    1' b4 Z. l+ q: T+ P8 {
    2, N- `; k& p* l
    30 b' Y1 H* \' ~
    4
    ) |4 a4 S- s$ `9 |# l5  x8 S% G$ Y# Z; B1 o' H* K
    65 @  q$ j& d8 K' s
    76 X3 K5 N, e7 Y8 h6 V
    8
    9 ?% b* I. w: x, Z' v  U9" d% ]1 p; L. O: y
    10% }; S! E/ U" A7 k% V6 ~
    11
    9 |" j1 T. v0 V8 o12  ~# ]5 S# x! I- Q7 h& G+ y
    13
    , I% U, g( F# t2 F& p2 V6 C14! t$ Y9 s" T3 [# t6 O
    15
    # P7 F/ K; h2 t, ^+ r4 w16
    1 u5 o. p, Q4 H! b0 d; }17- M5 f" W; N$ Q2 R8 _- d
    18# q  @1 [8 |, y
    19
    3 {  j8 |) C, {* O0 [" Q20
    & c! L8 z/ b" q% m2 b4 E! p21* a" \1 [0 Q' }1 c5 S  v; V
    22
    9 ~+ W" Z/ M  l5 s. |0 \4 ]" _23
    ( E* |9 B  ]( o5 ?) [6 l242 E1 V# J- m3 M' ~7 L$ ]5 J0 D
    25$ J; i2 X! H+ p' `' P
    26
    & v9 ]2 |: Z9 _输出结果见下图:/ [* o/ i0 D7 V7 R# E
    8 U9 a% L+ X! x8 Q0 v) y# n
    ————————————————
    " l9 F- ]2 Q) s( b版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( c4 {4 J/ A9 ^) ~% Y) P' s' J原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759' ]% f4 z% [1 @$ X: n$ Y

    / m/ V( L: G) M% h( z6 [3 e6 R3 @, U/ _# H$ v6 S
    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, 2025-7-30 09:09 , Processed in 0.287620 second(s), 51 queries .

    回顶部