QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1945|回复: 0
打印 上一主题 下一主题

[其他资源] 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • 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算法篇* i; ~4 n: u& Y& Z- ~1 P

    9 `( d6 \3 w9 f在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。. {: Y# b# T8 ^) @  b, @
    * ^* @5 o8 Z2 w: ~2 M$ P! _7 s
    1.准备工作
    + q  d! G% t  g( o( r6 J如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:0 _% @7 j# B5 n1 a9 Q

    6 E3 z# e: j' j  M8 |* r" Dpip install mlxtend
    5 N; m2 L/ U* {( g1
    5 c( _$ Q* u! P1 y) Y, G* b为方便进行过程的演示,在此构建测试数据:) O# [& m+ X4 x
    ) \/ n1 b0 Q9 D" T- l7 X) g
    import pandas as pd- w! j5 ~0 E2 o- {9 Y3 @
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    - E0 G( M8 z9 A1
    / y; }5 M9 t* s0 _; _2. g+ v& c! f& O  h, x
    测试数据截图如下:/ C6 C- R- x' k& w
    $ k5 a( `# X! n- X" I4 z/ v

    & E; Z& ^$ O7 _) L: x* T  l! Z对上述的数据进行以下处理:) o6 C! ~9 K4 p1 M

    ) R% R5 O. Q8 ~df_chg=df['product_list'].str.split("-")
    : r! h- u  `+ w+ u. U1
    ( l7 H8 t% {6 Y2 \" }8 O数据处理后,结果截图如下:
    6 h7 ?/ `, i; w$ z8 w5 u' I' l
    3 ^) L# V  o# R8 S; w; o截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。! e6 F! ?8 W' Z1 e1 a
    0 z, m* T4 M6 l3 x$ l
    2.核心函数及代码
    # U2 f" v* ~4 e( z2.1 数据预处理
    + V# H+ k- x. w! J# n对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
    $ Q7 A- C3 ~: m: N/ v" Q- u$ X  A. s& z& b
    #1.将传入的数据转换为算法可接受的数据类型(布尔值)0 |) b; j/ u# J- q  w- R7 G9 Y
    from mlxtend.preprocessing import TransactionEncoder
    " C" ~% H5 m5 y, q3 K' rte = TransactionEncoder()
    3 r' ^1 I# J8 ^/ V9 L8 k# bdf_tf = te.fit_transform(df_chg)
    & s$ D! O) W- `0 o/ ]9 K8 B#为方便进行查看,生成dataframe
    , k$ @' k9 [2 C; {/ v3 qdata = pd.DataFrame(df_tf,columns=te.columns_)
      s5 [, D- b: ^) F1* a! ^: g0 t& ~7 h) y
    2' d% j: ^* d, q1 l2 f
    3
    . @$ {8 F0 E; ~8 U% s, r  \42 @' z" I+ O+ o' o# ~
    5
    % s: b) ]% @* j6% ~( t( r$ L7 k; x$ K
    运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:- j6 S8 e. I, {" i) G* Q2 d
    ) z- v# ^% v: U' g8 u! W! F& e! J
    9 M+ b$ \! F0 t2 c9 P" F
    2.2 两个关键函数
    8 W) T7 Z/ g7 x" M+ uapriori函数  }! E: D0 B0 c" V* _4 X; ~' h
    语法:3 \2 s2 V( ~8 |% W2 [
    3 ]1 V* Z7 P, j, Y% b- e: {
    apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)/ Z2 H# I. R4 y8 a# V7 X) h  _1 k
    1
    ( N% U* w- ]8 v7 l$ ^& W: F8 z参数详解:
    4 Q: l9 l  I1 l9 i8 ]# a$ |# g/ C7 W4 }5 Q. ?7 P* ~' Z- H  f
    df: pandas模块中的数据帧,DataFrame形式的数据;+ Q/ C" H8 ~9 p
    min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。/ d$ d) H+ J7 |" r3 n
    use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。5 `% ~  i! K5 t* F9 v7 d
    max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
    2 K3 W3 R0 R! I7 U9 Averbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。$ Q# V, G6 G& B8 n
    low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。# S" L' B; X3 V7 b5 J- ]
    association_rules函数& e' m4 j0 p& L! j6 D/ |
    语法:2 H" d6 y- G( k% y6 v

    , [0 I& s1 R- X9 C5 w! i3 Fassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)7 [* e7 }/ u. W8 k* U
    1" i' p% K2 S3 C( n
    参数如下:$ C) ]/ N5 u0 W: E6 E0 C

    0 _4 _7 ^# |6 Kdf: pandas模块中的数据帧,DataFrame形式的数据;7 k# g7 V$ p+ P- T; ?' B. S8 [% r
    metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
    " ^4 p1 U) L' Z4 }6 ~# ymin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。: }1 Q# _1 ]% ~$ {5 V
    support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。# \8 L: e0 k8 {- _, C/ \) R
    附带metric几种参数的计算方法:
    - o  q* X) \# E4 u5 Z% t- G/ E. v; h8 N) y2 {
    support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
    / f; w  [2 l; c# B5 S! |/ `! v- [: f4 }! e
    confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
    2 |8 m8 W) p+ k
    - K: h; R7 e. P  l  Alift(A->C) = confidence(A->C) / support(C), range: [0, inf]# T4 }& K, a$ U2 o/ @
    7 @9 _" F- {5 @" K5 ~) H: X, |
    leverage(A->C) = support(A->C) - support(A)*support(C),
    7 X' D" p. E% V  Rrange: [-1, 1]3 h3 Z  g) ]1 P
    . i! S5 B6 Z  F$ w
    conviction = [1 - support(C)] / [1 - confidence(A->C)],
    & I3 D* U" }$ ~1 n: lrange: [0, inf]
    , {. A+ L& x' L7 Z+ [# N9 K1 E" p# y9 R  L' J6 m' ?! M
    3.实际应用案例, c8 k! r2 Q3 |
    以下为完整的调用实例:
    . U& c: q. X$ A) m
    : X. ^9 F: y- F) X2 |import pandas as pd
    0 p3 |! b1 k( D+ i1 ~from mlxtend.preprocessing import TransactionEncoder* j" {0 f8 l9 |
    from mlxtend.frequent_patterns import apriori
    : D3 a4 z. X& j: }from mlxtend.frequent_patterns import association_rules# G0 M4 c! n: E1 y. \/ \$ W
    #1.构建测试数据1 I& f+ z7 u1 |! K
    df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
    5 s/ B9 E2 Z) I9 b+ vdf_chg=df['product_list'].str.split("-")
    # o% l. r, ]9 B$ F$ `: L#2.数据预处理" }' D; _% F! I/ o# k1 M
    #将传入的数据转换为算法可接受的数据类型(布尔值)
    $ |: H9 M. g6 ]/ s1 n* vte = TransactionEncoder()5 S( t1 q$ k. b5 N
    df_tf = te.fit_transform(df_chg)/ {) P* P5 e( e9 E1 [
    #为方便进行查看,生成dataframe9 r# Y* H" q; i) F& f
    data = pd.DataFrame(df_tf,columns=te.columns_)
    $ a  k( \2 a8 D! ?# |. I#3.建模( q8 ]$ H- a2 u
    #利用 Apriori函数,设置最小支持度为0.2
    $ f& ]( H4 ~8 R4 gfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)' F! q' f& D! V/ j+ u  u
    #设置关联规则,设置最小置信度为0.15
    ' p* O+ D- c, t$ G: B3 P9 }' \. r! Z& rtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)$ ]# v* P( V* O5 u. A1 {$ M" b
    #4.剪枝并控制输出0 b5 k8 S, b9 i/ j, j4 A& E' Y
    #设置最小提升度,并剔除对应的数据+ O5 b; Q3 V) Y% P6 H8 z# w
    min_lift=1
    ; x- [3 \3 G8 [. @  grules = temp.drop(temp[temp['lift']<min_lift].index)
    % I$ A% @" ~( h2 X) U) [" ]#筛选需要输出的列
    , W# r/ V. B8 I+ jresult = rules[['antecedents','consequents','support','confidence','lift']]
    5 v# O( W) w6 n4 V" \' u$ r2 ~result=result.sort_values(['confidence','lift','support'],ascending=False)* v, Z) ]" p. X1 b& y
    result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')2 d+ Z) r. t) r4 K- G! l

    " C! z: g) E& H17 f. ^' N% e* K& n, _- T3 n
    2: |- [, I/ N& h8 b+ f
    3
    9 r" _8 G- m3 n# P# y4
    # J' K) V- F: B9 X% E2 d& O5
    % m+ t8 A8 a) I+ i3 Q4 b6
    7 I7 V6 F; w. X7( r& @% S& H' [6 S4 J- V. o
    8
    8 i2 h1 q& h: G/ k1 {5 V# W" z9$ t1 [8 O3 f( K1 k
    10/ h" M5 m3 h  o# S! Z+ o( x
    11/ V9 I4 V4 N  A, c1 [1 Y! `# T
    126 Z: I( m8 h) y! b- h, @
    13
    % j% y$ s- |% g: l# c$ ?141 V8 r' o. K# O8 C1 g
    158 O, Y/ v( L. V) R7 |
    16
    3 {9 s9 G+ q! Q# M2 y17
    1 e& R& F  \' s& f& c/ B18
    : r0 [) s& r! K: r19  x: F; E* _: t# T6 T$ Z, k- N
    20
    2 D9 q6 f) t/ N; l9 z0 L7 M- p. Y21
    8 M# p& |( A) f5 F7 _22( s9 }) Y" W- R9 U
    238 |- S+ w9 f& R: n2 ^' y* {7 U, y, V
    24- K! }7 d$ O+ O/ Y
    25$ T5 m, ]  d' P! r" Y
    26" I$ q; n- [- }) z# o, d
    输出结果见下图:
    4 @* I+ e' ?- j- R  S# c0 ]
    8 J& A1 J; ?8 e8 J' n* Z————————————————
    1 T; D9 X3 N( q' U% s+ B& s: @版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " P# M7 `# M) Z原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759" w; g! C6 w. z# z$ e# ^

    / k  c3 N  d; r* u( x6 O0 j! Q5 q
    , M+ Q" M% [/ U; `; D: Q, F2 n
    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, 2024-5-13 06:33 , Processed in 0.414709 second(s), 51 queries .

    回顶部