QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5009|回复: 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算法篇
    ! M  m8 ], l& i4 H
    1 X/ Y: i8 z# j, A0 Z2 R在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
    3 Y7 a6 K( L6 _  Y' D9 R: q$ J; I. C
    1.准备工作
    # X3 @( w: O8 j$ x8 H& o, S8 S如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
    * U$ G  X; Q) H3 F& J; L" L
    , Z. L7 x( \+ G  q) Ppip install mlxtend0 Y) j" m. f2 H
    1
    5 k; j! O( b' ?1 l0 g为方便进行过程的演示,在此构建测试数据:" i" m& }9 R8 z, \
    : g% |0 y' _5 K; w3 D
    import pandas as pd' }+ F; N0 A' Q, k
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    3 p% b% _( s0 P. Y1) P& H: t9 g3 `  b7 c
    2
      ?6 g" {5 n% P+ P7 c, k测试数据截图如下:  R& J: }, T% i4 q, |
    % M3 D" ]. k8 p1 E' r4 g6 d
    ' P. l6 V8 {1 {
    对上述的数据进行以下处理:% l7 V2 m/ |" ]

    . D, }0 s1 R$ i- l- ~* V3 S& ~% ~6 \df_chg=df['product_list'].str.split("-")
    ( |( t0 u: D4 U5 {# H5 A4 F1
    : z5 T9 z+ H  T1 l数据处理后,结果截图如下:
    9 Y5 p* G5 E- W$ e6 {8 g- }$ Q
    , H/ B$ t8 _. I. N. Y) y截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
    / W& w9 K3 k* B1 j/ f; U; x/ I7 F6 M- N2 }0 ~; l. E7 R/ c
    2.核心函数及代码2 O' s" Z, R/ B3 A! m
    2.1 数据预处理
    $ V# F' a6 H% b% J1 D对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    ) P0 A! G4 s, Q/ |* [
    9 \% e% a2 R. u+ [! m: n, u#1.将传入的数据转换为算法可接受的数据类型(布尔值)
    / ?2 C$ p8 e" j2 t: l  ?from mlxtend.preprocessing import TransactionEncoder
    & I1 G* _" S) ?! j% S& D4 kte = TransactionEncoder()
      }; O  t7 P9 L+ R7 P4 Ldf_tf = te.fit_transform(df_chg)
    : S) n& M9 p6 ~* r#为方便进行查看,生成dataframe
    % o% I* F$ `# e* w- Ydata = pd.DataFrame(df_tf,columns=te.columns_): T/ Z' P5 Z7 F
    18 Q4 s: }1 g( `! y  L. d0 b$ X
    22 t1 k, M( E- f) u
    3
    - H5 n; U6 b2 L4 J% C& q4
    * s; O: ?& Q5 E! }9 W6 d' s5
    4 I( [+ |4 \4 J0 ]1 V8 x6
    9 i  D' K# p0 q" r* o( d1 B; p运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:3 X) K! K  W  e5 c, ?/ i6 n
    2 P  U. J+ F) l/ B0 A) [! S( C$ r, F
    " j+ X$ k% Y0 V
    2.2 两个关键函数/ `' v2 F" r9 h6 M* g- \
    apriori函数
    ' t4 ~8 z% P1 ~# M; L7 L语法:
    / }& j: v8 T1 H; R1 k: S: P4 T  x$ p- Q4 t
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    , W5 C/ Y7 v  I5 ^8 D& Z% v, M' @1$ a4 r& y; }. R$ D+ |6 O# |
    参数详解:
    - T  ^. L8 |% L) U. @8 F: e. B7 v9 [2 D
    df: pandas模块中的数据帧,DataFrame形式的数据;0 q0 y; o0 v8 E4 O, R( c5 }+ s. A
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
    4 C0 N" k4 w' _2 quse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    2 l" t7 r' N, U$ {max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。) ^1 a* j2 A2 O" x
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
    : Z1 R# p8 Q  q: Flow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    6 f% E5 d' e! P  Cassociation_rules函数' E9 k% J! A/ M7 d) e# }1 R1 R
    语法:5 ?$ @0 H- e5 m
    - i+ @/ ^- a9 L
    association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
      O6 K9 ~) X' L, k1 ?) ]1
    5 {: @2 f& z% q) n% j/ _) l6 o参数如下:
    1 u% H- \6 J0 [; {# ~
    ' I. _0 M% ]* ?) E$ udf: pandas模块中的数据帧,DataFrame形式的数据;0 D" V3 h' G) G% m8 v
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    4 l- N; z& Q; `1 e( p( ^min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
    + U& L. O  n& E- [) r8 xsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
    . v0 t( O. L9 ^3 I' t附带metric几种参数的计算方法:9 l1 |: A5 q9 k3 b, f$ F

    4 J  i) b# q* `' o. hsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    ( n* o9 ]2 d4 U0 Y
    : C4 D2 |* Z9 g4 ~8 econfidence(A->C) = support(A∩C) / support(A), range: [0, 1]5 b* `: z4 a" u) V* m+ p9 n5 l

    3 V' x. M4 a* ^1 Ulift(A->C) = confidence(A->C) / support(C), range: [0, inf]
    + w" h% u; k9 I$ g& Z) F, L, X+ y
    . _& L" b( m3 q8 H: Tleverage(A->C) = support(A->C) - support(A)*support(C),: J9 l1 n7 P5 f3 E5 B
    range: [-1, 1]
    . ~4 Q( s4 @6 g$ s. L- ]( ~: W* L
    / a/ C8 c- p6 g( fconviction = [1 - support(C)] / [1 - confidence(A->C)],1 v7 M$ z. {4 |- l( ]
    range: [0, inf]& }3 ?( S' w) A9 M( t6 G, f

    - U9 Y2 B$ Y# z3.实际应用案例( U" P, r: f7 e
    以下为完整的调用实例:7 x( X6 x) p1 ?8 e% {2 S
    8 e7 |2 Y6 |  W% w
    import pandas as pd$ Z  R3 G, L: }  I
    from mlxtend.preprocessing import TransactionEncoder' l+ f9 g# l* W4 X6 O
    from mlxtend.frequent_patterns import apriori9 x: U# ^9 ^" X
    from mlxtend.frequent_patterns import association_rules$ G7 d1 Q9 y8 B* N$ s) X
    #1.构建测试数据) y5 l) y6 m$ l4 ^) O
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})4 V1 B7 i1 Q3 ?) w) B& |8 D! b+ j/ v
    df_chg=df['product_list'].str.split("-")( t* \/ s, J/ Z0 J+ V
    #2.数据预处理' Q/ ]! q  \( T2 N3 [
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    - l9 v6 p# E5 H8 s/ pte = TransactionEncoder()+ j$ u$ B! P* G
    df_tf = te.fit_transform(df_chg)6 T- w& f& N0 s8 @" s
    #为方便进行查看,生成dataframe! r3 M$ ?% I+ i+ i# U
    data = pd.DataFrame(df_tf,columns=te.columns_)
    / @  k" c& o8 f+ H#3.建模1 R" ]' n% r* d* z9 o3 U9 F
    #利用 Apriori函数,设置最小支持度为0.2
    , W8 P, z2 N. V- P9 k9 l2 D2 yfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    * b2 j) _! u% o- c5 V#设置关联规则,设置最小置信度为0.15% V  M& E; l8 l" T7 x& v: N
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
    5 T2 W% r  F) @( r4 S% i4 g) v#4.剪枝并控制输出
    , @/ s4 q4 |# ?' E# C# `2 x#设置最小提升度,并剔除对应的数据
    9 L6 w, @8 C1 p+ gmin_lift=1
    , G! }$ j4 @; |rules = temp.drop(temp[temp['lift']<min_lift].index)1 ]# V+ ]6 [! n! z$ k1 j
    #筛选需要输出的列* y; o; d) C6 {6 n& k- _# ]
    result = rules[['antecedents','consequents','support','confidence','lift']]
    " b4 Z0 V* G% Fresult=result.sort_values(['confidence','lift','support'],ascending=False)
    ) A9 o, T- X, Eresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    : k7 i! U" ]2 B; ^/ d) V3 r# P9 F+ z- N1 A+ v
    1, [3 G8 r" O  S: i  `2 ~
    2
    . S9 D: B6 l( M$ F3
    + h9 t4 ^/ [/ ?7 r! n  y3 S4" z- \1 T( g- H1 G- D% x  {2 O
    5- {4 {5 [6 M# m
    6
    ; M5 F6 v# P$ Y7 U+ S9 h, L: ?7
    - q# @' \2 V4 W/ i, @7 @* ~8
    5 j8 r! p" F# u' }( k1 q( t9
    : n4 v8 V$ S  F: y' k+ }' H* O' c10
      N) n, p) N! P$ k8 r: R, b11
    3 w) ?7 Q  t% M" d7 f% Q12
    1 U7 u2 Y9 @$ v1 W! l131 m  l$ ?9 V! j: N9 o0 V
    14
    : z  v' n2 h5 q4 f15
    ; R% P- \6 X2 I; g+ f16
    1 V4 Z( h6 a4 d/ ]17
    , z  `# |& p! N& }3 [9 ]7 N2 f18- O0 X9 O, s0 l5 |* J. ?
    19
    7 z: I' _! `' D) {- n207 ~# a; x. c: y  h# V# Q
    21
    ( P: W% V: z6 t223 F* j# k1 i( E3 G6 M+ Q
    23$ }9 y: J" T+ D- I
    24
    , D/ B0 D# b9 j9 L25
    " U% m  R- L. U5 n26: z( E5 a* S# K
    输出结果见下图:, ~6 }) `4 @3 x* l1 T8 [$ I# P

    . g) r7 T+ j( ^% Q/ g————————————————  F7 G3 j( c3 ?/ E7 x$ E- T, e( |
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 O8 @. D: L% k+ z# L8 b
    原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
      P" c9 ^; x: W7 t8 P* i. h# V7 m5 G- D/ u/ S

    5 N( Y9 n( q7 X' E* ~
    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-6-11 02:12 , Processed in 0.309435 second(s), 50 queries .

    回顶部