QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4973|回复: 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算法篇/ R5 V* E# {6 h7 j

    5 k" c: h% \2 [  W* F0 b在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    " f& Z4 B# M' m5 Y/ S# [4 I7 r8 E  D
    1.准备工作1 M6 V& k. q/ ]. L7 n, j* {& I
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:0 I' U, M( p6 T$ m# F8 ]* U; C

    3 B4 d( l9 Q  F9 |/ p/ Gpip install mlxtend
    4 X$ B) m0 e% z! M  O6 }. o& c1
    " D, o7 m# i& Q: H为方便进行过程的演示,在此构建测试数据:
    ) k! D7 R  X) ^; Y; O
    $ ?! I5 r; m4 A; q6 K) u$ P, Q3 Rimport pandas as pd7 Y7 v7 u. h6 y, p2 `8 x
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    4 e4 ~  f6 b+ O, _2 }! w# R1
    + A) z3 m8 f6 Y2" \- e9 J. Q8 R5 N# O; ^$ H9 |
    测试数据截图如下:
    : s& k4 R) L( d* s
    . F) F! p$ k" ^2 C- E2 ^! R. D' K! ~
    对上述的数据进行以下处理:
    * i' w: C: x. W! o; r5 J* Y6 d
    df_chg=df['product_list'].str.split("-")# N4 o( W5 s/ {
    1" I7 ~7 n) ]' C+ v9 o
    数据处理后,结果截图如下:! {9 `8 W5 R( ^8 b" \3 ]8 G! M

    0 L  f& _6 `- _( H8 n& j截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    6 {- Q& m, Y2 A6 r* Z( \3 z* G6 O4 x7 ?  y3 t
    2.核心函数及代码( s/ T7 c6 ]: a6 {
    2.1 数据预处理
    8 G# H( E3 Y; k  a5 c对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    : u( X+ i! ~/ {/ f
    % s5 A* S" N5 x3 C: A2 u) s5 R3 \#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    ) C! D5 h9 G) V* Sfrom mlxtend.preprocessing import TransactionEncoder
    , o( s$ W1 U; f1 L: @te = TransactionEncoder()
    4 P6 K  t2 @  d" z- O' idf_tf = te.fit_transform(df_chg)9 @1 j3 i  E/ t0 [
    #为方便进行查看,生成dataframe
    * Y! O# b3 L3 L) odata = pd.DataFrame(df_tf,columns=te.columns_)
    # d1 g0 _, |* T: j& F/ N1
    ' F6 r* X3 v, P; ^' Y7 n! X0 o2
    / X: }# @9 @0 T0 q+ O3
    / F9 U/ U# P) i5 o43 F, {+ |7 t/ W9 @$ U' L
    5
    1 t& z4 C4 I5 B: ~& V9 m6
    % p0 E" X$ u$ N# s1 u; }# P$ f% h运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    & t& l: \$ w' w9 u( N/ `3 s# ?# G. l4 @

    5 Z6 i% i/ a3 f( z6 n2 g. r8 J2.2 两个关键函数
    ! a3 O; g& `& Q2 |; wapriori函数/ m) s# M! L& C5 s) j
    语法:1 j. Q( i3 |7 }8 ]8 c, H5 k" ~6 X0 r; b

    " \/ U! x# W& _9 O- h+ e, S5 M8 l3 gapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    4 P  T* }; K% \! O  W" b14 d: ~7 f$ b. S/ F3 T: ~; E: I
    参数详解:
    ( \/ m3 p2 K& D; x  p7 C0 Q. l3 _6 y- h- x
    df: pandas模块中的数据帧,DataFrame形式的数据;1 i+ M, u3 W' @4 d
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    1 N( N; X# A. b- d! K6 j  f8 @4 Guse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    . h! C5 w5 y& F8 A+ kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。; P9 {" N' Z, ^4 N- J
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。' S7 f& `/ W* F2 k, d- y& J+ s
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    * B! {, q* l0 t6 J9 J6 I5 |association_rules函数
    1 p) t% o) H* k' v" a; e( u5 B" v语法:' ~; W# U" R9 ~5 \# [8 |

    ' s1 d+ A! W- V& D* {0 `. w' dassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
    * V# j, Y" Q+ O  l. N$ P1
    0 U- R) Y: A- K; `/ Y  M( z& F3 c参数如下:, M; Y7 X2 h# w4 Q+ H

    1 d' S; X- u2 h( [, Y- u) odf: pandas模块中的数据帧,DataFrame形式的数据;
    * j! s, ~: K4 D: Jmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    5 t! T  `/ X, [* j# l7 H3 a$ `. B/ Emin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。- o' y% E* e9 a
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    9 W' E+ e+ [( N& q& M% @2 S附带metric几种参数的计算方法:, Q6 R3 V4 B  |5 v0 U3 W

    + N8 P) G: e2 i) ]support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1], d5 L5 Y  h/ n2 {
    / Z1 N# w" E- K
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]. s! i( I  Q+ c0 B& r* F

    * \! s6 ~0 a* u( [: u, blift(A->C) = confidence(A->C) / support(C), range: [0, inf], j9 A% t, K! T/ p. r

    ' n3 F7 b! z2 a3 P0 ^5 V  `6 @leverage(A->C) = support(A->C) - support(A)*support(C),
    4 |, Q8 B' H; Z% p1 n+ O  vrange: [-1, 1]
    " _2 ^! L; c* Q; z3 a
    + \$ J/ ]- e/ ?# D% vconviction = [1 - support(C)] / [1 - confidence(A->C)],
    , z( `) O6 D/ u) I# D7 yrange: [0, inf]- a( l$ ]3 I( M8 w" h3 r

    ! N" l9 ]) X- _3.实际应用案例, R1 L4 b- y) B/ d7 N
    以下为完整的调用实例:
    $ j: H+ `8 g' K1 P) @9 k9 g& B4 I& v0 I% s& J5 P/ q
    import pandas as pd
    0 G# k) V$ Y" T7 hfrom mlxtend.preprocessing import TransactionEncoder
    ( H! ?0 i* _! ]from mlxtend.frequent_patterns import apriori
      Z+ j7 U" t: V$ O% P, e7 {9 Bfrom mlxtend.frequent_patterns import association_rules# u. k; n. I8 R! [3 `: s$ e& r5 [
    #1.构建测试数据
    0 z4 i! }4 n: qdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    # J  ]1 i6 H. p' D' gdf_chg=df['product_list'].str.split("-")
    / h0 J+ U. o% _$ b2 i3 q, L- }$ J#2.数据预处理
    ! _2 u6 Y) l, O+ P7 j#将传入的数据转换为算法可接受的数据类型(布尔值)3 i7 W+ u. i: Z+ R& T
    te = TransactionEncoder()
    " X8 y! R2 _* F. |. ldf_tf = te.fit_transform(df_chg)3 P- h* Q! m) W, ?! J/ a0 D
    #为方便进行查看,生成dataframe- I) r( N1 W  U* u7 V) u: g
    data = pd.DataFrame(df_tf,columns=te.columns_)% w! y6 {! s; m+ i3 A
    #3.建模
    9 _) U, H! Y) ^6 p) X#利用 Apriori函数,设置最小支持度为0.25 w7 X. y. U9 k- G# j+ K, T' V
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    " B, U3 e. `: s; s1 T' ?1 g#设置关联规则,设置最小置信度为0.15+ B& ~& T. \/ G
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    " s/ C) e% p0 I" I! ?" o#4.剪枝并控制输出
    4 w% l, B* J1 J, {* e) I) k$ j#设置最小提升度,并剔除对应的数据2 s  B5 ~$ B1 E& }
    min_lift=1
    ; M" J' n. X4 \0 Drules = temp.drop(temp[temp['lift']<min_lift].index)9 j: b' v5 g/ Z' x9 z3 D. j8 f
    #筛选需要输出的列* g6 C4 x. X+ d3 L- g3 c7 W2 k
    result = rules[['antecedents','consequents','support','confidence','lift']]
    : i' |0 F9 ]7 h8 e. x" w9 Dresult=result.sort_values(['confidence','lift','support'],ascending=False)3 H9 b' o; v' \2 M0 w% W$ C9 A
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')7 W+ l/ u4 W* A% n

    0 ]/ m4 Q/ \" j2 o: m8 Q11 u: S, k2 z  l' w) O5 w- G4 p
    2
    + S& [& ~  `$ x3- W* y2 Z) \. V) w5 W% f
    4
    # @1 h5 D/ i+ q/ P5$ h) T- E2 ]# j1 O; e+ X6 o
    6
    5 U0 N" ]3 B, `$ i" _* {7
    9 v9 S1 ~: d6 |8/ d* }& T; K3 ]. L
    93 M' D. X5 v$ g5 }. O6 `1 R- x
    10
    7 n+ h$ K6 J! T8 D% b: i2 j$ G) G$ x11
    7 H0 P' t. A: t4 M; H124 M( c& H& G8 }" g# e# \! i6 }
    13
    * ?( X9 |) @- ?5 _14! x4 n# `1 t) j" {$ |
    15
    - X8 w' R0 n. q16
    5 |+ D' P  u/ ^2 ~17( z3 r- F% [* N3 C( Z
    18
    + u) c3 n4 q4 v4 A$ C19! A8 T* j: ^' v; s
    20
    # u# R, [, H7 _4 D0 k216 N/ C4 w# K% |: D  q
    221 x! f: ~1 i: u9 x1 ~
    23
    / T: S% q7 g+ |7 J: ]24
    * W; U3 @  n( @2 s4 w25# w: b# L+ k5 E
    26
    3 b( S$ I7 w: ]) I; \7 ]0 {4 E输出结果见下图:
    4 t9 c4 ^; j+ i! J/ ]; t
    ' u" Q+ J$ T4 P1 I————————————————
    + a# P+ y: o. S版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: U1 C5 `0 y2 k( w0 l# Z
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759, |3 q& p' j, u# {8 R$ v/ p

    ! D  s; q  y6 c4 ]( |  r: b2 S! y0 E6 w. F  p- x* v
    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-4-14 17:17 , Processed in 0.547068 second(s), 51 queries .

    回顶部