QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5049|回复: 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算法篇! S) B1 w1 |$ {5 [# R7 r( k

    & j! }3 |/ y+ v7 P在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。4 q6 R1 @2 X( N( g! }1 U  W

    4 T0 c) R" f, e, l: O6 ~1.准备工作
    4 B9 I+ n+ ~$ @( K2 h/ o7 D2 H如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    2 A3 e5 Z& p; C
    / ]  N! C& B. K. V9 N) ppip install mlxtend  K7 y. z: F3 T3 C' h1 x9 A* d' Y
    1
      E$ E, Z& }9 ^  A为方便进行过程的演示,在此构建测试数据:
    0 {% E9 N7 [! o  J- i
    9 q  i2 \. O( W7 R5 \import pandas as pd$ u/ u2 \: \" _, O$ B5 t* y; C
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}); j7 p; T1 D$ }( H( r5 h
    1- C( i8 g# ~9 I: ^  l
    2( D2 }7 x, v; I7 i( ]* c) r3 V
    测试数据截图如下:
    ) `. V* g7 q* _- |2 ]+ d5 O4 {! [% n6 W5 X4 h+ D

    ) J) |- P8 K( D4 Z: M对上述的数据进行以下处理:* c7 L. }2 h3 o0 Z, X# H3 W9 u
    / B  P- E* W% R
    df_chg=df['product_list'].str.split("-")" B4 m% `, v9 X+ W- ]  Y
    1
    9 V$ G, B+ @  j6 ?" J# ~, F数据处理后,结果截图如下:/ H( l* ]+ a. ]+ u9 i/ A
    ( X% W2 q' f' ^- \: J
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    4 O& b- n. u1 E" `1 B8 `" C& C; A4 [( T
    2.核心函数及代码
    & V! ?  R* V. Z& Z7 b1 y  m8 J4 Q/ m2.1 数据预处理
    3 N+ F* M/ B3 i2 p对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:! p/ Q3 T) `* x

    # c! i. i; u0 p3 p. W& ~#1.将传入的数据转换为算法可接受的数据类型(布尔值)# q/ F; ^7 h1 r. O! W
    from mlxtend.preprocessing import TransactionEncoder
    ) P- k: v$ r6 c3 b& `te = TransactionEncoder()
    # Y2 U- N7 w2 o6 s/ a( udf_tf = te.fit_transform(df_chg)
    ! `% P8 a' ]2 V: g#为方便进行查看,生成dataframe
    - O$ ]; a9 p) G( q  tdata = pd.DataFrame(df_tf,columns=te.columns_). {. o; r: G+ l
    1/ n# R0 y5 [! O5 G, F
    25 B; l  g& I7 Q, }9 o$ Y
    3  A& z6 N, w. [) v3 h' {
    47 e% H# L5 I: Q! a
    5
    2 `& F' [' [" Y  ]/ `* r7 y6
    7 d: z1 q/ K. X2 b运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    % R3 O$ t  u1 A# k
    4 S: @7 ]) n5 @* \2 T: {, @; Q4 k' Q7 g! k2 p* t* Q
    2.2 两个关键函数
    8 g; C1 Y/ e; m5 a  h7 f4 f& K8 uapriori函数
      j) Q7 W) f4 i0 n9 s* M! T语法:
    6 m' Y& O' U" F6 M* n+ f+ B1 o8 Y  D) C; [
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
      t* g$ i& K3 |( X/ B4 l2 f" I. _1
    / m1 _/ E% T8 D0 m参数详解:
    , Y: t$ e4 a$ u! ^3 ~
    ! M+ n% g- p$ ^9 R( _df: pandas模块中的数据帧,DataFrame形式的数据;5 X0 K" b, P3 }6 ?, f
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。+ F) t4 K* ~* A. D2 Q  ]1 Y* G
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。, C% h: O6 F% J7 n
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    ' O" g1 V4 S4 j# l- {8 E1 c' Sverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。2 `4 \! r7 w. e, r& z+ U$ I
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。8 z- j  l7 v3 @$ U) m# P( n
    association_rules函数
    " c- h8 Z- |/ V6 z语法:7 {( N! P+ W7 j5 p6 v
    ) T$ g' X3 O3 c
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)' O+ c( `' W2 ^
    1
    3 H* ?& j. U5 ^/ F5 y/ z参数如下:3 O) L8 W( X' {) [" a, H
      ^2 d: l' v# _0 i' D# F, b
    df: pandas模块中的数据帧,DataFrame形式的数据;1 r+ z( c8 K# u# n  B7 N
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’/ C. I- U6 [+ f$ _; M
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。  D4 d; M4 h; d/ m* s5 W" [) Y
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。' _5 g  W7 e' g0 J
    附带metric几种参数的计算方法:
    8 W1 D$ u  E3 t# y8 `8 [+ b( j; B# H( v- u! i) I' g: K
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    1 }" ]) N1 K; t. j' `
    ! W5 Y- l* Q8 R2 ^- R8 k5 Aconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    ! S; m' o5 M. A- Y6 V* f
    5 p; D, W( V" K0 v1 Slift(A->C) = confidence(A->C) / support(C), range: [0, inf]' A1 {/ R' k3 r% \
    1 @2 j9 [5 y- {/ ?; |& y
    leverage(A->C) = support(A->C) - support(A)*support(C),# i9 G  \: ?& Z) `- o5 i  \
    range: [-1, 1]
    " H. ?5 a, }; v1 }8 ]$ ^" p$ `
    1 m& A$ T+ Q  U) C) s0 k$ V8 Yconviction = [1 - support(C)] / [1 - confidence(A->C)],  c, Y0 `+ u2 `# S" s; g
    range: [0, inf]
    6 j7 y3 ~4 k0 H* ^. a" v* r  O, o& u# o9 ?7 j
    3.实际应用案例/ Z5 y4 P) C$ N; f4 n
    以下为完整的调用实例:& \% M- |" W1 v

    $ J* v7 G+ J  \! h% x! ^1 ]7 Ximport pandas as pd8 F( E' t5 a: o2 D. W' q( s
    from mlxtend.preprocessing import TransactionEncoder) ]' i! \" M) Z- t. N8 a
    from mlxtend.frequent_patterns import apriori3 Z" ~% p. v7 U  n' _
    from mlxtend.frequent_patterns import association_rules, ?/ i  r! J0 G! M" _* R
    #1.构建测试数据1 d7 n* X) i/ d
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    , K0 q2 K- s! Rdf_chg=df['product_list'].str.split("-")7 H2 |# i7 {3 i
    #2.数据预处理& K: e" D* l/ S( Y/ @
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    3 C, p$ ?9 L5 ], [2 e5 `9 ete = TransactionEncoder()
    , y7 \8 V+ h( S# xdf_tf = te.fit_transform(df_chg)5 I( E% O" Y# M% z
    #为方便进行查看,生成dataframe$ M$ q) O( ^( K2 s+ p. y7 R8 n2 G- E
    data = pd.DataFrame(df_tf,columns=te.columns_)
    6 ?/ F) s, o' z+ n: V#3.建模6 {# [: Z) N9 G8 Y; J! w7 w
    #利用 Apriori函数,设置最小支持度为0.2- ?# r! V) O: J  J* |1 d
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)% @0 w* M# u* p) }- \
    #设置关联规则,设置最小置信度为0.15
    % W0 X+ L1 w8 ~7 O# ]temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)% f4 Y! q: P, }* w
    #4.剪枝并控制输出5 d& K: O3 G. k$ E
    #设置最小提升度,并剔除对应的数据
      g0 ?9 P1 R' u/ E! X! Dmin_lift=1
    # @. s/ o4 {9 A/ hrules = temp.drop(temp[temp['lift']<min_lift].index)
    ( H+ V2 ]" k1 K3 B* f/ I' ]#筛选需要输出的列
    & W  m& R$ p! ?% I" }4 |( E1 |result = rules[['antecedents','consequents','support','confidence','lift']]+ V: V7 q) t, j. W
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    2 x. q) T. g) `! I  ~result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    9 r* G/ Y  @& |  j  a- H
    ( S& A8 x( }! M% o8 Z2 x1
    / s/ N0 x6 d1 J4 c4 ]/ f. G, {8 V. d2
    + n9 J4 C2 S  b. ^1 j3
    ! Q! d; H# {; v) `4
    ; c1 M9 {) u* c. `0 Y5
    # `. d4 _. l5 B" u- l6  _- o( g7 N8 C5 n! B# v3 [4 S
    7. |  {) q; ~+ C7 f+ d, G6 u% G! u
    8# c8 A; T! T2 Z6 n5 q& T
    9
    - M- p* ^( h1 p! h" Y8 _10
    ! x$ ]- }0 f/ z1 N* ^11: Y1 H- k* k) }1 U: y% \
    12
    * A2 V1 P9 n) _13. a! Y. L5 e" c4 Z& p
    14
    , ]# P+ Y) J8 U' r) X" m8 |; `' g+ b8 `15% I( z$ @  ^: {3 L7 s, g
    16' g" ~! Z" Q; K7 G: q5 M6 \1 R1 k
    17" D: h9 C# k* b' u- f% W" T3 ^
    18  A' q2 Q& Y: {5 M0 C
    19
    8 l0 n* N, q4 S! z7 _5 E# y20
    ! L' [7 `3 Q% J* X21
    # m: ^* ^( w0 `' v. L5 a$ z7 \22, A2 \. F/ ?) _4 t& S' b
    23
    ; q. y2 P. v3 d24
    $ ?4 W; u& D" a; h6 L/ a* K- A257 K* A# P8 u& M2 F4 }, x
    26& d5 t+ H3 h$ J' Q# w( K/ z
    输出结果见下图:* I  K. m7 X. `: x$ B8 H$ }

    - q9 T* A% a+ b) W/ y————————————————
    6 E3 s; ^* A* I+ B# G. H8 F版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# W/ H& }* W2 ~0 |! K1 G, |
    原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207592 \0 q/ u0 k- ]
    + a0 ?! x3 R4 I1 A

    4 R0 s2 E3 P) {* |* ]3 g. o  e+ u7 h
    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-28 12:46 , Processed in 0.814192 second(s), 51 queries .

    回顶部