QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4974|回复: 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算法篇
    8 q# M" \) s$ f8 C+ R6 Q
    . L4 }0 B- g7 A% Y在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    & c$ m$ h5 Y& e+ ~: A5 y3 ^! t' S  j+ @
    1.准备工作9 q0 h, w5 Q; |0 l5 C0 S) z2 V
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    & N5 d3 Y+ q" J8 u& M
    ( L+ [6 w8 S8 x3 ?/ |# t$ spip install mlxtend( a; o3 z* z$ D3 b+ p5 N7 q
    1/ z2 z4 K2 H) y" L* A
    为方便进行过程的演示,在此构建测试数据:3 S5 P) W& J5 |& P" r

    % u3 a+ X$ Q& x( t. J* b8 U$ e  jimport pandas as pd
    ; V, ]8 w+ D$ Y" k) t! m: U9 ~  adf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})8 q) o$ Y6 l- [
    18 a9 M) `/ F& E9 _' w  L
    2
    8 y7 H( m/ [. C& |5 V测试数据截图如下:
    2 Y, V/ J3 q' E- W/ s+ O* E, y& E' \
    ! y. u' @( J2 w& M5 T& F4 Q% o
    对上述的数据进行以下处理:
    % R! Z0 v; F% M4 L' J' g/ K6 h- N# q% ^# o' f& p$ V" M
    df_chg=df['product_list'].str.split("-")# x5 f' u* u& ?+ h: p4 M
    1( F( n3 r* M$ d% P$ Y; y: O2 _7 ]
    数据处理后,结果截图如下:, P  H" \9 b3 G$ e, _
      _5 M6 x; n& t0 g
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    . h% b/ n' m( y/ ]
    . S5 Y6 D8 x7 \9 S: y1 i7 A* C2.核心函数及代码
    . k' X2 u: k" I4 R( `0 H2.1 数据预处理3 y/ v7 Y1 h' P3 _
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    3 @) ~0 v) B0 Q& Y' ?* K
    / H7 l9 t/ n3 N#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    ! K0 K* I: T6 F: [5 K9 b/ j/ xfrom mlxtend.preprocessing import TransactionEncoder& r0 a; I9 I8 I# r9 j8 l
    te = TransactionEncoder()
    . f! I: d4 T2 k7 p, _df_tf = te.fit_transform(df_chg)
    ' V( B2 g* [) b7 W3 a1 C5 h#为方便进行查看,生成dataframe; h7 X4 ?! e" b6 M$ P, p) V5 j
    data = pd.DataFrame(df_tf,columns=te.columns_)) ^  X% Z2 T; d' C
    16 b4 R1 P1 n- U- ~2 o
    2
    , Y3 @: `0 r/ s, ?9 o- O3( c) k7 O4 ~4 O: U+ x
    4
    ( w8 a& L$ f* ~4 y& v52 y3 [2 ^* _5 T% @+ m$ P- x
    6
    ; _% V; t0 @0 L1 X+ X) O运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
      o  E: g, c7 l! h* p* S: n
    - d+ `  J8 c% w- j4 u
    % U; B+ m) u% W4 X; s% O2.2 两个关键函数/ x9 d9 X5 S7 U8 u% N0 r
    apriori函数
      D; S) y( H  L0 V语法:9 A" X. f7 r. z  \  r2 @* E# M
    ) f. ?8 N, K  K( ^# F; S; C9 h4 Y0 O/ F
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)6 u6 n, ?7 V, C5 S) u
    1: T' ?, f' m- O9 d  R# D
    参数详解:/ p9 J/ v/ n' B8 H+ K+ H+ k

    0 `- r# \5 ^0 k# t/ rdf: pandas模块中的数据帧,DataFrame形式的数据;. S1 ]. v! D: ?7 Z# _/ X3 ]
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    : M4 D. o& S5 @2 O& muse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    . k- \! e/ m4 R/ T* [# y. o7 `max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    8 H" I6 k9 E9 D- Q  k1 D" Z3 r2 @verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。/ x  H6 j1 f$ W% X
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    % N0 j# o! E- n0 X& |2 uassociation_rules函数, L+ t8 ]1 f: G" S- Y- v
    语法:
    0 J( d9 L5 J* H3 @$ ^; S+ S; A7 U
    , S  H" `2 r% D" \association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)) k3 Z$ B  C5 Q" L9 @- }
    1; z) Q! ~5 }2 t* s2 e" m
    参数如下:
    # c( ~) o$ |: z8 t; m- m7 I4 q5 C) w$ d& K# P6 }- v6 ^9 S' Z
    df: pandas模块中的数据帧,DataFrame形式的数据;9 V9 ~$ s$ A  S6 m# s
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’3 H/ _( Z: p. m/ [
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。  p; I7 M9 w% `$ p  f9 W1 F
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    & c' |0 ^2 E+ W/ c0 X9 ^附带metric几种参数的计算方法:5 I- M# P3 _/ v' K  I; \0 O

    1 J  J/ [% z8 k' ksupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    8 j; T1 s+ u0 q: m, a
    % A: K5 |+ h$ @, F4 W3 |9 m5 `confidence(A->C) = support(A∩C) / support(A), range: [0, 1]. ]1 I" {. _3 @" u3 ~

    & r) Z" M( S9 |) a7 P7 Flift(A->C) = confidence(A->C) / support(C), range: [0, inf]! C- M  }  z* I6 b  K
    7 ~& Q  G" H% m- U% v
    leverage(A->C) = support(A->C) - support(A)*support(C),
    ; b; @: D2 O6 [range: [-1, 1]
    * {6 ?& V. C' G$ X' t6 a8 H8 M
    7 H4 r6 e" R5 T, I' Nconviction = [1 - support(C)] / [1 - confidence(A->C)],
    0 A) w8 K; C2 x' J9 s! ?$ a+ Qrange: [0, inf]
    " O# q; C& l/ \/ I# e
    ) ~6 [# D: k- ]( s* @3.实际应用案例9 R# @0 Y. {+ y, L7 Q6 ^
    以下为完整的调用实例:+ z# F4 q" g$ r4 {+ J, [" r' n  v

    8 z; J( j' Y9 |  R8 Q- cimport pandas as pd
    + J) h, R  V$ k# N4 |6 a* d0 @from mlxtend.preprocessing import TransactionEncoder
    0 K+ Y3 L6 t! s% pfrom mlxtend.frequent_patterns import apriori6 u: G# r4 L9 j% `: z. E" f
    from mlxtend.frequent_patterns import association_rules
    6 k% s9 c! B# V* ^#1.构建测试数据
    8 T5 X' O/ r1 ]! zdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})' y5 Z! q1 K5 A; r! p# k
    df_chg=df['product_list'].str.split("-")
    + N: y7 ]1 L" q! ~/ Y#2.数据预处理4 d2 X7 m0 o5 g8 w# W
    #将传入的数据转换为算法可接受的数据类型(布尔值)3 D  e1 n/ @% E
    te = TransactionEncoder()/ ^4 f  _* B$ C
    df_tf = te.fit_transform(df_chg)
    ! j3 O5 B  l! E! v$ V) x#为方便进行查看,生成dataframe
    0 a, l. k. s' l$ W$ F1 hdata = pd.DataFrame(df_tf,columns=te.columns_)6 O+ k1 w1 M, g. x
    #3.建模2 g7 Q% O$ T" F8 {# m
    #利用 Apriori函数,设置最小支持度为0.2
    " ]/ f- E3 P' N/ B. ^- Sfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    % ?( V+ x4 I- c#设置关联规则,设置最小置信度为0.157 Q( h3 m% q# F+ X' x
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    # R7 b% H; c. K4 Y$ u. J/ ~7 M#4.剪枝并控制输出, q$ h7 K& b0 E; F- @4 p" A
    #设置最小提升度,并剔除对应的数据8 d; R$ ?( e$ {  z0 G% m8 u# A
    min_lift=12 f: z9 W- T" X+ Y
    rules = temp.drop(temp[temp['lift']<min_lift].index)' d. u2 Z2 m, S" [/ x5 J4 z
    #筛选需要输出的列
    . \( U6 e5 E2 h6 Jresult = rules[['antecedents','consequents','support','confidence','lift']]# u/ e! A) r3 T: l
    result=result.sort_values(['confidence','lift','support'],ascending=False)
    8 K: ^. v: }7 tresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    8 |6 z2 d7 \3 E* G9 @0 K
    5 X% S+ ~2 l7 D$ e- _, t1
    3 [' z' b! W- \7 c* x1 Q8 S2
    # C% D, A. d0 ?3 c3$ Q" |/ o. ~9 E: c) o) C
    4- K' R) n- k, h6 L) o; n1 n, [
    51 t* l) s: r7 x) k
    67 Z( L' G# {! Z8 j+ |2 O
    7
    / e* O: T* m' E+ K* H0 ^  u2 e8; V( U  a8 M! H/ l+ [
    9
    : b4 G& r* T! {% z2 w10; |) Q" a7 e6 ^8 ^3 t" B* [
    11
    $ L. p6 T6 {" C/ T9 x* T" K0 _12: p$ [7 o& }8 Y0 z2 y2 u, i8 j
    13
    + B9 U+ n3 Y, A1 ~14
    ; P& ~9 t" b( `4 n. s15. c- D6 Y' M1 y; z- m6 X
    166 j; ?* n* B+ g5 ]6 l
    17
    - Y: G) p0 r/ n# T' D. V18
    ( Y) c2 n5 p4 V1 d19; j9 Y9 a! T, ^/ s; V/ c# }7 p
    20
    4 o" c* a8 _+ o; r, K# H21
    6 B! z; g2 t! x( c22
    ' P9 u6 ?- D" u" S& X23
    & ]1 ]% B. d, f24( W3 o. v  a) Z# T; |
    254 z4 G8 R4 Z0 ]7 k0 q3 t
    26
    7 g9 t# Q: `( H$ y8 p5 c# `: G输出结果见下图:
    0 Q7 I7 `% w0 w! k9 X! m" R) C' k
    # N3 }5 u" I& C* N" s. s————————————————  ~; g& e% G' c
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& h2 R2 X7 X% A4 _. ?. ?5 m
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    5 L$ i4 I& q& G( C9 y# a: C+ g1 @$ }* u0 _! _& [
    0 h$ O- N- D" I/ v! L9 u" }
    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 18:36 , Processed in 0.405935 second(s), 51 queries .

    回顶部