QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5017|回复: 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算法篇- N  \/ s! u2 G) l
    4 \4 O+ C% ^: K/ J
    在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。8 d3 U! H/ ~, W0 X6 ^
    $ P, O+ n) }' o. X2 F, s
    1.准备工作* ^7 b6 O% Q5 q9 ^
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:, G1 Q1 ^$ J5 y. b$ D- A) P
    8 Z# l: [1 P$ U) |9 J: X( V
    pip install mlxtend
    " K2 k1 c# r; P  ?1& h: Z6 o/ q% l
    为方便进行过程的演示,在此构建测试数据:
    ' x: Y, W' [. Z: k1 W( h. b; q6 j% ~% |% Y
    import pandas as pd
    4 U) ~: o6 k6 l1 N( b1 w; q$ |df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})/ ]( D# Q8 E, {6 B6 E+ B  {
    1
    . [( S& \$ }* q; j; U) z2  Y" c  V) @) V. L) \% j# T0 h' f
    测试数据截图如下:
    . I% @: L- k, X" h, O% F) H  Q9 P3 `4 X) B  ~
    " [# u* [: N: Y
    对上述的数据进行以下处理:
    . U+ R! m( ]5 w& L( e8 P( M; l9 O( J* S$ w
    df_chg=df['product_list'].str.split("-")
    & }, H4 R$ c' _- a. e1( B7 _& ?, d6 c  X& H
    数据处理后,结果截图如下:
    6 u  ]( D  y# Y$ f9 C
    / i/ t6 f: P$ n1 N% Y0 c截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    ; r2 t6 f6 ?2 n: C7 B2 k+ |& H- n5 t  t1 Y2 s+ A, H
    2.核心函数及代码' }& S  F( O% }, [
    2.1 数据预处理
    4 i% |1 n$ m4 U: F$ ?& d1 g对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    7 i# B9 ~& {2 B: F) Y
    ; N2 u2 G3 K0 m8 G+ R2 R5 p+ Z#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    % E  m( M6 n3 R) _/ E: Hfrom mlxtend.preprocessing import TransactionEncoder! U0 `" J7 o3 [
    te = TransactionEncoder()
    # i$ k$ d0 A) b( U+ Z2 _/ rdf_tf = te.fit_transform(df_chg)
    5 N/ ]( @$ u8 T! P#为方便进行查看,生成dataframe
    - o: `6 z+ e: _. ]. w% @data = pd.DataFrame(df_tf,columns=te.columns_)% c+ P! [( e* n9 n- T
    1, i, X* E$ c/ a5 q4 I( B. C9 C
    2
    ' Z' Y" }& \1 L33 L0 T! z5 E) L2 _% ]1 F
    4
    * @. x) V" A2 Z6 m, P# G5
    9 N0 d& `, o$ q; g4 L3 x+ L8 U6" L' [/ g2 Z0 o: {
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    / h6 ^( S9 i: p" [
      {1 T& B3 B! |$ |& F# r( k
    , ~0 {# w' J/ v: @0 t# |2.2 两个关键函数
    9 L7 W3 B; z1 ]apriori函数. d$ R% l5 N. S. U2 L8 N4 S
    语法:; t8 y( L- ?8 q/ u8 Q+ u0 k7 J

    , q& m8 R! d3 i' d. ~apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    . C( C' s0 F2 B% u. M1
    8 ~% U: q7 o6 P参数详解:
    - \, Z: `' g$ Z1 z. H( J! x, a) g2 N5 q0 d0 j6 C% h. D
    df: pandas模块中的数据帧,DataFrame形式的数据;
    3 L, x; V7 T- ~( tmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。  U5 `+ g6 @' L/ [' k& \
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。% c$ ?8 k- R6 e& O
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    - g( b1 j; L) C# {$ {: U$ ?) M5 zverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。* L4 {7 ]& F- ]# B
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。' G- ?# g$ H; b7 H0 z1 E
    association_rules函数
    : _% a6 @' ?5 s8 A0 c语法:& M3 f+ N& g; h8 t3 D2 Y

      {* k: K. f7 Xassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)6 j  O" D5 W4 a! z
    13 [6 ?* k( S; o4 A8 }7 j+ e5 U
    参数如下:; W/ @% x# Q' G: C
    ; B! P) U8 B  }$ A3 K( }
    df: pandas模块中的数据帧,DataFrame形式的数据;- e9 {( ]" |% k/ p  H$ K/ u
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    ) T$ Y" G9 B3 U. V$ P2 z' J3 m. imin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。0 r+ y% \, g9 ~0 N9 S5 N3 j6 A
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    ( Y  k/ |0 [* S' K, r/ ~附带metric几种参数的计算方法:; N" t& |$ j, Q

    4 k( g, M( s+ _( a9 s& ?support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]8 C% E2 a& \& @& b) j, g' t

    " r  g( ~1 J* d+ ]2 L& A9 Qconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    & k5 o( I& M# l1 N
    7 ~' T( V4 T. z/ Z0 }lift(A->C) = confidence(A->C) / support(C), range: [0, inf]' g4 F+ [2 E+ \& D  l8 h' b! r
    ; P$ n( {- t, }1 Q3 L
    leverage(A->C) = support(A->C) - support(A)*support(C),
    0 {/ e; ^, Q5 G5 e4 Crange: [-1, 1]
    7 N/ f" a: |3 @( E9 q2 V  m5 B
    " ]5 N! v; m6 l0 d) t, O. nconviction = [1 - support(C)] / [1 - confidence(A->C)],
    " H. r, L  U: W. Q) frange: [0, inf]
    " L  X" d8 o! z( X7 g7 [, e
    , a' _+ Y: \0 }/ f. Q: B9 ]3.实际应用案例
    & j2 f% Z6 _6 N" W以下为完整的调用实例:% z& N0 F1 `9 d/ _

    7 Q* A! _# D1 |3 d7 A+ l# Dimport pandas as pd
    % c1 C& |! g" ofrom mlxtend.preprocessing import TransactionEncoder+ w) J' T! W& `+ M% w
    from mlxtend.frequent_patterns import apriori
    $ u+ w9 L8 a/ Ufrom mlxtend.frequent_patterns import association_rules
    5 D0 m# u* O. b9 U#1.构建测试数据
    4 a4 @* k6 R1 I( n2 qdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})- I8 ^: X( B0 s0 V1 D
    df_chg=df['product_list'].str.split("-")
    ! w0 i" Z. Z! I/ I8 }#2.数据预处理
    ; G: _! a$ r* e3 `0 d9 q#将传入的数据转换为算法可接受的数据类型(布尔值); f/ X! L, N0 l) [( P& j/ [
    te = TransactionEncoder()
    7 V$ I) q+ k/ W0 D( D: O* j, kdf_tf = te.fit_transform(df_chg)
    3 |9 K7 c( Y  Z! J, W6 @& R0 S#为方便进行查看,生成dataframe* {% ]# L3 g/ J& [
    data = pd.DataFrame(df_tf,columns=te.columns_)  f9 L: W3 u/ b' L0 k
    #3.建模
    # L* y* p  U) e#利用 Apriori函数,设置最小支持度为0.2. `# m1 W, \! _7 {2 l5 R& p
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)" u2 v- c; ^: b
    #设置关联规则,设置最小置信度为0.15
    8 U( T/ P5 P  k0 x& Itemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)0 c9 [# z7 ?) P% [6 U
    #4.剪枝并控制输出. [% j: z4 w/ C6 C( G, ^$ v; d
    #设置最小提升度,并剔除对应的数据
    ' W% e+ \; ?- Y4 J8 wmin_lift=1, n, q; `  W& v
    rules = temp.drop(temp[temp['lift']<min_lift].index), [$ A# Z% H& N, A: h5 T) i% c. I
    #筛选需要输出的列
    ! a  N: O0 O3 m) K* Presult = rules[['antecedents','consequents','support','confidence','lift']]0 K5 p$ U2 s: _$ V0 q
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    0 |! R% H/ u! Qresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')$ ], {9 E* a: ?; q5 Z
    & j- q/ F7 q; V# w8 L0 ]# S" b
    1
    - S4 ^/ i6 s% P, E2
    $ `3 h; ?* n; P$ F! f2 I( {& \- a. |3! U; o3 @4 V2 f; i9 s; a1 h
    4) y& m1 E: V- P# k  }
    5+ t: H% d6 x1 ~+ n) h) z
    6
    5 P9 c) |8 J' E5 `) U( v2 M! ^7- x# f* A7 r" G( Y) A4 v
    8! D( j" g; c' W2 O
    98 ]9 o  j8 K& a- a6 Q7 O% U
    10
    6 e5 A' ]- l4 J# `$ y1 w9 T& ]! l11
    + P; O) G' M( o+ d- Y- \128 q9 s: f+ ]# a& e1 P
    13
    8 B% {* {3 H3 ?" K+ y14
    ' D$ ?) P: n9 ^7 j5 j15
    1 c+ a/ X6 W# V* s16% t  h/ C' ]3 P5 r
    176 P- H* \% N  F- b
    18
    * [+ y  N( f$ ?( V2 ^- r6 x+ x19& N1 c. ?# w7 B
    20# T/ R2 ?' h, l, C- A" P6 B& `
    21
      J: [1 T4 b- r' Q7 D22
    , y& W( f  P: g23
    $ I" y) H" S- \24, s8 H0 d0 l4 f4 S
    25
    " t# p$ {3 o: U- L8 o  h26
    * H1 r4 U/ ~) o输出结果见下图:
    $ J' Q0 w' J5 i# e% I2 ?
      r) @- [, i! b) m/ g0 `3 v* V" T————————————————) ~9 Y) _; E# M) L2 M) a
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 s) O: D  U0 l" e' f: i' \' ?
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759* ^5 N$ H# A" A* @# B

    / s) f6 @8 z5 [% `2 O8 s# o5 ?4 V; E6 c; w
    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-14 04:17 , Processed in 0.385227 second(s), 51 queries .

    回顶部