QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4168|回复: 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算法篇
    ) K5 {" I% z) l% j* u
    1 @) z) f6 c# D4 I% C在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。' J7 f8 _: u4 F
    - Z3 G% I; J3 ~; M. I1 y1 f: I
    1.准备工作3 l3 u7 @+ y+ ?; Z* |3 A* d4 Q9 L
    如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:( W0 K, Z& }' ]! |% p" i0 K# v

    & v/ Y4 X' u+ Bpip install mlxtend
    ! b0 z9 b9 I( q2 l8 Z  D1/ [+ L; `0 J  Z
    为方便进行过程的演示,在此构建测试数据:
    % H& f( J9 q7 k/ G! K7 p# K$ d8 |% L, P# ]6 ?) T: T
    import pandas as pd
    9 O5 j# D5 |& e4 G" jdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}): B5 X: }7 E8 _% m
    1
    5 x" q/ I+ v. l; Q8 N2& {& w4 {% q  _: [& E& F2 A
    测试数据截图如下:6 M- e: r$ ?" d5 q+ t- F
    7 P6 g9 n1 w$ D" B( r3 I

    . M$ e; ?7 [  ]对上述的数据进行以下处理:$ S* G- r3 \: U: d

    0 F  P  ?' S% C: e/ A1 \, i' k( Ldf_chg=df['product_list'].str.split("-")
    7 F( C' J3 y) X4 K1
    % q  I8 U' t$ {. ?数据处理后,结果截图如下:
    , ~) o+ F5 I' l' @6 }" k. r8 g% p- k. X
    截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。# ^6 e$ b4 |8 a( j, l3 A! k
    $ B* h- Y3 A% W9 n( F* R+ ]) v+ p
    2.核心函数及代码
    * f( n3 Z. e# ?( C+ k4 W: `9 c2.1 数据预处理/ R) j+ g, B- }# \! H
    对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    % M4 m5 c6 z, l8 U( @+ A/ F1 r3 f0 N; X3 S& o2 ^0 m
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)% h3 m0 Q- u6 ^/ c$ Z# l! }2 f
    from mlxtend.preprocessing import TransactionEncoder9 h8 x8 J  m3 ?
    te = TransactionEncoder()
    * @# B% F+ n3 o2 {, zdf_tf = te.fit_transform(df_chg)! c* X+ y! m9 w  E( F1 Y( \
    #为方便进行查看,生成dataframe
    7 v3 l" Z- L: y3 ]( r; {: n3 `data = pd.DataFrame(df_tf,columns=te.columns_)
    % T, l2 o! G" O5 ?1 t; _1
    4 q/ U9 C+ ^% P" e5 ]28 A7 g9 C: s1 n5 _) Y& ?: l
    3
    % f$ v0 ?* Q7 c4$ A, ~& l0 x6 ]
    5
    3 I( ^( _$ m6 G6  P+ }4 X3 i4 \& r: W& |3 L
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 ?0 E$ z5 {2 l, O7 C+ i
    . ^' ^. ?; U6 f" t# s- `
    * c7 u. F$ V2 b7 f" ~- h' w: p
    2.2 两个关键函数1 y7 M( k8 O9 l4 \4 A# ^- ~6 B
    apriori函数4 r7 `2 Q" h1 p& a3 R4 G
    语法:4 B( \6 n2 s0 ~, G7 O; X7 U" R4 X
    / N+ a4 ?, e* v9 [  S
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
    3 g5 T, h; c- p& ~1
    5 }- Z$ E9 O. S9 d/ a参数详解:
    ( {! {+ z' D1 D1 G1 {& O0 \8 O4 T  E, f
    df: pandas模块中的数据帧,DataFrame形式的数据;
    : n5 c1 j5 ]  Wmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。$ N) n' {- C* o/ \
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
    $ Q9 U6 T- [0 N7 e/ _# dmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。1 w3 z3 @  x& N, b
    verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。( Q, t( k1 |! `: p6 b
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
    6 ^: V) I3 l' H  L/ u, s: w- o7 l( rassociation_rules函数
    " e* ~- Q( Y* y! ]' _- O语法:: i2 ^* w) x9 @

    # V; _3 v8 _" o' nassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)7 B/ C7 v3 h( i
    1
    " H$ _0 d# x( z- {参数如下:% @/ j  U5 K4 L7 a# [6 r. D1 a

    ( p7 h% v6 y6 S5 }df: pandas模块中的数据帧,DataFrame形式的数据;8 T  M4 n- j- _! l
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    ) K4 Z8 u3 H  p0 c9 t6 Mmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。- \# G2 S5 a% q- r3 d
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。/ E: w% @) R# y6 a
    附带metric几种参数的计算方法:
    8 ?. X5 r8 I4 M6 |1 r  T, Z3 ]4 Y
    : f+ q7 Z% E& ^support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]8 S* J8 u8 J# r5 Y. M* O) m
    . G. K6 Y. j+ z, \5 u* O' B
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    * p( y" M3 L! u  L! R2 p! Z$ [( q1 c) w" `) P$ c$ J0 ?7 W9 J/ M( \
    lift(A->C) = confidence(A->C) / support(C), range: [0, inf]( g) x' F5 v4 j3 y4 R
    ) T3 A; u- T' j% S- M6 s
    leverage(A->C) = support(A->C) - support(A)*support(C),
    # i/ b" |$ n7 jrange: [-1, 1]
    , b, D6 @$ p( d8 I7 I' W& y8 j+ W- i% k, d- h
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    " R! E* z) c- O% B! k# S7 t1 r) z' k6 Lrange: [0, inf]2 B# y3 `5 I4 I! ~9 o& @

    + Q0 h5 ~/ ~! g# x" b3.实际应用案例$ C. O2 R2 e6 Z" J' g8 J4 x  s
    以下为完整的调用实例:
    6 g  f' T4 ~; x: k7 S! Q2 w
    ' S+ ]& e, g% T: H5 \+ Y' Himport pandas as pd$ q/ i6 h+ H0 {7 \1 U4 f
    from mlxtend.preprocessing import TransactionEncoder
    " J  H" i0 q  b4 ~5 {from mlxtend.frequent_patterns import apriori/ V( u9 @, I# G( P. M/ E
    from mlxtend.frequent_patterns import association_rules
    9 M$ N$ Z- E# @#1.构建测试数据7 L+ }% |7 y# d+ Q/ I& Y  n, U( }
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    # d0 _' u2 L# O5 L) _' n8 {0 ]df_chg=df['product_list'].str.split("-")7 S0 q/ i! i. g9 l1 H+ F* E& K
    #2.数据预处理
    ( r! B5 c+ s- j, i& N- `5 G#将传入的数据转换为算法可接受的数据类型(布尔值)
    / X3 J- ?" P" c" h6 q7 pte = TransactionEncoder()
      [5 `6 c( g( i( Z  Bdf_tf = te.fit_transform(df_chg)# B$ o8 I* a1 g/ `/ V
    #为方便进行查看,生成dataframe9 w. [8 `! M, Y1 [8 F
    data = pd.DataFrame(df_tf,columns=te.columns_)
    # h: ?, v8 u& m$ e#3.建模
    ; N' N  b" @' B( c5 f$ ~#利用 Apriori函数,设置最小支持度为0.2
    ( Z# O+ V% m/ C9 d. f( e; w% a) @) efrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
    3 ~& _7 a/ `# `  f* Q#设置关联规则,设置最小置信度为0.153 b- v4 I5 `: D  [4 z# D/ S
    temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)9 i' ~4 i- |9 ]# P6 o; f- V' L# v" X
    #4.剪枝并控制输出* D3 X3 Q9 {/ V
    #设置最小提升度,并剔除对应的数据% j! P5 \/ J0 l9 W
    min_lift=1% [4 b- V! I5 Y/ Z; f/ p# }$ n7 A
    rules = temp.drop(temp[temp['lift']<min_lift].index)% L$ ^" X2 }8 T& B! b5 b$ j) {
    #筛选需要输出的列
    7 P3 p1 a. w: w; M' t$ gresult = rules[['antecedents','consequents','support','confidence','lift']]/ V, v7 m* U- X# L2 X+ ^" q  E
    result=result.sort_values(['confidence','lift','support'],ascending=False)0 U, b# G2 D7 o1 ]2 ?; ]: ]
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
    3 z( O6 ~( C! y! n5 e9 Q
    1 {6 f! N1 m9 p1 P6 Y  D1
    ) I7 u: K$ t2 |% a$ O9 \, M9 J2
    ' V% Y; `8 k. ^$ B3
    / y- w- k7 a/ Q  i1 B8 ~0 P4
    / [5 G- O. Q* T7 b5 h! ?5
    8 Z: k5 l9 V' l7 s9 {( D6
    3 B1 V, ]9 s$ w2 ?4 \' ]7
    2 l4 \% I4 S( _# H8 t8
    / X  ~  S; h) }9
    1 ~) F2 ^) Y8 a8 ~; l& B104 C0 v+ @  S( h8 |) A$ k, |: ~1 H% W
    11
    2 u: \' ?: o$ S12# J1 H0 C* u# s# `
    13
    % V3 I0 ]$ Q" V# L" q9 S3 }149 X9 w+ B: T: |- w
    15: |5 o( b- r2 w  B, ^4 x$ ]
    16
    7 i/ l$ j) Z/ F# h! A2 Y$ W179 r( i; Q3 T! W1 d  v
    18
    8 o4 P  m! i6 y  b6 A1 H- d4 c19- k  F6 S1 A' ]2 p
    20
    6 v4 o9 e1 m2 ]; V# S21
    & B! }+ G& n, X3 k2 V' v' I; m* F9 D22
    + l; V% X# W0 \( H& {23
    5 u+ J" m* g3 L( A7 T24+ c9 ~+ s; q8 k" v
    25) E8 ^0 A" J! J  @  f; x
    26
    , {+ G) @) U$ g* S4 u: J* |$ P输出结果见下图:: U. t9 x& D1 k& Z" P% G
    ! P, |* m" v- i0 L
    ————————————————. Y! y. C+ K2 e, c& r/ T
    版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( Q6 n! H! }, {4 o  Z$ q8 ^. s( J原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
    5 n; O5 A5 Q, M/ C  u1 A0 ?3 S' y" I

    + ?; N& \8 _2 n5 q, |
    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-8-12 10:41 , Processed in 0.329013 second(s), 50 queries .

    回顶部