请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1834|回复: 0

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

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

5250

主题

81

听众

16万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    发表于 2022-9-12 18:44 |显示全部楼层
    |招呼Ta 关注Ta
    数据挖掘——如何利用Python实现产品关联性分析apriori算法篇3 Q$ P; j+ F2 K! ^% I$ p4 g* ~

    # e5 [, |4 w+ U/ g在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    & O8 b+ J: Q5 \& R* z% o$ Q& s8 h1 Y) \8 _
    1.准备工作
    " p3 {% [% `1 r# k" h  Z如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    ; A% [' q! d- Q- M- e8 e1 ]7 `1 R% E) d9 H4 i/ P; h  i
    pip install mlxtend, X8 Z6 t) |. k% ?, y
    1
    1 o' F# `5 X6 C: ?+ `( h: G为方便进行过程的演示,在此构建测试数据:; v3 W6 H/ l: E9 b; c5 c
    0 W' t: _/ `. ?) R2 @
    import pandas as pd( J) D9 O( s1 ]
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    1 D. x! z( Q1 ~2 t1
    # B# k8 J" h0 r7 _( E, Q. Q5 ]/ B" H2- U6 ]+ ]) Y; [/ X) S/ A# r, ~
    测试数据截图如下:. |- C7 k) ]4 o
    1 G2 N& t7 f9 y( A! `

    , \: H! V2 _. @2 ?$ H, Z1 X对上述的数据进行以下处理:, l# E0 P( C' ]; }

    1 g# \, C, p# _$ y1 C  J% Bdf_chg=df['product_list'].str.split("-")
    5 o& k" t1 p3 j6 F+ C* ^" Y! A1 p2 G1. Q( w6 U& [/ b  z5 N- q5 }
    数据处理后,结果截图如下:
    - K+ i0 ?4 x+ W6 P! I) E) P0 \* Q0 N
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。, x8 ]* T' }, j3 A$ @

    $ z1 J1 H/ \9 k2.核心函数及代码
    7 Q- O6 H. x& Z0 {; E$ j2.1 数据预处理, ~! Q" F4 c3 N% m( v
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:9 \0 m: F2 b+ z* I+ g

    ' M/ o/ L9 f% K, G+ q# y( A1 A#1.将传入的数据转换为算法可接受的数据类型(布尔值)
      Y9 O) F  y) C. Ffrom mlxtend.preprocessing import TransactionEncoder" p8 o4 a, ~0 a# R1 _
    te = TransactionEncoder()
    9 m; W5 [' i) ~, q2 h: T2 B; T& k( Kdf_tf = te.fit_transform(df_chg), Q4 B+ C5 d8 D  q. u
    #为方便进行查看,生成dataframe! u0 K$ a9 k+ t% C# e: m" q& R4 ~* w8 X
    data = pd.DataFrame(df_tf,columns=te.columns_)9 Y% f, c' ^  i0 I' O
    17 y+ B( Q1 j3 v- v, s2 A
    25 y* u- U6 I* U3 N, N- L1 \; k* D
    3' v3 U8 x( c' y
    4
    . R6 P' f% ^" f9 l0 q3 a/ f5
    % s& q$ K: f( c/ O: w- Y6 I) D# n6) w; N; X% M! h2 r8 t1 h
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    - }2 V* b( m6 q) t8 G, [- l( W+ g; {1 w

    1 V4 f& L. q1 N( o2.2 两个关键函数$ z7 Q' c" r- s( w
    apriori函数
    * l, N0 _+ S" V( g) M* q语法:
    , `/ U0 S  O) O; R5 w' o- J! ~7 \
    % }' q. s( a# J6 wapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)4 f5 `2 t. ?7 @2 x+ e
    1
    + z" o, M1 n0 U0 w+ y% ]+ T参数详解:
    " d: l/ q' f" J8 }- M" @1 W6 H2 M/ I8 T3 ^8 M) E' ?
    df: pandas模块中的数据帧,DataFrame形式的数据;
    ' A) P8 s7 a0 |, d( B% J3 B% z6 M* P& vmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    , j. I+ V' b% E# ]1 Guse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    $ y3 W3 U5 D% v8 D& ^4 P9 e7 Emax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。! b# V7 z: b" Q+ {6 D5 K! y* |
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    + [! P/ }, E$ D$ f3 ]: X. [low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    / t$ Q# z& I/ _) b# P, V3 {association_rules函数
    / w, ~9 p3 m. h& V. o7 n语法:% P4 C# j; ^, t; ]

    : u' r5 {$ ~& W5 Q: o3 h  lassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)' E' I& \  J# l
    1; J( G/ U; P4 z& v! O2 O$ A5 J9 }; R. T
    参数如下:
    # W4 d. h; i' |: \. S+ J* C1 `( X) `" j! X6 _% e
    df: pandas模块中的数据帧,DataFrame形式的数据;8 a: Q( d1 ]9 F/ b
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    / [. [# ?! Y( I  ~! [3 gmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    ' Q, {- C; H2 t1 p' v; esupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    2 P# G7 G* l- m1 {附带metric几种参数的计算方法:: t. u' H6 Z2 {) _5 }9 i6 g( x# [
    ) L  f% i+ e! a, A
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]/ D1 k5 {; N2 N8 \/ }. Z

    # t1 b9 @# ^3 P/ a3 Tconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    5 h# H# e  U" [0 D
    9 B  }; j; Z! @2 o! \. d/ slift(A->C) = confidence(A->C) / support(C), range: [0, inf]- M4 Y; h: _; ]6 f7 }5 P
    - A8 q. F/ [: c1 U# k. ~8 z
    leverage(A->C) = support(A->C) - support(A)*support(C),  q( y% x  e# i+ n+ m' U( K  l
    range: [-1, 1]4 @% J$ s9 J  o: [
    - T: F4 H6 H  Y7 |4 n
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    - U3 t' c) V* W1 K1 p9 [range: [0, inf]; y0 ^0 x  C) A8 j4 Y; p8 c
    2 p( P" y4 D$ |) s! f! A9 N
    3.实际应用案例
    " ?4 G$ Y$ r5 Z) Y5 [" g以下为完整的调用实例:2 }* Z* r" e& M4 X, Q6 o: V
    + R! j% s6 Q( |$ B& M+ C
    import pandas as pd! |' S& Z2 S. r3 R5 V1 G
    from mlxtend.preprocessing import TransactionEncoder* G; @% C' S/ _# N2 f6 _
    from mlxtend.frequent_patterns import apriori
    * B; o+ N' s8 G, E7 s" Kfrom mlxtend.frequent_patterns import association_rules+ v; g. \! ?3 u8 O' e0 D( r
    #1.构建测试数据0 U  S% C7 j5 A
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    8 g) ?  Q( v- a( Z) Odf_chg=df['product_list'].str.split("-")
    0 b% R7 b0 c6 q- `7 V* m4 b#2.数据预处理6 m7 R0 s. o. ]( i, g
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    & @3 w3 c! S) Vte = TransactionEncoder()3 v+ x$ i0 E" [+ U" U6 W
    df_tf = te.fit_transform(df_chg)7 _1 |6 D) {( T* F3 D' p8 p
    #为方便进行查看,生成dataframe. m. y- B! |; K& {+ H
    data = pd.DataFrame(df_tf,columns=te.columns_)4 \" T( E5 @6 Z3 W  r# E
    #3.建模
    + j2 {0 i5 S; g2 o3 T#利用 Apriori函数,设置最小支持度为0.2
    7 l: ^% M* H* s1 c9 a3 A$ Ifrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    3 f4 c# F; @& |4 i2 b* i+ W. ^2 o8 P#设置关联规则,设置最小置信度为0.153 j: D6 b( `. M  R' r; }& w9 i5 r  N
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)4 x" [! R: _2 S/ D- d& x
    #4.剪枝并控制输出8 I8 h, u5 V5 \- c- y" L" h8 K
    #设置最小提升度,并剔除对应的数据. W  o  l; l9 W( g* h6 x
    min_lift=1
    ( \  w  w. K1 Brules = temp.drop(temp[temp['lift']<min_lift].index)" G7 b, \0 E/ N5 S5 G6 K
    #筛选需要输出的列) a) R, U8 s5 Z2 J! n5 o6 e$ R
    result = rules[['antecedents','consequents','support','confidence','lift']]# D! X  _2 L5 s) t4 B8 H  E- `6 x5 Y
    result=result.sort_values(['confidence','lift','support'],ascending=False)0 \, |& u4 a7 i- F4 c& O
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    5 o; F( w! n; U. {( o, x0 k
    9 |0 _3 z8 R) b7 J- J0 h. M+ t' s1
    $ V3 }0 q# S3 y. i2# M7 d4 x$ {. K8 [7 n
    3! @# |  B. v# N
    4, C/ w! o" {( ]& p5 r6 A
    5
    8 x. ?3 J2 D7 G9 V6
    - b8 x# u. d9 t% R8 L8 k& b! k7
    0 d; }5 G+ I$ J& b4 m# H2 \; ]8% E( M  W- T& t$ B
    9& q3 v* N* w( ?7 Q! u
    10
    . C: K. v4 ]- l# K9 X110 l5 s9 @* d+ V, d- i" l
    12- x3 J1 T% [2 R4 C2 e
    13( @/ x& D% s7 G* x$ T0 ]0 F
    14
    1 h" c( }* Y' v4 i  ~% l4 d15
    # w# @3 L1 M, X3 O6 l16: G" e0 B8 _! z2 S# ~, S( W
    17
      E7 m# H+ D7 `18/ N7 d, m9 W; c/ T
    19
    ! W" W6 f0 O0 Q. q# @20: \% S" A; Q; d' X
    21, `7 ^; G, h7 g. d
    22
    ! \' S& n, e3 O# F232 k2 B3 _' H+ E: O. j
    24
    + N/ ^" w5 f% P/ ?! Q8 o8 x1 H25/ _: D; a4 w# D- f$ R! G" g4 _
    26) d2 a5 s5 s0 U: x7 v7 p% j# |# }
    输出结果见下图:
    + U; P( ]" r/ e
    # d; S" J/ O. c3 w" i0 c————————————————
    * c/ u1 f3 q% M; `+ Y" X2 `3 t" w版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* t* e/ u" ?0 F5 Q4 K$ g
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    ' ~/ D2 {1 Q' H7 a" H6 A$ E7 V2 K" t& u& U

    $ `* z) c3 W; {. c. p
    zan
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-3-28 18:35 , Processed in 0.313084 second(s), 51 queries .

    回顶部