QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4971|回复: 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算法篇
    , T4 m3 s% a/ q+ V# P* }
    * E5 {( {, k& i0 f- v, }& Y; |在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。) [6 F, D, _' f& ^, X0 ^

    ' p" f& z5 x7 g) s! [1.准备工作
    7 g3 Q( [, T5 @9 J如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:2 r% X9 ~2 Y2 q# o: V: R( D1 `

    , m1 a0 D5 S% [pip install mlxtend9 @4 Y0 Z% }# B( p* }: R$ ]
    1) F2 {9 [! c- U- q
    为方便进行过程的演示,在此构建测试数据:
    + }) {3 g5 B# L. T2 v
    ' a. E0 i( W6 h6 @: wimport pandas as pd
    . }8 \! Z, c- @3 \! R7 edf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    3 o* b& T4 {6 o- I' B6 B' q8 O1: O3 F# r, B- y# Y: F( S
    2
    / J4 [  H1 X, }$ X) Z测试数据截图如下:! d+ {# V$ ~/ ]/ c2 K& `8 ]
    5 R# O! u& U- e! [

    . a1 U! v8 [4 e% `" x+ y对上述的数据进行以下处理:
    1 A( p/ ]2 g6 H% o4 g3 B/ l5 `. x# c! g- r2 a5 b
    df_chg=df['product_list'].str.split("-")
    ! _' S& f! d% y, a; |, W8 v+ ^1; [8 C" Z! Y' i0 R
    数据处理后,结果截图如下:
    9 Q+ p* U4 ~6 l4 Z# r8 ]$ E) t0 h
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    % u' L- Z4 V2 F9 w. [8 b4 k+ R4 }8 x+ ^1 D) q; v2 j
    2.核心函数及代码4 g) A$ P! `5 y- t) q
    2.1 数据预处理
    " N3 p4 u6 c& i' ~, p5 v对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    6 u. l  t2 G; b% i$ _* o/ W3 x$ J$ v
    + V4 }3 Y3 F8 F$ s#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    3 E- F& ?' F! y, sfrom mlxtend.preprocessing import TransactionEncoder- K2 z3 B) B, N
    te = TransactionEncoder(): B* `& F8 i* M5 f% J& Z" A
    df_tf = te.fit_transform(df_chg)% U( A0 M" h, U3 a( C$ I0 `
    #为方便进行查看,生成dataframe9 p6 [. Z3 G0 @( B( W% A, h' z2 G
    data = pd.DataFrame(df_tf,columns=te.columns_)
    & \  K4 u2 f1 w6 p' d1
      _( r9 X* ^! @, a24 e& r: S# h6 J  r; t6 N) O) U
    3
    ; i* G" o, M2 e2 d4' K$ _6 s  t2 G% W( Y- ]
    55 I  Q& s8 \, T% X- Y
    6& a+ ~+ P( |; z' o
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:' p) J6 _8 J9 t. C1 u

      ~( `0 t) `% V: ]6 E+ n, `( n, A& q! I! V4 H
    2.2 两个关键函数4 V' W  v( Q" [" H
    apriori函数7 [3 C6 J/ Z" y$ ~- b
    语法:4 F+ `6 r2 q2 t) h: y1 S4 C' S2 h

    ( \& g  f# l8 {8 B  uapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    6 W0 i" i! i$ `1 y, @  l) x1
    ! S; h% r3 v; B. e参数详解:- l6 A0 O0 u8 m2 W) o2 A

    / C+ [& P* L5 D1 v* J) bdf: pandas模块中的数据帧,DataFrame形式的数据;
    5 R% g, y. L' F2 H$ b% I/ }min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; _7 J8 B7 n2 P: r/ ]( P- E" Y
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。7 a+ J$ P4 j8 ?8 ?+ w
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    / G" U, R1 J" @3 }. yverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    $ ?! G/ s  d) d9 A+ K4 S% xlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。4 u+ O9 |1 ~- B5 i& n
    association_rules函数$ m) i$ `% J' b1 Y+ z/ i
    语法:; [% H' z- i; \8 y: t2 K

    * K, H, B# ~& B8 L- [; l6 G% Yassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)/ e) D% ?; `7 B& L4 R" [5 W
    15 ?/ Y* m; d' @; |9 N
    参数如下:
    ( N% ~( v' o, I0 g# @: w/ M: \6 P$ j5 y; ]8 k, k/ S4 r
    df: pandas模块中的数据帧,DataFrame形式的数据;
    0 T! a. w- j1 p5 `6 L! x# T) I5 H1 Qmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’: z3 ?4 s2 O. ~' k2 F# S
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    - e/ h, J6 w9 ~1 }' r; G6 }/ Wsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。8 l! I+ V; ]# ^$ y6 T5 F2 A
    附带metric几种参数的计算方法:4 i' f+ s9 a$ D; Y' p  j- ?
    5 P1 m) ]! Q3 s% F- t' F
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    5 ~7 i$ T5 q7 q: M7 O+ J0 {# [. w7 d0 E% Q6 b1 {6 r) z4 H
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]6 O4 S/ V* ^0 t& J+ x

    7 g/ P3 \6 H4 j, ?- U9 Glift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    : }( M3 [! T- B  u3 i4 @, N) b# K; x, s0 A  c
    leverage(A->C) = support(A->C) - support(A)*support(C),
    : Y2 |7 K6 B; ^% prange: [-1, 1]8 q' W% R1 A3 \

    # w5 x" m* e. z* k, cconviction = [1 - support(C)] / [1 - confidence(A->C)],
    7 E2 G7 @( ^/ }* Drange: [0, inf]
    7 v. K; {- t4 S, B3 B5 C5 h3 G: A0 |4 v% U5 k+ t: [
    3.实际应用案例
    3 d' X- D  J' z- f, Q! x, K以下为完整的调用实例:2 V6 M  ?* ~5 N& ]9 X
    % H& m5 [* t, ?
    import pandas as pd
    - ~. J6 g, c* [0 k  o8 B! o& ~from mlxtend.preprocessing import TransactionEncoder! q9 f5 I5 j1 i0 v9 `% z
    from mlxtend.frequent_patterns import apriori7 y: ~0 z) G* {; b% `
    from mlxtend.frequent_patterns import association_rules# f: X6 w* j) G
    #1.构建测试数据
    : w0 d, }( z5 ^+ m: adf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})% P) _  y% J+ a$ G
    df_chg=df['product_list'].str.split("-")
    2 S! p# R0 U& g' [+ [$ w; @2 \; k#2.数据预处理
    % P9 W8 }9 l1 J% j#将传入的数据转换为算法可接受的数据类型(布尔值)
    0 O% P: Y3 p" i9 Bte = TransactionEncoder()( E' S+ q2 i4 M6 C' x
    df_tf = te.fit_transform(df_chg)% \6 J7 U4 Q/ }) R! [% V: E4 M
    #为方便进行查看,生成dataframe/ U$ ]( t0 A9 ?4 J% B
    data = pd.DataFrame(df_tf,columns=te.columns_)1 ]# @$ T& c8 f
    #3.建模
    , O- h# ]9 x9 K#利用 Apriori函数,设置最小支持度为0.2- @3 G  b$ D& P$ c
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)) q0 B/ v- c. F6 `4 O* i% z
    #设置关联规则,设置最小置信度为0.15. [) B; t# x! ^4 G# M/ r, t: l
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)/ |3 o; A, y: }6 n' w+ P- V
    #4.剪枝并控制输出$ q6 n& @8 U+ `2 i+ b& c0 R! z
    #设置最小提升度,并剔除对应的数据
    ; q' W, l9 N; b4 t# Umin_lift=1" `, K2 I9 M( e3 s
    rules = temp.drop(temp[temp['lift']<min_lift].index)6 i- ]9 c7 }7 I( p3 q, i
    #筛选需要输出的列
    1 d+ h$ J9 p1 Eresult = rules[['antecedents','consequents','support','confidence','lift']]
    4 c1 g2 s3 R: N/ g9 Yresult=result.sort_values(['confidence','lift','support'],ascending=False)
    . U) ?, n! T: |) {; E- O4 D" `result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')5 z, A( T" F& L' q5 z5 |, `1 d
    & Z( X6 J5 J  M( o) j
    1% U, o  a% u0 Y0 ]
    2' X+ N+ Q! A1 k, j9 X2 z# s
    3) o4 m0 _6 ^: y, K
    49 \& F$ B% `, H2 _0 p( x
    5
    9 K( ^$ L5 M/ K+ L$ F, c6
    0 _5 k* {. n! W" X! Z! B4 F7+ m- f, x& D. t& z8 m1 o! o
    81 C5 x) e) {1 i; X
    9
    2 i- n0 J0 \  Q6 B$ E10
    / r. w4 |$ A) [/ {6 G7 G. E' G111 B) m; U) l" \) q. t
    12
      Z2 h$ f9 g+ {" s; K13
    9 O8 G/ e  U# V- ?3 f14
    0 a& I9 o' r" t: L) Z15# @7 F- a( E( |7 }: p
    163 S0 }" V# T/ W6 t( t
    17# ]+ R7 J* \' R8 |* M/ G
    187 ]# s& [' ~2 Z; i, ^% q  K9 F! k& y: [
    19- }! t3 W6 g6 D" s3 p$ @% b
    20
    & v, _: M6 T7 t$ \5 X21
    4 Y0 g' E8 a/ l; }; c# d22
    / w- [0 c/ ^8 Z' }1 X- N" y( _23+ X9 u/ W( p1 y  P
    24
    % i/ U; {9 i8 T) Q25. u1 e0 M* Y: B/ K& g
    26
    ' f7 |4 n3 s" c( B* _# z6 u输出结果见下图:
    + A$ b+ W3 l* C( a& i# U5 X7 }* V9 O1 T/ @
    ————————————————
    - y5 p. ~; O2 U( E4 S2 M6 Q7 O9 Y版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ F( T2 k/ D# D! X/ b' g
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    6 t: M; X! j  f# U9 L( d9 ]# E6 [
    8 t& }* G- P" [$ ~) \- t
    3 x) `7 z+ Z9 U) A, 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-10 14:06 , Processed in 0.264031 second(s), 51 queries .

    回顶部