请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3291|回复: 0

[其他资源] 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

81

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    发表于 2022-9-12 18:44 |显示全部楼层
    |招呼Ta 关注Ta
    数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
    3 r5 ?+ Q9 g( Y! }" A9 w) Z
    - Y4 Y8 c- E7 _! j在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    ' e1 V! J7 @: |" u0 u
    + \+ |; L7 j& D6 q& F1 P0 V1.准备工作' ]0 p6 V* X0 b0 U4 u4 l+ I
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    7 N; R# w( h# F5 u8 H4 d6 |" P. z/ x& l0 l
    pip install mlxtend
    ( x& W( |0 a& i5 N& Z' S8 O' n! f1
    . R' d# C7 `! [6 t4 ]为方便进行过程的演示,在此构建测试数据:
    5 q3 K4 f0 B0 u- o. [- I. C! u! ]8 q5 o
    import pandas as pd' q- s3 C/ B, f; p! q1 X! u- i
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    4 J" Q: I- N" i! K' ^5 _( H: s' H1
    : W' N) _2 _, H, B) j2
    + A  c4 Z  ^, n# E3 x+ {& T8 }测试数据截图如下:, P" W. o3 Z" {3 \* }9 b
    9 t. J8 ?' o- s, I1 \
    ; _: M3 F- [* i
    对上述的数据进行以下处理:
    - q' P% @3 R( P' Z) v
    7 d# q& L7 I8 y6 p; Z1 Qdf_chg=df['product_list'].str.split("-")
    6 |* o( D8 O: H; q5 k- {1
    ) f6 r5 k1 L( [+ N$ w数据处理后,结果截图如下:9 Y3 m% W, P# H: @, C6 r6 s

    - K$ @$ v9 P, }7 [* `( V7 u$ F截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。) i3 i2 y% t4 g8 Y

    ) |, h) v; Q3 k. R3 N5 K2.核心函数及代码
    ; @8 z1 D; {; O6 J- N! c- a! T2.1 数据预处理
    % x6 E! G: K7 }3 K对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:# ~6 r5 }7 e1 p" }
    ! a' n! k0 N4 u1 R/ F: N- `
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)% x) F/ u, i7 j! l0 k
    from mlxtend.preprocessing import TransactionEncoder, \6 h! Z2 b) ?& d" n) l/ a
    te = TransactionEncoder()
    7 N# X' G: g4 @: \1 [8 edf_tf = te.fit_transform(df_chg)+ L9 Z  T1 \6 U
    #为方便进行查看,生成dataframe
    0 R: A6 T  `% h* cdata = pd.DataFrame(df_tf,columns=te.columns_)
    . H2 ?1 J  y5 Q1 c2 c4 h1
    # y: P- f3 x8 P# ?1 j2. I" Y0 {; X& H5 t0 B- G
    33 |2 K- m, r0 p) `% \
    4
    ! \9 M2 L1 H# y* e$ m  l* n; A5
    * j" l- ]& T1 ^/ W7 j* J7 O6+ a0 G  u/ T& N  U7 f8 }
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
    1 |) y; h. i( n: d+ v  V5 I% e9 a: I. b) {. e2 b6 r" u& n

    ( j; m% [5 l0 Z- Z4 _2 a; N7 C2.2 两个关键函数
    0 @! g! I7 m7 ^9 F  Sapriori函数4 z  C" T) h9 t: w
    语法:
    7 [. P- q4 }( p9 O; g1 J" Q9 @0 v; p; l+ I3 ~; v
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    % t+ Q% d% C3 u8 e1/ T- ?9 K5 Q) E6 _' ?; f
    参数详解:  o% s$ R; |, ^; V* W# B' P- O+ R

    ) Q1 F' U+ {7 h3 Ndf: pandas模块中的数据帧,DataFrame形式的数据;
    . ]1 r- B5 i* E" Q; x0 u$ `min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, N% _$ T/ I5 j; _- m3 R4 O
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    . q3 _4 \6 |+ f0 Y$ A0 xmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。/ b& I& z. T% B6 Q
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。# l3 Q0 A: P: w2 u0 E
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。5 f  t- x/ s& x2 ^! j9 t* Y: G
    association_rules函数, ]* `7 g# g! @0 X1 \% U  U7 Z3 x
    语法:
    , o. _9 J' j9 E- L
    / x, S7 k6 K5 p# `association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)5 y! l# |# U0 b4 [1 k- l2 h* v
    1- \3 d( M1 i( x& }/ g0 A' p
    参数如下:
    : {( D/ }& E. G( J- Z
    6 B/ B9 \* @3 {df: pandas模块中的数据帧,DataFrame形式的数据;
    ! S# p5 m. x4 y0 J3 l" @5 j& Vmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    % M& F' H& e( {min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。- f+ Y/ d$ q5 L/ X$ E# T
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    3 C( r3 x  K# J附带metric几种参数的计算方法:/ v  f8 M6 a) w2 d

    7 v  @( [, ?; ^+ Y, csupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    ' E& v9 A  L3 f' N) \! T
    % _- I: G1 n* x( W& p$ Sconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    ) |* e, A6 c2 l4 i
    " D/ K6 R: o! d1 dlift(A->C) = confidence(A->C) / support(C), range: [0, inf]. h5 p) `: F4 g' P5 q5 H  U

    " i. J" ^/ V. a; n, n- qleverage(A->C) = support(A->C) - support(A)*support(C),% C! S$ c; q0 V
    range: [-1, 1]
    % J6 H& m  p# Z8 t2 R8 _
    ! m' r. O" x$ B8 b7 l4 k+ oconviction = [1 - support(C)] / [1 - confidence(A->C)],
    # L$ ~& F8 y0 w4 ~8 N. n' N. xrange: [0, inf]
    # @7 X$ e' K1 H' R
    . g. l/ _. j4 B" ?0 M/ B0 Z" R3.实际应用案例* E. U/ M8 @* |4 B
    以下为完整的调用实例:
    6 M: k/ B  j! I
    3 ]# [9 C; \. z4 f& Cimport pandas as pd# D' u, Q. u# Z* ?9 n: c
    from mlxtend.preprocessing import TransactionEncoder' f. I$ [, J/ U0 m7 X; z3 P
    from mlxtend.frequent_patterns import apriori
    4 @- P6 q2 U5 C+ e( e7 C. l# Zfrom mlxtend.frequent_patterns import association_rules, n. U- W' F; ?' {8 X/ p
    #1.构建测试数据2 ^7 }- B" R  o$ V8 P
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})0 Q  f- q( l( ^, b% A2 y; q+ d/ `
    df_chg=df['product_list'].str.split("-")
    ) ~. }7 ?% W' T; s; X2 p#2.数据预处理
    1 p( t0 D- y0 Y. b1 T" G! U#将传入的数据转换为算法可接受的数据类型(布尔值)
    0 K& P. E/ s+ n& Z9 ]1 }3 }te = TransactionEncoder()
    8 n- T/ o* A+ i. b5 s/ Adf_tf = te.fit_transform(df_chg)
    / g4 Z* Z$ y4 K1 S- v#为方便进行查看,生成dataframe
    * S0 p& l+ |9 ^* N: |% z9 rdata = pd.DataFrame(df_tf,columns=te.columns_)) G8 Y5 J9 L; {1 A" w+ F! x
    #3.建模
      E/ @) E- G) W5 L* F#利用 Apriori函数,设置最小支持度为0.25 G" b& j. i7 P1 ~; E; s3 h8 @
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)7 i" V5 k) {0 l  d8 U
    #设置关联规则,设置最小置信度为0.15
    ) F* Y6 A, K" h6 f+ Ttemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    * Y% D, x' ]+ J1 t, Y#4.剪枝并控制输出
    3 n6 B3 K  r1 ?& v0 t, N2 Q#设置最小提升度,并剔除对应的数据( d* w- l3 ^- J) A) b( `
    min_lift=17 \% a9 A$ ?' j+ Y3 w( ?
    rules = temp.drop(temp[temp['lift']<min_lift].index)% N3 |& _- J& [" ]7 l7 w/ G$ ]
    #筛选需要输出的列
    - j* Z$ w' P$ rresult = rules[['antecedents','consequents','support','confidence','lift']]
    1 I/ n3 _9 L! o3 A* A6 ^; l, _: aresult=result.sort_values(['confidence','lift','support'],ascending=False)
    : w$ P  w" A! o1 E$ t% Eresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')0 V# A: i- Y# \4 U/ H* c% F8 j

    , d$ a- p7 a: A' X1- N- j7 u( |7 Q+ }( a
    2
    6 j; ]1 u$ C. X2 ^8 c: k7 R5 J3( ]. x' ?) ]( p6 q0 p
    4
    # Z3 U# ?' l, N; h. b' k5 F5$ I2 c4 J4 Z2 \; t
    6
    4 m0 Q4 i( Z1 q- Y; T; H2 ~7
    5 e+ y* ]2 p9 T, w8
    6 e) B) e2 @' ~0 M4 N$ n9
    . g  Q/ z8 ^8 z0 G, x5 b10
    $ g$ _4 c: L& G# l3 o11, i2 ]$ }6 P) @3 U* C7 r
    12
    " C/ d, G2 A  p. r" o2 k  G- X13
    " T! n! s! k6 y9 N1 R* l3 l, P4 j14
    ! X6 I4 E' z, O" i1 D% D15. u4 P0 f7 w+ ~) Q( S; C9 @7 \+ [
    16; }* C' p( f: n# M) y1 S4 E
    172 F! R! Y; p8 }3 S7 _; M$ w
    185 j$ G8 J' \2 r+ H7 C0 z* z4 v
    19) ~; ^$ L# g. @6 p+ u
    20
    , |/ H8 Y1 k2 e21
    9 {# W  l' k5 Y5 Y, K22
    3 B: L2 ~0 \+ f. [, M8 d( n23
    . m1 Z: {+ @- p6 g24
    ' ~- q! a- J% |( ?( _25- l+ H# k( I6 c5 G- D: T( y
    265 T# U& ?$ B% ]) R* r/ H3 e
    输出结果见下图:! z8 O- A; O9 z. b" C! |
    7 b+ M- k- y; t2 g) E+ B
    ————————————————
    5 b2 ?. V7 F2 v  D2 z. Y$ Q版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 ~$ i. K: ^5 O: O- l  k" c: U原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    2 ?& T7 S4 {! K4 n) U3 k/ t! P. n4 F& W+ `( K  d& w
    4 }8 i# q" V4 y3 I1 q
    zan
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-2-14 12:13 , Processed in 0.244141 second(s), 51 queries .

    回顶部