QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5013|回复: 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算法篇
    6 g% D2 D# p3 E% ^; [( u( i0 ]4 r' V0 l- S0 O
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    . L+ {  E- n4 V7 x7 j' S4 w  W$ B2 C7 h4 s1 Z4 k( V
    1.准备工作. k3 l5 I  V6 _" S$ P/ y9 k& g) U
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:# K0 p$ y5 I' N
    " G1 A( D, ^' l, Y  Y8 i
    pip install mlxtend
    1 c4 A7 Z% \, a+ ~+ n1* X. Y! V/ t" X$ O2 g
    为方便进行过程的演示,在此构建测试数据:
    # g" F: R) ~8 {
    # N5 b' r2 [! @8 }import pandas as pd
    " X! p. D+ Z5 K  r5 g& m# j; `, |df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ) m" d% N( C# T+ N+ y7 b$ B1: V3 l% o8 H; Q5 \. V
    2" [+ a  u2 X( G
    测试数据截图如下:
    2 U/ }5 s! |0 g! }8 Q
    2 ]' }! C2 s- V" D9 v0 a' s" R3 \- C8 a! }5 Y
    对上述的数据进行以下处理:
    . z1 M7 ~8 K0 r. v. C) E( |0 ]% K7 H4 a3 t
    df_chg=df['product_list'].str.split("-")
    + b9 g9 E7 R; o1
    ' T8 [* T& b/ E) g数据处理后,结果截图如下:- j& l- u9 [" H% K& n5 t- F4 p
      K" d6 h4 j, _0 @0 b& b3 z6 z( k
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    , C8 t, m2 i5 C+ p# X  T) y8 m
      y3 V. O/ G* U5 O3 b4 Z1 I1 J2 S2.核心函数及代码
    % @4 F& z! e  p: L3 C+ R7 V2.1 数据预处理- z  x- \3 I3 s* ~
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
      y3 }  X8 t# O% V! i+ p% X; |$ W  e; e0 A
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)
    5 A% N0 J5 v& Kfrom mlxtend.preprocessing import TransactionEncoder& C$ R5 t7 U8 @. v3 ~' Y
    te = TransactionEncoder()
    - x- Z" ]8 u. X' a  tdf_tf = te.fit_transform(df_chg)
    . G8 i3 I4 e9 D#为方便进行查看,生成dataframe
    - u) J7 r) O$ D' Q! D, ~data = pd.DataFrame(df_tf,columns=te.columns_)
    ! m% U+ ?2 I6 ]2 c' R+ G3 |2 L! _# U1' E; y: P) C. D" L! _, |
    2
    ; J& f' ^0 X* ^( A4 u% e! W( f37 }" p" G" E8 y- ^# b
    4" ~3 Z0 B3 S  C' h# I7 f6 ]
    58 {2 H1 Y# y' d" n
    6
    ) I% Z' {# S$ I* t3 o运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 X7 p9 c5 A: s5 o
    # j! r; ?) I" m' [
    1 x) S6 a" f4 K1 i. m+ B3 [- r0 l
    2.2 两个关键函数
    + m, p5 M1 q3 U* \apriori函数
    # a, e3 n5 k1 M. f. r( q, F$ {语法:
    2 l4 ]! X0 C6 K% `6 m# Z+ I
    ) H) f3 V8 n2 D6 xapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    , W0 C9 h5 H* Q6 e$ a17 S$ g7 k: n2 J- X$ ^5 y' {+ H% I2 T
    参数详解:$ f& s/ E2 G# R% X

    , {8 e9 y+ J) g/ ^' |4 mdf: pandas模块中的数据帧,DataFrame形式的数据;
    + J3 w, Z, q3 H# K: I5 [( z- E) Vmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。9 T5 O2 x) t; }% ~$ v: V
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    , d& b' |+ m! G  j3 p( Z; @; V$ ~6 }max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。1 |7 j0 P' u- J. `  [# V  u  V
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    , |# R! Z. q) V0 R' I+ H% alow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    2 [) L) q6 w& Y0 cassociation_rules函数
    7 K) S- o& y$ u4 b5 M! ^语法:
    4 }% |- J- k  ^+ A5 e5 I$ r" L
    ( K- L5 B2 s2 s4 ?5 P# C9 i, K; Nassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    ! F" ~$ d& W+ |; n' @1
    1 ^, T% z; I' m# Y/ ^" D& P% j9 ^+ `参数如下:
    8 h  A, H& U9 w- Y# z
    1 ?* e$ I0 R* Pdf: pandas模块中的数据帧,DataFrame形式的数据;
    . ~1 b. P3 d/ g( G) Tmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’, S( B' h. ~$ U8 G) |  y4 s$ F
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。$ I  Z1 p4 y4 O
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    8 w6 N3 {6 Q$ K4 ~' o$ r1 [" m附带metric几种参数的计算方法:. b1 k8 {  t7 ?8 l6 M# M" c

    " Z2 c% u) \* Y) Jsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    ( W5 l$ E; c; `( m8 ]- o7 q* p. j/ {4 K* D0 \0 j9 c
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]5 d0 J; P: t/ t2 c- T0 Y! D( E

    & C6 g, u5 |  llift(A->C) = confidence(A->C) / support(C), range: [0, inf]6 d# w, ^" q) {; \- m3 D
    $ l4 A/ z4 _! C1 Z7 x
    leverage(A->C) = support(A->C) - support(A)*support(C),
    3 M# r1 T9 k& k8 jrange: [-1, 1]
    7 p+ W+ U2 p+ P. q, ~, ~" n& ?5 g: L* G: W! g
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    " J  j  M- K; K% z* j& m' Crange: [0, inf]
    & Q* I* _) e- {
    . ~+ D! ~2 E0 @$ A& m3.实际应用案例
    , w6 {2 H+ z# T; u2 \! S: L4 Z% Y7 t以下为完整的调用实例:
    ( J% F. b; H7 d* B5 |* r% `, R, b5 u" @; n
    import pandas as pd9 N+ ]+ L+ x% x( b6 ~* M8 s- s
    from mlxtend.preprocessing import TransactionEncoder! h& V* \' u" r7 |4 r  b9 {
    from mlxtend.frequent_patterns import apriori
    ! t1 Z* t3 v* ffrom mlxtend.frequent_patterns import association_rules3 d  g5 _7 w" Z5 F# B
    #1.构建测试数据4 \2 v+ i  r" `2 t
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* K: @0 ]+ O) K0 g* B/ n
    df_chg=df['product_list'].str.split("-")! R1 l( m3 Y* m1 V+ J' n3 {
    #2.数据预处理
    1 X) k: }/ _8 t#将传入的数据转换为算法可接受的数据类型(布尔值)% m& l( T5 D2 G/ m8 C) C
    te = TransactionEncoder()
    - ~; R9 g; b$ s6 s* S+ G' X3 Ydf_tf = te.fit_transform(df_chg)  `) u7 h# x1 O$ R: M' G. j
    #为方便进行查看,生成dataframe
    ) |$ Z6 u* w$ i; Adata = pd.DataFrame(df_tf,columns=te.columns_)# Z/ P: Z4 W5 z" s! V7 }* J. z
    #3.建模
    " m3 ^6 n, ]+ O! f& P; s#利用 Apriori函数,设置最小支持度为0.2, Q3 m* ~* z* ]9 `6 }1 q
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)+ R. Z2 ^6 n, r/ f) X' m
    #设置关联规则,设置最小置信度为0.15
    + n5 H4 |* i$ Y. ~8 p  n+ A  ~temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)" m4 l1 u; k+ S6 ?; [+ ~
    #4.剪枝并控制输出
    # D9 T. G, i; `8 v#设置最小提升度,并剔除对应的数据
    - Z/ D3 c5 e8 d, O) N; l" Omin_lift=1
    # k( T  T: N7 c& c. }rules = temp.drop(temp[temp['lift']<min_lift].index): T) X, ]  v$ e! |  b% \; Z1 e
    #筛选需要输出的列
    ' j+ y2 T* }2 K! b% H* w- w' `  cresult = rules[['antecedents','consequents','support','confidence','lift']]
    ) F1 D5 F) T( G3 y* V$ \( M' J# e+ wresult=result.sort_values(['confidence','lift','support'],ascending=False)
    9 ~' x! V0 W/ F8 P0 }9 ?( wresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    * X& ]+ m6 Y. y
    . e/ V9 J7 Z0 i3 ]- Y1
    3 U' I$ z, B" U  I: ~2
      }/ }0 o& `7 b/ ~! K/ I3
    & p9 f# `# I- t+ R% G: k2 e5 T5 K4 T6 Z4
    " F# n3 h" k) ?) z- u( V5
    " K8 `/ x: P8 |) ~: ^6
    . [! H( w2 R, U3 O7
    3 D; }" T+ [3 ?0 N/ s; |  @86 S0 ~3 j6 I" y
    9" t1 u. o' L8 ^- S# c- i- A) S
    10% b6 u9 r0 ]% p/ ^
    11
    ( T4 T+ U& n9 D" Q- `7 O# ]! K9 R123 M. R& Q- F) I$ G9 f$ _* {  y  R
    13
    6 z8 `3 N+ \" ]" w4 q: `3 \14
    . W; a& ]! i! Y2 V& h! Z' Q15
    2 M; Y6 ^$ [  L- ^16+ q' P) J  e6 i" @
    177 t2 n* k1 A3 W5 E/ o9 e: k- ?
    18$ J3 V0 f* S" S% i6 c: z
    19. v8 _1 j" y5 [2 S9 x
    205 @, g" e2 x" G5 h1 _
    21
    8 T5 J5 D1 _. o+ K# `# ~22) r; g5 c6 ]9 {( M- S5 b
    23
    ! i. d( Y0 z( B: M8 R+ N24( V  g' A0 E' r3 U/ Y6 \
    251 h4 K6 B8 N9 S9 O
    26
    - Q+ G1 h- J$ X* K8 y- K! |输出结果见下图:/ y, `7 U$ [9 `1 v( Q. p# d; [

    - F6 y9 {; n% y+ K————————————————
    / u/ ?, |( c/ N% _- b版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: q8 v0 Z' P3 s8 R0 Y" q
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759  f6 G& Q: L$ O) |; q$ e
    " f" Y" j5 H( e9 P( u& P1 r3 i! ^
    * s2 d+ P% h2 `( F
    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-6-12 10:32 , Processed in 0.605195 second(s), 51 queries .

    回顶部