QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5076|回复: 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算法篇) m1 S# G" H* |# ?
    - c& U9 n6 u6 w) g. G
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。+ v/ M) I$ j5 @7 X

    8 W# g# q7 V: @1.准备工作
    ; H0 T5 K/ Q2 A' M如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    & I; e( p, r4 B1 G, [; V' R% d
    pip install mlxtend; h' ~8 y( ^6 C6 y" [  N
    1, j6 G# |8 a' \8 g& x2 Z+ v2 Y
    为方便进行过程的演示,在此构建测试数据:+ D# r; v) U. e! T0 c1 P  Q; {

    $ V& m0 X5 m3 iimport pandas as pd
    : U/ H. B: ~1 V5 Z/ a! J" t& Kdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    ) |8 {( |" j% z% Y. T( {+ K1; Y' x5 O1 i" W6 s8 K) x
    2% P* X% R8 P* d
    测试数据截图如下:4 c' |3 e4 k) w0 ?/ y) @( }- U
    / @2 F8 k& q/ Y1 y% I6 ?2 F3 x
    1 z, R( s1 k$ ^
    对上述的数据进行以下处理:# f1 o) n  W4 B! {, D- B9 k

    ' ]" ~! M6 v; s: kdf_chg=df['product_list'].str.split("-")
    " x. w+ J5 d. R* d$ D' H  \1
    * o% f( z9 G2 Q; e+ E/ L数据处理后,结果截图如下:
    ; d0 v2 B2 M3 [4 f" k- Z9 o- e$ s
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。# L" }2 o7 F: P% N
    0 V3 K$ ^# }- C. l8 w6 y6 Y
    2.核心函数及代码
    9 \5 `8 n1 ^, C1 P2.1 数据预处理4 E1 B! O- o' Z
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    . w& h& o) N- p) N. S0 G% s3 e* A/ W% m# `
    #1.将传入的数据转换为算法可接受的数据类型(布尔值): J& Q0 e* K. N& M
    from mlxtend.preprocessing import TransactionEncoder
    : n* K, {1 P, l6 rte = TransactionEncoder()
    $ l- D# ]' V7 w$ |7 s* zdf_tf = te.fit_transform(df_chg)
    9 h) L- ^$ z" Q, o, [- b& z#为方便进行查看,生成dataframe
    ) B+ l& }1 x0 x0 c4 ydata = pd.DataFrame(df_tf,columns=te.columns_)$ ^" w( `0 R8 A# \& U2 B# k: U: ?
    1# K& U9 h+ R3 W7 i5 D
    2
    : v+ @8 F- ^- W( h1 w8 J- C7 [3" [, Y6 Y8 d+ _% h
    4
    . D- C5 i# |/ a! w3 [52 l8 N0 b' C; \; v$ E0 [
    62 u3 r# `! y/ i! I
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    & R7 t- Y1 d" r% F2 C) l: a! L+ V! X. Z

    5 b4 d- B& O& X! w( T2.2 两个关键函数
    4 Q$ W0 R$ \; I6 I4 |3 J! P/ r$ g+ ]apriori函数& g  p' ~+ `% t2 U  `  G3 s
    语法:
    6 P' f2 u+ r1 N8 }0 S& d
    : _% [2 M( D0 M7 ]0 Sapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    7 }% X, v5 O& \; v  o1' S# J) T" ?* F  J. @3 H- Q2 d
    参数详解:
    7 H8 u$ @: a, L8 H/ b$ A  R1 x" i$ j
    df: pandas模块中的数据帧,DataFrame形式的数据;
    5 R( x5 S. f  b. _' i+ R- [6 r) e- Wmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。) Z7 y- G" O3 Y/ l* o6 G
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    : `; o3 X  Q) T* _$ K0 Dmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。# A) D) f  m# T  V# w
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。" ?: Y' a; d0 a7 o+ r
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。8 V/ U$ R) @& c7 o- w7 V
    association_rules函数$ N( K. A. Q. c3 Q/ T$ d
    语法:
    7 @9 ?7 a) w) D" Z& c3 `! `  [# Z6 A* [# D6 s
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    + G4 i2 x4 E- h% X: ?1
    $ {; f$ U9 u: t$ \3 y% `# o1 K6 q参数如下:, n+ _0 S. P" Y$ w0 J

    $ w2 D! \( E' Q" p' T2 L7 f$ vdf: pandas模块中的数据帧,DataFrame形式的数据;
    / O2 {7 }0 ^3 n8 O) i: C$ C8 [  c; Ymetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’, \; h7 y; [: `, F; u
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。2 b9 E9 [2 n. C" L
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    4 {7 J: j( y* W" ^4 z  `附带metric几种参数的计算方法:
    , h5 N1 l/ c: J8 o+ C
      q4 _4 F$ y, t0 G+ J1 n* `support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    1 ^, W9 q4 ^3 _; L: k& n1 s* n" n3 ]: F+ H
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]4 L. Z9 `* A& w; S' d
    0 {4 d+ h- v/ s6 F9 t; g. U
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf], j( k! j! I0 R- M1 Q; x' m
    8 B8 \4 n' l0 c- l! h, G: |8 G
    leverage(A->C) = support(A->C) - support(A)*support(C),1 G9 F6 P; {' h/ c/ G
    range: [-1, 1]6 p8 ?9 H2 u6 O# ?

    % d+ }4 D, l; \0 N# sconviction = [1 - support(C)] / [1 - confidence(A->C)],: Z9 `* K* Q5 x
    range: [0, inf]
    " v; T0 X- d. Q' A% t9 z; G4 G( o/ _2 P- G
    3.实际应用案例0 e& U1 B7 D- c  v
    以下为完整的调用实例:& }; h/ W# x, Y

    & X- S1 C$ U# m  y; q) _import pandas as pd' M8 g1 }" w2 p) [. l8 J: L. ?1 O
    from mlxtend.preprocessing import TransactionEncoder
    0 D& n' j, y2 l% e4 m. \7 e8 ^# _, Ifrom mlxtend.frequent_patterns import apriori, B) V* x4 ~* l, y' E  s1 C( M
    from mlxtend.frequent_patterns import association_rules+ u' s' H. X2 l( ]* u
    #1.构建测试数据
    + c- |3 e) o  [. a& j" bdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    , u3 b' {! \0 C" C- P" \; A7 ]df_chg=df['product_list'].str.split("-")2 r+ q9 ^0 t) W/ y. j6 G$ j
    #2.数据预处理' b% R8 g4 c3 s3 [8 F5 p
    #将传入的数据转换为算法可接受的数据类型(布尔值)# X9 p6 f+ ^- N$ V9 D  g
    te = TransactionEncoder()
    * s- w+ u8 N$ u0 _' `0 S* ndf_tf = te.fit_transform(df_chg)
    ! n3 ~; i7 {# S! E5 @#为方便进行查看,生成dataframe
    # h+ e* Y5 x7 D' L( N+ y/ Ddata = pd.DataFrame(df_tf,columns=te.columns_)
    ) f% p% Q; o% H5 ~  k. m1 t#3.建模0 I$ ]/ @- x& Q4 F4 N
    #利用 Apriori函数,设置最小支持度为0.2
    9 m* b2 y" l) b6 f) W& b* w: {+ pfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    - D/ ^: J1 t, Q- T+ d& ^( Z5 F#设置关联规则,设置最小置信度为0.154 w5 k  A4 r+ h$ U+ E
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    ) A8 L& c3 \, `4 y, x#4.剪枝并控制输出' F! g/ A9 S& v$ c2 q
    #设置最小提升度,并剔除对应的数据
    & ~/ o- C7 f4 d* {min_lift=1
    7 c$ y& m$ @+ prules = temp.drop(temp[temp['lift']<min_lift].index)
    , v0 U) b. |( ^2 B% B0 @/ E#筛选需要输出的列, Z2 L4 `& y: z2 t
    result = rules[['antecedents','consequents','support','confidence','lift']]
    # W7 n/ x& n" ~3 |result=result.sort_values(['confidence','lift','support'],ascending=False)
    ; F% }$ ?; Z! t1 nresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig'). m$ [4 z: H; T

    - N. J+ `6 i) Y- `2 l16 f0 [# B# m5 Y" |
    2
    4 [( {" e( K0 k' ]1 [! G3' F0 Z; A+ C; \! F* R
    4
    ( s( H+ D7 O' J! E8 d$ l5/ Y) s0 C# ~. n
    6
    ) O; D4 s4 ~( ~  u6 k7
    + `) b  I: p" P  L: z! q86 v4 ^+ m* s1 h
    9
    ; T5 I5 z9 J: U* W% R10
    7 {( H, {7 ?$ g9 g  G$ |% v- m11
    9 @! e4 Y; {  h( s0 i9 R6 m5 ~1 ~125 Q9 C0 q, u) I( k: G
    13  ^5 e% ~7 ], x- Q
    147 F. H3 S4 K) N
    15, j# `+ G" e4 x' s% _2 g+ |
    16) P# h- t, t( l% y9 p7 [- l3 s$ w
    17
    2 I8 I1 N% r" B9 h/ W0 q18" Z; J7 t7 ?5 _' [2 Z0 u4 n# B$ s
    19
    $ n9 l- s# f+ a4 {, V; {  b20
    % V  L4 j/ {8 ?, F2 Y+ A0 O& L8 I21
    ' g0 Z8 A2 Q, o3 d22
    & \3 w/ n+ m8 L4 O% i23
    9 n& ^" t9 Q& [$ P5 I) K0 ?24' j1 }' B6 D2 A6 d3 b
    25
    ! w- R+ p9 A, f" ^0 h26
    3 U7 I  R' F" ]输出结果见下图:
    0 V$ f( y  P. l+ X7 F# ^' v' @
    , I. u% m6 s0 @9 X————————————————: |( i& N* R7 G+ K+ ?, n2 T
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    % l4 o6 }' W* r; X# u原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    + F/ A& C3 [+ K- L# A2 I& E( U' x( H- ?- |4 d% w6 w
    " H) {5 s& e4 K- \6 q
    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-8-24 04:27 , Processed in 0.868261 second(s), 51 queries .

    回顶部