QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4364|回复: 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算法篇4 p* T& F% v! v$ h" g( W
    ; l& u. S2 X; L$ W- @* c, S
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    ! n+ x7 M; y; H
    - W/ R; u+ `( c; x$ b1.准备工作
      b4 u3 c5 X& ~0 }# r. @7 t如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:4 C% i  N( K# S  m; s- j; ?2 Q

    : ]2 p3 H! L! i  c- Y/ {. npip install mlxtend) r1 _; f2 V% j0 F
    1- _' I- m5 v$ G( q$ t+ h
    为方便进行过程的演示,在此构建测试数据:
    9 _1 w( X- t' P5 w6 U7 X4 h3 {9 w$ O
    import pandas as pd1 P* x+ v4 K: c. {0 U6 d; C
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})# y8 g. t7 p+ u2 k
    1
    + A- S$ l" c, c/ @; G6 q# {' ?8 }2
    ; h! ]* p; C4 u- r测试数据截图如下:
    & ~$ l. g/ ]4 j6 ?# K4 r1 v5 d/ @0 }  c- w
      t9 R$ W, `& d5 J6 @; E" y
    对上述的数据进行以下处理:' ?- t! T1 |2 _6 j/ h0 t. C

    0 }; q8 p* |8 ~2 h; {7 Ldf_chg=df['product_list'].str.split("-")" X( r: e5 ?* g/ M% o* {
    1" O. H+ R8 o5 {9 K" I
    数据处理后,结果截图如下:0 S8 T7 F' }7 F8 T
    + P0 m% R0 E1 u
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。1 F3 e% k/ h. e% w+ d

    ) Q0 X4 K. F$ n2.核心函数及代码: k- c0 f% A' b' g; H. m" H/ s7 K
    2.1 数据预处理3 s9 x5 }& N: G: F
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:' H1 j4 H1 Z2 B4 H7 F3 }9 F

    8 O' k' N1 E4 `0 w#1.将传入的数据转换为算法可接受的数据类型(布尔值)! G% ~7 I. q% a. _1 g* R$ \$ q4 u
    from mlxtend.preprocessing import TransactionEncoder. y8 L  l. i6 `; ]) \1 c. g" i
    te = TransactionEncoder()
    3 I  X( q& B" D" F; Z- |' |9 {* bdf_tf = te.fit_transform(df_chg)- \( v8 j% H5 c
    #为方便进行查看,生成dataframe5 a5 ^3 z, V1 a
    data = pd.DataFrame(df_tf,columns=te.columns_)
    6 n5 D# y& N. y( [1" J( B) i9 |/ J3 I7 L
    2; ?$ Q) c- d: a% o& \! p: e: }4 |
    3
    & W% ?) y. `, l! f( k# N2 Q. _46 X* H) V5 q5 x# G
    57 z$ u* ?8 Q6 \% d
    62 [: r- @" v8 g, N/ X
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:1 s: d4 T3 k( L" e! d; F3 U

    . o& e, [; w8 ^( E% q# N, V2 J- c+ q
    . }, k* \8 K1 y2 l2.2 两个关键函数; |7 }' i8 d6 t. e% [% B  ~
    apriori函数# a0 j9 C4 v2 B1 ~1 v5 \! e0 j
    语法:  l0 g( {3 b8 @/ l& C
    $ t7 V- S: l0 N3 {1 {& b
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)! h2 ]7 h4 x. g
    10 ^% [( H. J. J% M
    参数详解:
    # C& e) t+ K9 o' n- U& E+ ^; p! N* G9 m) f& r/ H( d, r! d
    df: pandas模块中的数据帧,DataFrame形式的数据;, j1 n. g8 s# n' H% m
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。* h" Q  y. M8 Y& `! [2 G: {
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    7 |9 \! @: Y. W; V6 kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    * H* ~; v# h' X5 u1 C5 j- H# S- Kverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    4 g( `  ]  g0 r* n% |9 {low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。& m4 }) C: X2 t3 D' S9 A6 ]
    association_rules函数/ n4 W' U+ Z+ x1 Q
    语法:0 H! y' M4 ^7 L5 w# n% z, q# ^' q+ }
    + q$ o( n7 G( r. K
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)4 i2 w$ @0 [) ~& v
    1
    ' |' D( v; ]/ c; E! c8 |% q参数如下:
    0 Z$ z' i* Q1 `, O/ L2 r6 i, d
    % J& T+ M$ v# ]9 }9 T/ [df: pandas模块中的数据帧,DataFrame形式的数据;
    4 t# i1 R% o+ Z  mmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 c5 ^* k3 ]2 Y7 O# s( h+ i7 [
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    ( O4 Y  E  k6 T' a3 f; ysupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    . @  z9 X0 `' e; `附带metric几种参数的计算方法:- p$ Z' S' w! E4 a6 s
    9 u" c) G# B, C9 |0 B9 o- W% x6 L
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]  p& T  z; v0 j$ l: O1 \. Q

    : b& n1 {5 Z6 x3 y* Mconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]3 [, @& |" N5 Q1 s9 W( A8 S

    + Z: ?0 F' O; T/ s5 Rlift(A->C) = confidence(A->C) / support(C), range: [0, inf]% U! E: G8 r5 L' K7 v) J
    . N! {! \+ P6 {- B5 b- j, n) D9 _
    leverage(A->C) = support(A->C) - support(A)*support(C),( e% E. D& }6 U) Y% ?
    range: [-1, 1]
    # ~( @  L' N& ^0 G2 [7 O+ _+ M: `' `4 G' C5 ^) M! x& {
    conviction = [1 - support(C)] / [1 - confidence(A->C)],' k, V0 T+ b) n. [1 N+ F; b# h
    range: [0, inf]
    5 m$ g& ~# s9 q) E5 `: Z$ x7 U
    , n4 A6 f) z8 f; e( c1 h2 |3.实际应用案例
    % i- R7 h+ Z  a. ~$ `以下为完整的调用实例:# J2 a1 z, ?* e9 X1 G

    ; p( j# o' v3 b: a: himport pandas as pd/ m% R" Y2 t9 _' S$ X+ w
    from mlxtend.preprocessing import TransactionEncoder
    ) p, Z7 e/ y6 Ifrom mlxtend.frequent_patterns import apriori
    * s, A6 d8 v& ~( `4 yfrom mlxtend.frequent_patterns import association_rules  ^1 l6 B: H9 W4 u* h- p1 `
    #1.构建测试数据
    ) t2 q# o5 {5 F1 ?" d1 l1 Edf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})# X' B: s* X# k
    df_chg=df['product_list'].str.split("-")
    5 Z2 E# z# ]5 G8 _! W, J#2.数据预处理* y/ b, F7 u! o
    #将传入的数据转换为算法可接受的数据类型(布尔值)' f9 w' c2 |. x2 z0 o% i
    te = TransactionEncoder()
    : y1 z4 w1 R$ u: edf_tf = te.fit_transform(df_chg)1 B3 V/ |3 y& g7 t; j5 D' L+ B
    #为方便进行查看,生成dataframe
    & N( S2 F2 \5 P9 ?8 U8 |0 E  Qdata = pd.DataFrame(df_tf,columns=te.columns_)
    # i, R% t! a) o- e#3.建模! i0 L/ g* X0 i/ M+ H; e2 j# g
    #利用 Apriori函数,设置最小支持度为0.27 s8 s* ?9 K- P, }- D( {) D
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)1 t# J( P$ Z6 ~/ |" [; X
    #设置关联规则,设置最小置信度为0.15; f8 [2 o$ n' H: x+ Z+ O
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)7 G) k! {& O7 b, Q4 e
    #4.剪枝并控制输出; `1 C5 p* D8 x8 B2 ?9 y& F( d
    #设置最小提升度,并剔除对应的数据
    ! h& A4 E; b2 s, hmin_lift=1
    " x. v3 t9 r) e: M/ v4 Arules = temp.drop(temp[temp['lift']<min_lift].index)  y' N+ c3 [" l5 d6 l7 @5 |
    #筛选需要输出的列0 v, m, s9 m% I3 Y( J
    result = rules[['antecedents','consequents','support','confidence','lift']]
    : B5 v$ o( T# Aresult=result.sort_values(['confidence','lift','support'],ascending=False)
    + `; N& w1 v! o- [- p" uresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')2 H2 R& i! n4 f& }3 ]" _

    ' l- t& V5 w# U+ C1% i! H! a+ W5 y( @* ~
    2
    , \) }9 W2 G, g# Y3
    ; p0 s, J0 a+ E8 a1 _49 O0 n4 q" u# A) O
    5
    - N1 W) {  p$ F) @3 ]8 x" d5 S6
    4 G1 T( f7 t$ M: E+ z( V7! d" y0 f, O7 G: E# i+ y
    8
    ( W. Z1 T) T& j2 p+ w9 t$ J% K9
    2 p; m7 ]# ~3 y$ K: C7 x10
    0 c+ C& S# @  x$ V" X11
    ! `# P, v# u2 U' d12
    5 S; [1 p+ H0 Z% B  P132 v6 U: e. f, v2 X$ ?
    14, j& ]2 `/ o0 O- y
    15
    + n" A0 }2 Y$ C8 r5 o3 a5 h8 a16
    . I( y$ x5 x4 y; [! @) J: Z17
    ! G2 P5 c$ T- X" x181 K- X" E# x; K# V
    197 H# Y" j# d" ]# w
    20
      m  D1 G- p: \  Q2 s' g218 U7 s8 L' v1 `$ u1 k# P8 s/ U, Y
    22
    ( {* D3 b5 p/ k& J+ d4 e; c1 {- ^23; k3 l( c% X5 O0 I4 x
    24
    / \1 c9 x+ E$ [7 S0 o* n8 Y$ e25
    2 d- M  ?8 \# L6 C+ R' P/ x26
    4 C+ E3 p+ R4 c+ u( S( D输出结果见下图:( ?2 l) f. B2 R5 v" m8 {
    $ M' O4 n+ S/ I7 [
    ————————————————1 P* i4 h" y& K0 k" @9 [
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    / G! O5 C- u: j! f# Y  J' A9 b* s原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759/ J& S- S6 W* i- ?+ f$ H8 p& U

    ! `+ g" c& E/ A2 V) n( J0 H$ X9 G' s7 j
    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, 2025-9-28 20:11 , Processed in 0.335712 second(s), 51 queries .

    回顶部