QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3926|回复: 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算法篇
    5 ~2 c8 n2 b4 A' G4 q! m! U1 d. J" ~0 @1 _* l3 f
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    ) \4 A3 p" ?" R0 X$ `& t
    ( K3 N7 X* }6 N1.准备工作; ]0 k5 O' q; Q
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:# z/ o/ p7 x& s+ o# L2 C3 b

    - Z- ^; {) ?; T! ]; Rpip install mlxtend
    * Y$ B4 k/ I1 r$ ~4 i% v; e1& U$ P0 X; I4 k8 j3 z% u
    为方便进行过程的演示,在此构建测试数据:
    ' [/ U5 ]7 I& j2 J/ U& _$ Z/ x/ q  S
    import pandas as pd
    2 t9 o: ?7 `$ Y3 G5 z# bdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    5 i: O8 Y: t$ n- ]4 ~% V1
    6 w' @$ D( e2 `5 Z9 a+ `' e3 W2
    & ?8 ?" h  W% U* j8 H" t/ i测试数据截图如下:2 ^- C8 b' a' m; U
    " v3 ?4 \  ~. N3 r
    % t* }5 I3 t6 {0 O3 Z; l4 V. T
    对上述的数据进行以下处理:
    , _0 \8 p- k- W7 @
    . F6 S8 ]0 w$ k* ^df_chg=df['product_list'].str.split("-")
    & [; {$ z: ]: ~0 P1; y& @. P/ K) m
    数据处理后,结果截图如下:
    ( j7 @0 X2 Q/ R* _7 K7 k
    9 w0 M- N8 ~3 Q( B截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。' B8 c, o% v9 {" o2 O

    ) V1 {' v+ B2 h) R& f- j2.核心函数及代码
    , }, y+ n( s4 k6 a7 e2.1 数据预处理
    2 E  t: A( }  i& @2 i+ S1 L对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:' [' q4 d( o+ C2 u& D7 z9 c+ G
    # V& T$ k0 v6 o) b5 n& c% |
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)
      e% J) f% S$ ~) M5 wfrom mlxtend.preprocessing import TransactionEncoder/ D- X: b; ^6 {
    te = TransactionEncoder()
    $ e: q: k- Q  `) H; T! Vdf_tf = te.fit_transform(df_chg). [8 k  H2 C7 l' o
    #为方便进行查看,生成dataframe$ y  J. _# O+ Q0 n
    data = pd.DataFrame(df_tf,columns=te.columns_)" W4 z5 N- O1 Z6 k
    1
    3 q; p9 g+ S% l: I! l3 e2 t26 o( H4 D$ N  u+ z/ [' `& T
    3
    " u& i* r' V# r4
    ' b! _4 }  s! T& t6 h* J5
    7 {& R( A1 T2 U, X8 d6
    7 I/ ~6 k3 G+ n% F, Z1 t3 P运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    8 E" V0 M; }7 T; d' ]( K+ e8 H- _3 u+ S

    , A7 M6 \6 |" _  I, e( }; B7 V2.2 两个关键函数* B$ M5 |$ x( A+ j1 t  ^0 p% D
    apriori函数
      ]& j8 O# S  Y3 O8 w* ~. d语法:9 M8 P- ?9 P1 z0 W  i7 Q& O
    : C- D9 b/ b( D. R) z
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)+ z; O9 f9 y6 j1 k4 {5 D
    1
    3 [3 a- r8 k" q7 K" L% }0 T参数详解:
    2 i5 v. D  o8 S$ F% p1 p; Q6 G. n% r9 A9 U% n
    df: pandas模块中的数据帧,DataFrame形式的数据;
      q5 w5 f4 c1 @! f6 m2 U6 dmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。7 h$ J2 L3 N) l+ e% }+ f
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。% V( x9 b1 [4 y* z2 x. R: r
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    ) B) r/ M8 _" A+ _+ {& mverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。1 ^' L" B2 v4 b5 S! i
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。& c* {/ t7 S+ K! o
    association_rules函数# G. c3 {/ _3 M2 _
    语法:* i" g4 }, m# a# b+ {" Y, s

    ! X5 v+ |7 D6 i: k9 `; nassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    6 g/ W' o! U* d1 n6 P1
    . X/ i2 I( N2 J# c6 [参数如下:) K9 p' I. B7 V9 k9 X3 J. H" U( C( E1 Z

      p: ^0 `' f3 W) R( W4 edf: pandas模块中的数据帧,DataFrame形式的数据;- h4 F. i  U9 v$ [$ X% Y" T( D
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’! C' `! a" p* @) Y4 f
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    ( a* X' k( u& W% Vsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    # p0 \  Y* E2 A( F2 D0 l附带metric几种参数的计算方法:6 {8 D) n5 K6 V6 r' n
    8 T8 P( [- z+ t8 t
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]; p# p7 v4 P: z$ }1 G8 `% `

    & F! d7 w2 f( T( _& x; tconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    ( i' [) a) R" L  o3 }5 [) t! a
    0 l6 u4 O- O  j8 W) T* blift(A->C) = confidence(A->C) / support(C), range: [0, inf]: L0 U" \+ f0 T; ^- ~. n1 {. D( u

    3 n# x" o/ i% w4 k0 ?! `4 wleverage(A->C) = support(A->C) - support(A)*support(C),
    0 U! ?' T, O% |% erange: [-1, 1]
    " Y4 I" ^+ q* X8 @6 f  W0 U/ T1 |$ D, _& b* h7 Y: h- N
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    + I; y: l9 i6 A9 ^: vrange: [0, inf]
    . n8 m' H- |% ]2 v" Q, ^2 A  h, D! {# R- ^  G, t
    3.实际应用案例
    $ Q9 ]# T" [, |) ~- g( ~以下为完整的调用实例:; A% n1 ~" I8 C0 Y

    ) M) m, [6 {! h- o; Simport pandas as pd
    0 [" x$ ?* I2 Efrom mlxtend.preprocessing import TransactionEncoder( c! E/ C* T! N9 v8 A& e
    from mlxtend.frequent_patterns import apriori' P) b. @2 p# w# D
    from mlxtend.frequent_patterns import association_rules
    $ K, |4 D- K2 N5 m8 h- ~9 ]#1.构建测试数据
    & }% q+ P& o+ n7 D; g9 k! Q& zdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    . c/ H* s( t5 s5 z% {' z! P5 s3 Bdf_chg=df['product_list'].str.split("-")
    2 b+ S  z* V" ^6 H#2.数据预处理+ |, u4 S, a2 q8 U$ y
    #将传入的数据转换为算法可接受的数据类型(布尔值)
      K" y& l1 V1 ?$ f1 Pte = TransactionEncoder()
    ( m4 O$ S1 z  Q: ]df_tf = te.fit_transform(df_chg)
    5 T2 y' e6 H& j: P' e& l. [#为方便进行查看,生成dataframe/ D+ w* w+ V8 R
    data = pd.DataFrame(df_tf,columns=te.columns_)
    & Z9 L8 n, V& T* d  G& n$ ?#3.建模
      z8 q( r0 A8 z) o+ z( ?#利用 Apriori函数,设置最小支持度为0.2
    / j# S/ T5 d% `1 |# ^4 Zfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    * Y3 W6 q. N3 n7 x3 r#设置关联规则,设置最小置信度为0.15
    ' Q- b" P+ v) k" [temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    2 e0 g& p9 T+ |$ B' o#4.剪枝并控制输出) Q- Y, l1 s& o2 y" R6 w$ e
    #设置最小提升度,并剔除对应的数据% L& I/ x) N# ?
    min_lift=1: ]# p( L: ^$ M0 y
    rules = temp.drop(temp[temp['lift']<min_lift].index)3 a" @' E6 ^- c5 D2 ~
    #筛选需要输出的列+ `, u7 E8 ?$ C# ~2 x
    result = rules[['antecedents','consequents','support','confidence','lift']]
    2 y) g) C/ F, E0 O7 H( _7 V; F' aresult=result.sort_values(['confidence','lift','support'],ascending=False)- l, w( [3 Z  t
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    5 l" F5 c8 N' |/ B% j7 K3 S' @
    ; X, Y- p+ k; \9 P1 M( ^1
    0 e7 L: i! r+ B+ l& b4 m2; q( r( M  U; B( }) N1 S: {2 }6 Z+ B
    3
    , q0 J0 B: v( m( f  v+ y  W4
    # f+ Z: C$ {4 P9 n2 i5
    6 b8 W: Y" y$ ?2 ~  R8 i6
    * f) G0 ?/ S9 K  I0 K& O, D72 o" X5 U& u  n% E$ l
    8
    - {4 G7 _( M+ n2 ~% A8 O$ }+ p9
    ) G5 h8 L8 D3 X3 ~( _10
    , u! U2 n  u4 h7 H. {& c7 r11
    $ n. Q2 a) G4 E0 |12
    4 o, x4 c3 j+ `2 T) Z134 I+ }# h) t# l, N6 B* ^
    14+ b2 ~* T+ |8 i
    15
    + H* m' {$ a, f3 Y16
    + c9 y, K  J) o% [& F' ]& F- k171 \4 h7 h7 j1 L4 u' U
    186 ?# e7 s- g3 [7 u
    19$ }' c) f- L: h& ~4 [, m
    20
    + b  J' X4 }+ q. H, c' f. Q21
    0 O1 b3 d3 F! o5 u22& ^# A+ o+ M; T& a  @
    231 s& @2 T/ t( C" y( k
    240 W2 ]0 n$ ?9 L- ^' E' Y
    25
    * \7 E' \/ v  ?% y26( {7 N# U- q  X5 \+ _
    输出结果见下图:
    6 c2 N& z' M% f* B
    / e8 m4 u) j: e( c! f3 j5 q" o————————————————% A: X* T( i( _- B' Y
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 L2 W1 f" ?# h8 T; g3 H' {
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759# v8 t# ~$ r1 [/ Z, G' M  v: b
    ; T7 u0 b1 R! q+ n1 Y, H3 K- U

    # n: e7 L% R0 T
    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-7-13 09:07 , Processed in 0.405858 second(s), 51 queries .

    回顶部