QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5011|回复: 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算法篇- D: e; h: ]$ z  N

    1 R/ k1 T: P( R, L  U& i" D/ ~2 M在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    $ C' v4 O/ H2 f+ \
    ' n% R7 Q: n4 W# ~: A. l1.准备工作2 K5 k7 x  s( u
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    $ H/ [+ p* j0 b" b# ]  V" `: N* t# p9 M5 Q" p" c
    pip install mlxtend+ ]8 `& x, h1 o6 G$ L* B1 ]7 g+ H
    18 x* B" s/ k2 b5 i- O6 S7 e8 T
    为方便进行过程的演示,在此构建测试数据:
    ' d1 A) _* y% \, \4 s: I2 j* j! B7 Q- \5 C7 u' ?2 @! D
    import pandas as pd* m2 h7 r6 A9 F" U
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    / D& w7 p1 i0 F% A9 _1
    : V" J; N2 X: Q2
    ! t1 e7 n' R9 t3 M测试数据截图如下:3 Q2 p6 I1 w# b7 ~' O
    , P/ j+ E) d/ `

    2 k' Y$ _8 w$ i( p5 _3 P对上述的数据进行以下处理:) {/ g3 F! _8 ~; V( x; V0 ^  t
    : f& T6 N& x3 e  o5 D
    df_chg=df['product_list'].str.split("-")
    & f. |" d5 |. p. V( R13 y- r$ H0 D; l- B' m
    数据处理后,结果截图如下:
    . n" r$ d- m: x: O- B5 I5 `8 i& C4 N8 u/ f/ @0 Q$ Y3 _; d
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。1 D; W+ D% d5 ~- g+ o) q1 i0 l
    # w, }$ B: [- T0 g
    2.核心函数及代码
    2 I# R0 h# Q' {6 S7 X" Y8 i! z2.1 数据预处理
    . B) I8 ^, a0 s# A0 p+ \对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    3 c: k0 Z, N, R/ ^6 o+ S: D/ }9 k2 L3 a! d$ @( n
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)0 H3 _8 j2 [" ?; v1 q/ f3 e0 ?
    from mlxtend.preprocessing import TransactionEncoder
    6 c4 f) N6 j( ^+ }6 g- dte = TransactionEncoder()
    : R/ s5 _: i; h/ bdf_tf = te.fit_transform(df_chg)+ d- Z; d# C9 F# i
    #为方便进行查看,生成dataframe! ~- S* ~" w% G/ k/ Y  Q/ R
    data = pd.DataFrame(df_tf,columns=te.columns_)
    ( @' P! [' G% Z3 w/ w( x, ?1
    6 h! L& {1 ]" O4 Q3 Y; P4 i* a2+ n1 ]5 z7 n% x0 Z  Z6 Z9 m5 T
    3
    8 o1 k8 t4 K) O! j& m3 P; }$ P4 ^4# r# u" ]5 e. D* K/ a) X
    5. K# @# C+ k" ?% |# Z
    6
    : y  a" Q  e- x9 Q4 d6 U# f1 f! _运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    / W3 @5 R0 \1 z! f
    % D9 i, x! f$ }' A; N% `! G4 n4 o% V& @5 `7 P
    2.2 两个关键函数* B" D0 [# Z  @- `% j  @: o
    apriori函数* A9 L4 J. b( y. t3 h* T0 p" n
    语法:. ^1 k. ^( D. t

    1 s) c* q, e( _' g) `apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    , D% q7 z6 p+ e8 Y; b) U4 X1
    1 p% q* h! D) [; i0 i参数详解:
    ( _% a! M8 W; B* ^, T* G1 I
      y0 r) C6 w8 M( L& p* G" Zdf: pandas模块中的数据帧,DataFrame形式的数据;2 O. ?5 h* G/ T" V
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    8 ~$ p' g6 [# L: B% ~! juse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    / J* M7 K7 f" ~$ v/ kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    , v+ j( x  P% H& k5 \' A, X9 Qverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。. L- ], ]/ e- c# h9 I
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。. h! Q& y! h: T1 d  L( ^$ ^
    association_rules函数% B: F, d. C, f4 j, L% R
    语法:
    % h& d+ |: l) x3 x5 e, h  v
    0 E+ [* Q- X# kassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)0 F$ Y. a2 x- Q- V) s8 I# g' i0 A
    19 V# G8 v2 Y; V/ ]& o8 f
    参数如下:# \4 x/ h) Z' o) v/ N6 j/ x

    : O( s: e, `5 Pdf: pandas模块中的数据帧,DataFrame形式的数据;
    0 v( Z- h! U* T4 R: x9 \: C, ]; _metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    1 U. |# K1 s7 n! S: e# g$ Xmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。3 N- R2 ]2 T( O9 O' a, Q( o
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。# E3 G3 l5 l5 P7 p1 J2 A% f0 @
    附带metric几种参数的计算方法:2 H6 x' j& a, H' ^! z9 P9 h
    . q$ B- f  T* S- l7 K
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    / g: B- _7 B$ }% D& y5 H, }, r8 G& Z+ s. r- I5 O
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    + U. y9 J" p7 `  g  H) B1 x# [( B0 e) d; w6 R0 l
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    ( n& W- }& z# h7 h2 P' |$ }6 _; O% C* d- N0 O
    leverage(A->C) = support(A->C) - support(A)*support(C),/ i8 V" Z: r# `3 |* I1 N: j) T
    range: [-1, 1]
    / d' P! H2 _8 f# _
    $ R$ m& O9 x4 g' Z2 X/ L1 y" Uconviction = [1 - support(C)] / [1 - confidence(A->C)],  E! D) O- ^/ s/ }& y
    range: [0, inf]9 ?: o1 R4 x. S1 z5 T) B
    ( X! {( O4 M# D. P/ m
    3.实际应用案例& n. y& Z' `  c
    以下为完整的调用实例:4 D2 @* L( B+ R: l/ x7 l2 _

    ( K! T4 h+ M5 p* t+ dimport pandas as pd
    % S( }6 l9 Q  e4 ^; ufrom mlxtend.preprocessing import TransactionEncoder
    2 N( N5 m$ Y% b$ i% M" V& Z& \from mlxtend.frequent_patterns import apriori
    . u; y/ u& u! @* Cfrom mlxtend.frequent_patterns import association_rules; a# a. @9 i: z8 Z. R
    #1.构建测试数据4 c* O* S  f% b0 b1 [3 ~4 O
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ) V# l4 K0 O* c$ I; ]- D! Udf_chg=df['product_list'].str.split("-")( R7 R3 }2 B/ |2 o7 Q
    #2.数据预处理
    " G8 Y5 h2 @5 u; ^" R#将传入的数据转换为算法可接受的数据类型(布尔值)$ }: H* H8 p* r. y, V; b
    te = TransactionEncoder()5 F) L5 r5 W4 Q' j* c4 N# `3 |
    df_tf = te.fit_transform(df_chg); u* Y, J! o* e8 L) `1 [
    #为方便进行查看,生成dataframe$ i6 i* t3 p  J! S/ O  s7 {! r
    data = pd.DataFrame(df_tf,columns=te.columns_)
    ( }4 c$ H# L% ~7 m/ V8 g+ p* z#3.建模7 J6 o5 p" Q. u5 ?
    #利用 Apriori函数,设置最小支持度为0.2% k7 S) X  o" D' B
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    ( z+ @' ?! G  a4 I& A% T#设置关联规则,设置最小置信度为0.15
    8 L4 d1 [6 ]/ `# J4 V9 otemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    0 z5 I0 ]7 K. ~% [2 X6 R#4.剪枝并控制输出
    2 P5 Z( X! S* Y" e& T#设置最小提升度,并剔除对应的数据+ L0 p& _5 ~" K9 V2 I# Q7 V
    min_lift=15 G' V' d# p+ v. J) |
    rules = temp.drop(temp[temp['lift']<min_lift].index)8 R# N6 m8 d6 @/ F; E( j5 ]
    #筛选需要输出的列9 n+ @; h- X% `1 x4 m
    result = rules[['antecedents','consequents','support','confidence','lift']]
    2 Y6 @* R0 k; Y+ v9 h+ q( z9 Cresult=result.sort_values(['confidence','lift','support'],ascending=False)
    : E  D" b$ q' v/ M' p8 j0 f8 J  kresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')$ Q3 X) u8 j6 O$ s
    " O+ P7 S  A  ^) ?1 h1 s
    1
      [# ^2 L0 L- B' L9 a21 O0 N; V  L' e9 r  ?& \3 {
    3+ r9 L8 p# n$ I; A8 [
    4
    9 e& i  I; G; \4 B4 B  n* n6 r' z8 h5: h! H* @0 n9 B5 C& g; l
    6
    ! i2 U; K! _: k  a# M/ o# Q7
    9 Z9 l" R& z- z+ f2 ~5 Z8 k8
    * R( [% l4 p5 X9- D3 v: F, _% v$ m, F( j' N
    10
    & T9 a# {+ V) `0 G6 k+ h  U  l; l; Y% @11  `7 X# u+ V9 k* v6 W9 u
    12
    + i; V+ P8 ]3 d0 ]; ^13
    % R* ~; _4 S7 r$ g) g3 A* _14' R/ u9 Z* ^" F- {/ ^: r! u6 H
    15
    & d( L3 B$ z# T2 T( r- K16
    1 y7 ]7 S7 t0 D5 A/ y. C/ k17+ J8 R8 K% j; Y
    18) ?  Z+ o# H" t" H- d
    197 w$ s9 ~- P" {% g# b1 I, v
    201 s0 }+ E2 {0 N5 ^( Q, b4 v% y
    21
    2 y# x2 Y% x4 E. w22' z8 C6 \0 @! |: I5 m; n
    23  w' ^, v) }7 O8 e$ U
    24
    # f! Z) E& @- L4 f7 J3 K259 J2 B7 s0 y& p$ k
    264 ]6 M  }2 D2 y) p) e! w3 w
    输出结果见下图:
    # ^; E3 s9 b: Z5 z" j3 X/ D3 g: X, \1 d" y& Q3 h" I4 y
    ————————————————
    7 K! _0 V1 Q* S. B版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" K& T  a, N: H; q8 }, d- r% N3 A. N
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    : _" t$ B' c; m7 J( r4 g' a4 G' f- r7 ?( G( @/ N

    1 ^& {" \6 y+ g4 ~- 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, 2026-6-12 06:04 , Processed in 0.396591 second(s), 50 queries .

    回顶部