QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4818|回复: 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算法篇
    - u1 K6 T6 g" a% C0 _& q% J9 f
    ) J8 t8 |6 R9 v/ D! v  X1 b8 v: C在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    3 x$ G" q/ E* }+ k$ q- S
    8 d$ X$ U) }/ [$ c; E9 U/ D1.准备工作- G" [7 Y0 w0 g6 H# {
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:1 p+ n; n* U( g2 D9 w$ R% }8 T: V& I
    # I+ @  D! q, b! C* c3 N) ^
    pip install mlxtend
    + [9 M: u, \4 Z3 T4 }7 m1
    " _. E& ?6 S& e& M- T2 c为方便进行过程的演示,在此构建测试数据:7 ?$ W9 y; R! T2 T. k9 p
    ; |3 h; b5 ~9 B3 I. Q( a
    import pandas as pd( z7 b6 L( O& p) H# i( }. l
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    " Z, C5 f" G2 q9 o$ a: W1 f1, j0 n- K& F6 L+ d2 u! D  A  _
    2
    * E/ D( X& {( D* J& e7 O测试数据截图如下:5 G5 h: ?4 Y( F: Z. r

    9 T0 F& c/ t' ]: U% J0 B  g  c, _. Z4 u
    对上述的数据进行以下处理:- h6 x  y/ y9 C. G1 X: Q2 r

    - A. J, ^; Q; ]' W; b/ Gdf_chg=df['product_list'].str.split("-")' \# y- @: O7 W( p
    14 @1 M7 O# g! n& e
    数据处理后,结果截图如下:
    * u  m6 B& J. G2 E3 n' F: x  ~
    ! u; s9 z8 N: s截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    & U; y- q, p0 t$ s
    % M3 g% f$ n6 E2.核心函数及代码4 h( O- w+ a, o+ K" P; G, b
    2.1 数据预处理) w6 Y8 Z' S5 g* K3 Z* E
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    ' U( R# D* C, C. e
    ) ?# p. L' ?) j% q" r9 M; F+ a# ?: e- r#1.将传入的数据转换为算法可接受的数据类型(布尔值)+ z2 e! ]7 x0 }# b0 \$ W
    from mlxtend.preprocessing import TransactionEncoder! [/ {* G  A2 L! M- b% L0 C
    te = TransactionEncoder()
    * r$ @1 B! e9 t  }: U$ p. idf_tf = te.fit_transform(df_chg)8 h, ?: h1 q: W. l
    #为方便进行查看,生成dataframe7 ]( Y7 H6 R8 `2 e1 Y
    data = pd.DataFrame(df_tf,columns=te.columns_)& e- f* T" ~; d7 T5 Q* h: j4 W
    1
    ! ?* f; L8 C2 C9 I& o/ ^* g) r25 |  j4 ^5 X% u" m2 n% Y
    3
    . g1 w9 F' r2 D2 M% `5 ~( ]4) x, b0 K6 I* ^0 ^, `. e0 _
    5" ^8 @0 n2 r% y
    60 Z) o# n4 n$ a3 l& r& I
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:. \! D4 E. m7 ?; V+ J- {- x
    ! ~( e& q; D. @) A
    5 B8 j, s6 c8 S6 r6 z* Y+ \
    2.2 两个关键函数
    9 T5 W8 G/ Z; M8 |apriori函数
    4 P  r) Q  z$ D, Y: G语法:
    ' o0 O* f% U# s1 R0 g4 \! |
    6 q2 }1 s7 b6 Y7 sapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    + W2 O$ S; u" l8 e) G' W1' L# R1 C1 D& P) i* w
    参数详解:4 l9 a2 S' {5 y) m$ J

    , K: @# u2 v$ B6 [" Ldf: pandas模块中的数据帧,DataFrame形式的数据;- [/ X: h  f" M7 J2 l
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    6 U( k4 A" m- w* U& d+ a5 @# K& W  euse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。" @0 T; G6 D/ Z% A7 ^9 l
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。  [. Q: [4 X; u! `3 z
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。# x( W$ q  V9 T) c  k( U6 @
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。9 l4 _" ~4 U- t6 g- W6 H
    association_rules函数$ x! |& h) S, k) ?7 M9 g! K% Q
    语法:
    9 ]" X, V9 k' L  Z/ ?0 |
    2 b3 m$ n4 y7 z+ n+ y5 H% iassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)9 k3 v6 ]% T3 u! Y" T7 i
    1
    / Y) F0 a3 n8 j& S- Z参数如下:
    3 e  u( N6 D5 Y$ J- }2 `2 c. d4 `% i# m8 I
    df: pandas模块中的数据帧,DataFrame形式的数据;
    ' H- V: J9 N8 U9 q9 L- {3 \" h6 ametric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’* {( J- ^: J$ ]9 U/ T2 p9 e& Z
    min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    4 n; Q  q$ W& I4 t+ {& M# Gsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    # M' B$ R& ]( ?  a% p附带metric几种参数的计算方法:
    8 A  X9 x2 G3 x5 t/ U5 M9 n2 i
    / g- A# M* p6 q  {1 g. w. \support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]! @1 {9 U  l9 X! O$ _

    ) e0 e2 s5 H" N  wconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]/ H% ^- K& c7 ?: L6 @  b8 X' K

    , q7 [  I5 j! ?4 A, `9 Y6 m1 z4 Flift(A->C) = confidence(A->C) / support(C), range: [0, inf]! M9 F4 K& U  C6 r  [, W: A7 z

    * r0 ]& B8 I, Mleverage(A->C) = support(A->C) - support(A)*support(C),
    3 K7 s3 C  r' q9 f) _. e8 Krange: [-1, 1]
    / j; @1 K6 a" w# u' ]& h, V% x8 f# _2 [
    conviction = [1 - support(C)] / [1 - confidence(A->C)],) H; C& R7 J8 p. w+ H% c
    range: [0, inf]( z! u! s4 K# t$ f9 ?! Z

      ?0 r* F: n0 t$ i0 ?# {3.实际应用案例% k* j/ n$ `2 O7 G! U1 z, B( N, W7 K
    以下为完整的调用实例:
    ! f) u8 D; u4 P' g, C# G
      M6 @8 h( n, [import pandas as pd
    % E: q. Z' ~  J& E+ h" yfrom mlxtend.preprocessing import TransactionEncoder' U& L( t, Y7 ~: h
    from mlxtend.frequent_patterns import apriori
    3 B4 O4 p; V9 E$ A) o- {4 T+ qfrom mlxtend.frequent_patterns import association_rules
    2 t+ h" r8 R# ^8 ^#1.构建测试数据4 c2 \, z1 r+ D: b
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})" f0 N) R% g2 N+ _
    df_chg=df['product_list'].str.split("-")
    + q  h# p4 U' ]4 n#2.数据预处理4 z( E+ X- B9 s% L
    #将传入的数据转换为算法可接受的数据类型(布尔值)) q( q; [( \) _7 D8 A' s
    te = TransactionEncoder()  ^* N5 ?4 Z. S' q9 ~+ y
    df_tf = te.fit_transform(df_chg)
    9 O$ c7 c# v9 W' j#为方便进行查看,生成dataframe
    " e( R" L' S+ }$ U1 rdata = pd.DataFrame(df_tf,columns=te.columns_)
    ( ^4 n9 B2 D0 y# G- r# U1 n#3.建模
    ! L7 k0 u* m" U, A/ E8 Z#利用 Apriori函数,设置最小支持度为0.23 J, T- S. p' F/ A
    frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)" I5 t) L6 v0 C
    #设置关联规则,设置最小置信度为0.15+ c$ A5 ]( }' V$ q7 R
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)0 Y* n: o: M8 r" f
    #4.剪枝并控制输出2 |' i7 w! a" B& w; Y
    #设置最小提升度,并剔除对应的数据
    / I. n7 f( e9 L9 S; \& |min_lift=1
    , j& H) l1 y3 c4 yrules = temp.drop(temp[temp['lift']<min_lift].index). y0 v/ i0 ?9 B  _
    #筛选需要输出的列6 o" V4 N6 C, L/ \( Q% x* F
    result = rules[['antecedents','consequents','support','confidence','lift']]& ]1 `: i; C8 o% b0 c0 Z
    result=result.sort_values(['confidence','lift','support'],ascending=False): _3 k4 r% I: n/ c7 R7 {+ m4 W% m
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    + [; ^* Q# u2 \* S) @6 x4 d: L; P# Y0 L6 R; J3 G# y
    1
    ! E# |# ]; O- {5 Q# t% ]" V3 C0 `2$ p1 i2 k9 p% j3 _- q# o7 L3 ~2 a
    3, B3 o/ Q; {: c5 x* L4 Y4 Z
    41 e! N7 \7 e8 f! v6 N) N1 z0 z
    54 _+ G# z1 ~, b1 K" y
    6
    - D$ N6 D; L' V! A7
    0 F4 o8 G& ]# L- b* O8' n, q; z0 p) Z5 l) j4 J
    9
    6 F* }- n; a  d5 }2 y10
    5 P9 J3 R' F3 V8 \# P8 }11
    2 K2 _* Q+ D+ b9 _" V7 h12: }. l7 @, P$ c1 ?4 P
    13
    4 f5 [. l& l9 R! o14
    0 q( j0 T% y1 }15
    5 f. c( c  s1 {' a5 A16
    8 O% O3 a0 A' f* V; ]) k" ?& R( b3 L17
    3 P" f* [- ]9 H: I! w% y9 Y: H18
    . @4 }# ?8 g9 p19* ]$ ^2 Z4 l1 X; @
    20
    * u) o6 b6 {3 m( }% N- k. R21
    # w0 y% {5 C% S. R% I, p22) @3 J9 F# i8 s1 ^
    23
    + |2 {5 I% P4 N! x6 V248 D4 V$ H0 _9 @4 g
    25
    / m9 s; }+ l4 w* j+ \26
    & u; ?* V/ R2 S8 X输出结果见下图:0 j9 r5 }; O" U; l) X4 o' |
    ) l2 B0 Q. T! h% |3 n" L
    ————————————————+ j0 t1 h' X% l
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    0 [* X! p" h" J原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    3 B7 e' X5 W; P. N, @, y/ f" H' d9 @* o* t8 J  g9 N5 i
    + w3 D! C5 D5 r0 ]9 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, 2025-12-28 03:30 , Processed in 0.798507 second(s), 50 queries .

    回顶部