QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5043|回复: 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算法篇* ~# h9 t1 d% G

    ' Y, Z- X' k. E# t8 Z8 g在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    8 r& V$ c+ d! g5 C3 N& n
    3 z/ E" m" B- K1.准备工作
      D8 l$ e" T) |) I$ m' R如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    6 i/ ~* @* {! J& n% U# B: a- `
    4 {8 q8 i6 A* ~3 L" Q8 h3 ~/ ipip install mlxtend
    : O) C: r! P# O9 N/ I' Q10 o9 ]5 Z" V2 Q7 }. {, b7 V
    为方便进行过程的演示,在此构建测试数据:; v% ?) ]) {4 T2 B+ i: a
    9 G7 T: M% t9 K, k
    import pandas as pd
    # P  O& F7 V9 V* ^5 Zdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    . C8 s0 z& H8 l' O4 t! f1
    * I; [0 X0 c7 C2. |: Z/ C( a6 a! [1 G
    测试数据截图如下:
    & J* H" V+ w) `8 k, j7 M+ E; x# {1 o$ F7 p5 x+ v, P

    + L$ p. N! {* H0 [对上述的数据进行以下处理:
    1 c/ |/ l% S- J' ?# n& R& a' V' p. f$ _3 Q  ]) O. x
    df_chg=df['product_list'].str.split("-")
    8 j6 ], H" g, o' Q1 P. d* x9 J1, b7 M( F4 K0 ?
    数据处理后,结果截图如下:
    + E6 w- b4 Q: Q* T$ w  m+ f# \
    4 e: i% _" d8 V4 r# c截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    2 a5 ~2 w6 b6 A: n. Q8 {) {& b6 B4 @: b/ p. p: Y# L
    2.核心函数及代码/ n8 t7 X9 t2 M' z
    2.1 数据预处理
    0 j) U2 [( @6 P对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    0 f  T. V. v! u) j" u9 x0 r$ K4 Y& i: |) Y2 k# }
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)
    2 b: ~$ i: _' ?. Sfrom mlxtend.preprocessing import TransactionEncoder
    $ x% I, V% K* ?5 T$ W* l/ yte = TransactionEncoder()  Y/ e3 ^9 C6 v" Q9 v
    df_tf = te.fit_transform(df_chg)
    - L, G) X& P: ]: ~, V#为方便进行查看,生成dataframe1 q+ u' `! |- ^3 c
    data = pd.DataFrame(df_tf,columns=te.columns_)
    1 C5 d& ^: s* b7 ~3 L! k7 h1
    # T2 j3 `& H/ Y7 O* \2
    5 s' b" p! ^8 U+ X7 ?; A9 W7 n# z3+ a" E( p  }6 Y  {
    4
    ; h4 D0 B! T; p* j3 ?5
    ( e4 d5 c" A* A/ J1 ?8 V$ E0 M66 ~5 M$ {" y( W
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
      \/ N& l) W/ H+ T( G* p/ B  W/ q1 f* m! L, W( I

    4 @& m5 l. y% P  z; O2.2 两个关键函数
    : j. W1 a. j, `  D4 n7 n6 _5 Kapriori函数0 a' K) ?# U$ B! a/ ~5 V
    语法:. [0 L! |6 ~+ W. V

    9 @2 ~1 b  a" ]% D$ J- Uapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)( |/ ?% z6 d8 E3 ]4 S
    1. Q; s/ |8 H9 [8 ]8 m5 K% I9 `
    参数详解:* i. ?; n0 }4 c, y/ O

      V: F1 b, f3 d3 H: ]3 O9 Z" t* z' Bdf: pandas模块中的数据帧,DataFrame形式的数据;9 i$ {0 K5 n: R, V' C
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。* C3 e4 _0 L% u' Y% {
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。' X" t; d1 x; D, ^8 _, w$ D
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    3 K- P1 Q! B, l% d; G" R; Uverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。7 F) T: M- }! s1 I& H
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。% y6 E6 v5 c1 ]' r; Y; l. ]
    association_rules函数% n- ]2 A; b" P8 `0 W7 \
    语法:
    / I7 v4 T! T: G' G7 u
      N- V0 H2 q) w; {3 [4 J0 l. rassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)% g# l8 a  p3 L8 s# T  u
    1
    . R, A- M( ~8 ^3 x参数如下:6 H4 L* ~7 ?9 Z$ S

    ) t$ x- j: L+ Qdf: pandas模块中的数据帧,DataFrame形式的数据;8 t# H3 E- w: e% Y9 x6 W
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
      y3 S3 ~3 L- }6 R6 ?+ umin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。7 A! ^4 D, `6 _- {6 u- J  F
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。. w3 e! i$ U  R! y) M
    附带metric几种参数的计算方法:! N; l8 ^) F" O. }
    ) f9 }. d! b0 }/ |1 p
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
      F6 ?4 Y" ^# |, f7 L* x& k. F# M5 ?& K2 `7 W+ r
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]: @) O! g( x0 ]( L

    8 x% T1 P4 z) V+ Y  {1 k, alift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    - |; n) o- k0 O3 o, X0 U! R0 p8 Q* V
    leverage(A->C) = support(A->C) - support(A)*support(C),7 X3 _0 V1 ~9 o1 j" d
    range: [-1, 1]; A; }1 e- J, A1 m9 y

    ! Y" J% k# f# o5 D* O$ ]  D+ Econviction = [1 - support(C)] / [1 - confidence(A->C)],
    % ]# D( ^. z3 l' {% t* rrange: [0, inf]6 _4 f' g0 P8 ]9 W
    - J' p* \6 T) d; m
    3.实际应用案例
    2 d) Y/ @- G2 ~4 f$ c+ j" ]以下为完整的调用实例:
    ; d' y: Z; X3 }6 y5 }" w
    6 ^( u' x& q( M7 ]+ R$ eimport pandas as pd
    ' L0 U) R/ ~6 t2 B& n+ V; V$ ~from mlxtend.preprocessing import TransactionEncoder
    + v, x1 H3 Y! E4 m  ~1 i1 E# l! }: Pfrom mlxtend.frequent_patterns import apriori
    * I' B% h& f& A3 ?( d2 n: efrom mlxtend.frequent_patterns import association_rules
    - V2 v7 n0 x: E# o#1.构建测试数据" P5 y# B- [8 P9 P
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})8 C+ |9 T9 \, W6 s
    df_chg=df['product_list'].str.split("-")
    0 j8 Y$ C: P- j# @#2.数据预处理1 i  |; H1 |( q; [% k
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    # y* Z; B+ \5 s0 h( {4 J. C1 o$ pte = TransactionEncoder()
    . B4 a: D+ V# l" Jdf_tf = te.fit_transform(df_chg); I1 A& j: p/ |" H" O
    #为方便进行查看,生成dataframe5 |2 d4 y) E  K7 T
    data = pd.DataFrame(df_tf,columns=te.columns_)# b2 E( Q) N- a! O
    #3.建模7 k0 V! \$ Z) j& R. z$ M  J
    #利用 Apriori函数,设置最小支持度为0.2
    . b9 G: ]! J' G; H/ T+ vfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True). P4 C: k8 @9 z. o: k5 b
    #设置关联规则,设置最小置信度为0.15
    1 j4 M  S% [$ Y2 Wtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    / {/ j! {7 Z8 \5 h; ^#4.剪枝并控制输出
    8 ~- C9 ], b7 j% l3 j1 f7 }& p#设置最小提升度,并剔除对应的数据& a1 Q; Q1 B" D9 q
    min_lift=1
    7 P* g, b9 G# lrules = temp.drop(temp[temp['lift']<min_lift].index)! J2 X  g( V5 z
    #筛选需要输出的列9 c2 ^# U# c# B  d; @$ N/ r6 ~% @
    result = rules[['antecedents','consequents','support','confidence','lift']]' u6 e7 ~# d, s# Z
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    ! @9 M3 Y: m7 tresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig'); I% o5 |0 Y( I% ]" O6 y

    ) m3 ?. \( {1 U& O% P1 B1
    5 d# \# T# V# X# s9 Y2
    % I; r. ~9 e$ |" n3) w8 D  Q" z+ ~/ n, p6 E4 t
    40 z4 I- {6 S/ N
    5
    ! x& g$ D  @0 ^/ m% H6& `8 D! u( |0 G7 u
    7
    $ x" x( p" Z0 r' n6 R8! X& P8 |4 F/ N$ O4 D, e
    92 B" \) L% ~, V: j
    10, F2 Q$ [, ^0 f
    112 C$ F& W0 g1 ?/ C$ U; D" ~0 V
    12
    3 f, u- t& S" A13! e# q% G5 v+ N% r5 k3 m2 H, q3 \- o* a
    14
    6 x5 I+ M% P3 B! ]: P% H157 q/ A, A2 T; ?0 m: {1 X
    16
    9 g5 a2 B* l2 I- @7 f. W5 f170 F6 n" ~/ x2 H3 b& E& _
    18' I0 l( _- \( \/ q7 E* [5 S
    19
    $ v( P( C+ F* F9 I( x: K20) {5 }4 b% Z4 L, B+ v
    21' ^5 t7 d- |' n7 \7 Y6 \
    22
    0 A! X, F( ?) n' g  m23
    $ r9 u: U* A2 M24
      J7 q$ F' J2 d# u5 X+ o25( v# L- C5 I0 \' t7 J, X+ n
    267 z0 ]# v/ e1 K* M0 z5 b% A- d6 U8 u! {) j
    输出结果见下图:4 m5 ]9 s2 K% ?8 z. A
    & b! H( L+ e9 }7 d5 Y/ h
    ————————————————
    8 c+ N3 r4 _) m/ U( t版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。! U: ]! H8 n# I/ ~0 k; `% R
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    / S: M# M# t5 [9 v: i# p
    % s/ O; N5 f8 `) W: t. s  U9 `' g$ W* t( A, x% 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-7-10 06:03 , Processed in 0.404661 second(s), 51 queries .

    回顶部