QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4984|回复: 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算法篇
    ( Y, b, f, s. y) Y& L8 a1 q; V4 f% _/ a$ F, }
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。4 E. A$ h/ U1 t  F
    6 `- V8 P% B) W
    1.准备工作
    5 |& ?3 x2 f0 E, D- a/ e, o如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:& X  L/ B6 V2 z

    ! Q# \0 T4 {- h0 Q& ?pip install mlxtend0 W, E0 u6 J, g: D6 W: H/ {
    1( G3 \1 s8 A. k2 j+ f& x+ h$ u
    为方便进行过程的演示,在此构建测试数据:0 t8 c& Y+ o4 g  _/ A

    * V2 |2 J% l0 e2 k6 N! Himport pandas as pd
    # S" o. t. e) [1 e0 \& I' edf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})6 p2 ~& n7 w" F7 d, d5 r/ R4 R5 E
    1
    # \  d; f. S5 ]8 G22 I3 x) g% G$ Q8 [' c. e7 i% y( o! r
    测试数据截图如下:9 B+ Y/ |0 i& l9 F) f
    % b$ L& Q; I! Y

    ( a0 {7 Y' F! t1 k" c对上述的数据进行以下处理:
    & }1 p  T. a8 ^
    4 H% L9 w* ]3 i1 v' z) V  y8 `9 ~df_chg=df['product_list'].str.split("-")
    4 R! w5 r; P& b/ ~1
    - V; J% r7 X$ q" H- O数据处理后,结果截图如下:: g6 V; q1 i0 x
    & n- }! l+ x/ p0 _% W% ]
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。. V1 q0 n2 J  K6 p1 j

      H! ]7 C+ t+ q2.核心函数及代码
    0 c; G$ p' C9 j) o0 C  [2.1 数据预处理3 J: B4 g1 K" T9 M
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:+ n3 }4 w% f( l0 |6 X

    # D5 s: D) [1 m7 m& T* J4 S#1.将传入的数据转换为算法可接受的数据类型(布尔值)2 G# n6 T6 y8 W- o: F+ m7 }% ~3 }
    from mlxtend.preprocessing import TransactionEncoder4 E; C) P, B. f' V8 [* u0 Y# a
    te = TransactionEncoder()
      V$ O( W' t9 c" J4 P) @2 Edf_tf = te.fit_transform(df_chg)1 b1 ?, d9 ^$ T# l4 V; U
    #为方便进行查看,生成dataframe# C; x9 w( t/ k0 i$ c6 [
    data = pd.DataFrame(df_tf,columns=te.columns_)" o: Q  s+ O4 _9 n# U
    1
    , f( L3 J( g0 L5 L2
    , }& I2 P" {6 u( v  B$ c4 f3
    7 |5 v* Y" G3 k4% c' D" V! P; P; ]+ R/ p
    5
    / P  [% @: E: i8 S67 _/ s5 z6 s9 A8 T2 f9 g
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    , K: [5 U+ J& Y! u: I) j1 |2 I. M8 J$ D! B! V
    ) [8 o5 ]. f" A
    2.2 两个关键函数! Q, o6 B: T- L7 p7 N' g% S2 H( Q
    apriori函数
    - b% F3 A- {4 ^语法:
    4 z. q/ I+ r* A2 P! ?3 X5 Q( `/ r. f- s- N
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    2 a9 t- P+ L( s! z7 \1
    ; Q0 D: v1 X8 `1 }/ g0 h* Q参数详解:, M1 V9 k  \7 E6 p
    1 L  V. S8 C0 u3 C" S5 H/ g
    df: pandas模块中的数据帧,DataFrame形式的数据;
    ( G- K' v' d( D) j7 mmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。( F" r( K4 Y; o" o, t) f9 t
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。  T, {  [1 G" R4 Z* d8 u$ x
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。) h# w6 u7 T% i# h7 J5 B0 V
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    % [" p# ?9 P  w+ C  Zlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。7 U  S( g! m& M6 c4 R
    association_rules函数# Q2 [$ p$ _6 T  W9 |
    语法:0 C5 O7 W: ^4 Y; R3 `8 F/ W

    7 G9 c. e8 t% B1 N" hassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)3 R6 ?% x* I* T  h" L. ^# o
    1
    4 m" l; ^+ r3 y! |参数如下:
    . s, Q2 O6 r3 o) c7 `7 [" E, a0 K! g$ E. ~' k) J
    df: pandas模块中的数据帧,DataFrame形式的数据;$ x, v  ^1 R8 v! I, I  D0 K
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    " W* Y' M7 J. M. `# w: Vmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    * C8 f* ]; T& l* w: F9 q- Gsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。" V# S1 N( K, @3 F& d* y7 `. z+ k- f
    附带metric几种参数的计算方法:
    3 L( n$ c% P! k
    / f( M$ D! @2 v' S4 p' a1 Bsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]+ h- V4 K4 H# o9 Y# i$ x! u' |4 w
    & H+ b. |0 ?* y. r
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]& M2 y8 Y1 N3 o  R' h/ d! d, y
    : @) i1 r7 Z5 Z
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    ) I  p0 b: d4 D0 M( `# ~$ z
      U/ A0 s, R. `7 ?leverage(A->C) = support(A->C) - support(A)*support(C),
    7 {$ y0 I- L/ Y3 `0 H  T+ Brange: [-1, 1]
    & o! A& W' v% E! ?, s0 L9 Q! _! z  U! C* ^0 r
    conviction = [1 - support(C)] / [1 - confidence(A->C)],, \5 @, t0 e) G! Z' z
    range: [0, inf]3 v( s' G$ [7 k  `
    1 L8 A6 ~/ {+ @5 A+ ]3 B0 s
    3.实际应用案例
    + |/ L# L6 K9 p$ ~; P- J* c5 ~5 T4 V以下为完整的调用实例:
    % r( y5 h. l1 E0 X% m
    , n5 l( ~8 o9 ~, X' _/ {- a$ uimport pandas as pd
    # O+ U, }: M2 A- w# v. pfrom mlxtend.preprocessing import TransactionEncoder
    ; I: ^  \. X" tfrom mlxtend.frequent_patterns import apriori/ m2 e5 J) S. n
    from mlxtend.frequent_patterns import association_rules' n% c, ^6 v$ E8 P' v) q- ?
    #1.构建测试数据
    . N, S4 k8 M3 x) A' l' Rdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    % r/ Q" D5 ]. ^  \1 B1 e" Ndf_chg=df['product_list'].str.split("-")
    ( B0 ~  J5 ?! ?#2.数据预处理
    8 Q) x7 R3 X1 v. J1 o6 Q9 S' X#将传入的数据转换为算法可接受的数据类型(布尔值)
      Q/ T/ j: L$ c4 K4 ?5 {0 Cte = TransactionEncoder()
    7 M* {9 t$ X/ K  Kdf_tf = te.fit_transform(df_chg)
    ( X1 _3 x% c( ]! G, g#为方便进行查看,生成dataframe
    4 i5 k7 N6 v' D% ~; ^; ~: d3 i6 Odata = pd.DataFrame(df_tf,columns=te.columns_)( H/ }! i. |, G8 @7 h# g0 R9 e
    #3.建模
    * h& ^; W$ W+ e' c. q#利用 Apriori函数,设置最小支持度为0.2
    % }$ X2 j2 f$ D' Q  tfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    * ~! r% G% L2 Y6 ~#设置关联规则,设置最小置信度为0.15
    ; |7 l7 M2 o& Z2 f5 J" gtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    9 G! R: W% M: \8 s  x$ R#4.剪枝并控制输出$ {9 S1 P' U" H8 v2 \+ X9 A
    #设置最小提升度,并剔除对应的数据
    3 _! }' d; O7 C9 C. amin_lift=17 o# F/ p  b% C4 V
    rules = temp.drop(temp[temp['lift']<min_lift].index)4 F- R0 o7 g! Z
    #筛选需要输出的列; E5 H& O2 m; S1 V4 Z% f  w
    result = rules[['antecedents','consequents','support','confidence','lift']]( T+ {8 a1 L/ m8 q: P3 U
    result=result.sort_values(['confidence','lift','support'],ascending=False)# J# v) W8 w, m. \4 l$ g
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')6 n) W4 M" Q% ?# F8 v
      W. ?1 G( d+ w1 p: y1 q5 f5 N: @
    1  A1 h8 \3 r- g
    2
    ( ~- V/ @5 w; r' Q3
    2 m7 J) F9 A9 ?6 {4/ v1 w$ F( a& C$ V
    5- s/ b' K7 B1 `: G2 f2 d: [
    6
    6 }2 y4 i- @6 k7 O+ r7
    % B3 `/ P" B+ {; t9 Z5 J8' `, r3 R% O; I% g- J; `9 r0 Z
    9- s# I- w7 o" [4 Z: X: A: F
    10
    ) z. |1 i1 I6 U/ ?) S+ f11/ A/ T& E% q. f/ w# M# I4 t! J  r
    12+ _7 L$ |4 S  Q! l1 Y) e
    13
    ' a: j$ x3 m# w14
    # O- I( {' g# u15
    & r6 Z7 f% V% o7 A! [7 E16
      |: l, q5 y7 l: X  o, n171 Y1 @1 x( C' Z/ z0 Y; S
    18! o$ _  ^5 a- F* K$ M- a7 E& r; R# y
    19
    8 G# l8 e. @+ U# l204 ]4 c7 |, W1 m( r4 o& n
    21
    ' L+ P" a2 f( k22
    , |: H$ y4 W7 }8 i( p5 j8 x- J7 W23
    $ d. o! m5 I# z+ {; E8 w24% Z& f, V' K. D' Q: S- D* U( `0 C
    25) l  V9 ]" x2 b$ A8 P/ E
    26+ o+ s, B/ u8 C. w1 T# O8 h# B
    输出结果见下图:! j3 e( K/ u/ G8 A4 X2 K! N

    ( I. Y1 u1 z) A( e" M* i————————————————& Y& H& @* A$ Z
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 ~- l7 v3 J) t- o6 T6 {' [  |
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    5 O2 H% g% }9 l# y" f; @" i5 J2 i, u9 i! P2 x' f. g

    - H7 R5 g% W9 B) m) ~/ d+ V% k. G
    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-21 13:45 , Processed in 0.352642 second(s), 51 queries .

    回顶部