- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563327 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174221
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇* B$ {: R3 Q4 v5 r, |" T" M
7 X8 \5 m" f1 Z$ h6 [2 W; r4 z在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
1 z1 \. _1 N( X P6 p8 l- g, g: ]3 ^. J
1.准备工作% D# g* E. J/ D3 B% F3 F) @
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
$ j: R6 b. G) ?( d; X: Z# X% a( o! ~
pip install mlxtend- d6 H3 u; I2 [/ h+ Z( T
1+ T* g k0 ?& z7 |% R+ x, U5 V
为方便进行过程的演示,在此构建测试数据: M/ k& o) }1 b" a8 _5 H
; E0 }4 f2 k5 L. Qimport pandas as pd
1 j2 p$ p! T9 _( zdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
6 n5 h! e* h ]1 m/ g, d9 R1* w) U: o' P' _6 C: G. d
2
+ h( {( G+ L1 O% G _3 o, m9 n测试数据截图如下:9 V B+ p2 n' a7 H6 g, d
+ }1 |( \7 T2 A8 R0 R" a" ^& n: b
7 d9 {( C: Z2 m* E对上述的数据进行以下处理:
! J" R+ S$ }# a+ [4 E& }) Y0 X1 n% C7 J
df_chg=df['product_list'].str.split("-")7 r N t* ~0 n
1
$ u O2 I6 Y" y6 c9 b8 ?数据处理后,结果截图如下: F2 h1 f6 r% C# ?' o* c+ a
) \# z+ v5 |0 h7 @5 Q: y+ v7 B截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。! ?. C9 Q- Z! x: e- b( a' e2 p' z5 h
. N9 d9 I. W: w2 K2 ^, o9 c) Y8 ?* P
2.核心函数及代码
( D6 E7 Y4 _0 O( s2.1 数据预处理5 W* k% P8 O7 M) B
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
4 T: i$ F, R$ y" a" _9 M' z4 p. I
% `$ Y& }0 V1 k#1.将传入的数据转换为算法可接受的数据类型(布尔值) n$ o% @! r- p% P
from mlxtend.preprocessing import TransactionEncoder+ e7 ^, k$ r# ]7 O# x/ \7 A7 W
te = TransactionEncoder(). M( K' S6 z* J f6 [
df_tf = te.fit_transform(df_chg)3 Z1 r/ Y" w2 ]0 Q1 ?
#为方便进行查看,生成dataframe
7 W( X; h' |: { o1 n! Edata = pd.DataFrame(df_tf,columns=te.columns_)
1 Y% _; Y( F0 E) j1' ?6 g. H. }9 M! T1 h' e' h
2
* z- [" T1 ~7 ^' G2 j3
, d' n& S2 C4 c2 w4
. X" N; F# q' }8 F59 U9 H/ R" y! v6 P5 Q
6
0 F6 w& m3 [5 s: [: |8 \2 q$ X运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:$ U1 N- T7 Q5 @6 h
! C0 f0 @& H3 {) v' d5 e" e M, p
: c. j8 I7 ?4 ^& t# }. d/ D
2.2 两个关键函数. w s5 j W5 T+ X X
apriori函数8 I6 ?: T/ x- T! h) o; `6 R. o' N7 U
语法:2 d3 s" Z, u K3 x; l% ?
- s- D5 c W1 `$ E. x8 O$ U1 O7 v
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)& ?$ l8 o) h7 Y& I* C
1
$ L$ D: f& { n# }* t3 t参数详解:
& v3 i; b, ]+ k1 v- u0 n! v0 {2 Z7 L6 i' J+ B
df: pandas模块中的数据帧,DataFrame形式的数据;: C. w( E0 b* f: o
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; t/ i% Z( _) d4 y/ t0 }
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。- i7 j6 ?- R. {
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。* L+ j% E) F c# Z
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
( e7 }: ?- h6 g( Y Z7 @: rlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。" X+ o# [9 A( _1 r, H: z
association_rules函数% ~+ s5 e( L) G: n" @/ e
语法:! h. \, }. Q$ Y. p
6 ]0 R& ]) O: c* m
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)/ c! h3 f( I8 ?# j B% N3 Q- c
1: h4 p% m% ~* x, f/ ]
参数如下:
* t/ a* }0 C9 G2 O8 x& `- E8 I8 `2 P4 ?, @
df: pandas模块中的数据帧,DataFrame形式的数据;
* {( R! w. _! G0 {* i, a. [5 R$ mmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
" q7 I: ^; P% h# z5 K2 O+ T Xmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。, h$ ? S' m0 O' M
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
w5 p3 V$ X, Z. k+ T# J: j附带metric几种参数的计算方法:
+ p+ f( t5 I4 ]! G+ \! n" _" j
* s8 E1 w1 [8 d4 r8 v1 d4 nsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]& l2 v6 ^8 r4 U- l) M3 A& T* X% S- u, b
) Y% ]; \$ S! n$ oconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
+ r5 H1 W0 K& x" ~) X. c
- ~7 F" Q' N+ g, blift(A->C) = confidence(A->C) / support(C), range: [0, inf]
* T8 W2 c1 p* C
: Y% ]2 R" ~* w& Yleverage(A->C) = support(A->C) - support(A)*support(C),
4 b/ R U$ S7 w2 |! Nrange: [-1, 1]8 o1 U& i U5 P: X$ h
9 c1 d$ E8 F9 L5 J2 ?) e* Zconviction = [1 - support(C)] / [1 - confidence(A->C)],
4 t/ ^4 C. `( `range: [0, inf]4 p$ G4 L, r- i ?& O% O7 K, A
5 S0 R. P1 x% Y
3.实际应用案例
/ ^; K: l3 k/ t8 ]# a" K, Q以下为完整的调用实例:
) a/ Q; p2 I) J" L- I3 o% _' ?; P3 T. g
. J1 C) A8 C" N2 v% P6 \- @8 Q2 v0 Vimport pandas as pd9 o8 P8 C8 [2 N* M, ]
from mlxtend.preprocessing import TransactionEncoder
" p3 j9 J* R% n1 J F7 k' Ofrom mlxtend.frequent_patterns import apriori
2 q! J& b j. V5 Ifrom mlxtend.frequent_patterns import association_rules& j) t3 E* Y& ^- |
#1.构建测试数据8 V& ?! S0 U" `* H$ Y* h3 J4 f
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* f* r, Z6 e3 S8 Z, _# y
df_chg=df['product_list'].str.split("-")2 u3 L2 }9 y& a+ j8 Z
#2.数据预处理
2 B, ^4 M1 X6 J. H( V. P. q3 Z#将传入的数据转换为算法可接受的数据类型(布尔值)
4 N8 e8 @+ F9 k& K- b$ b( rte = TransactionEncoder()
! C2 r2 o4 p, t8 ]df_tf = te.fit_transform(df_chg)
* x% r' D% Y7 t7 h( v$ r#为方便进行查看,生成dataframe8 D: o- [( Q1 n0 q. `- }0 f% U
data = pd.DataFrame(df_tf,columns=te.columns_)( v9 i( K* X. J- b2 |* u5 k( i
#3.建模
. U% }8 g6 y( i#利用 Apriori函数,设置最小支持度为0.2# ^. X2 g6 i" ?5 m4 z, c* F
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
" ^, ]- j* T& A3 r, r/ y* t#设置关联规则,设置最小置信度为0.15! n0 F0 P% K% f% m- q/ f- B- l8 |
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
: ?7 c1 C7 X, c1 O4 P#4.剪枝并控制输出5 `: f2 ?! T# ^) S& B2 G" J/ e3 N( W7 j
#设置最小提升度,并剔除对应的数据
7 M" W/ S7 a: s, j$ @+ i/ W7 Bmin_lift=1+ g1 n0 s+ L- A
rules = temp.drop(temp[temp['lift']<min_lift].index)! ^. u' u4 P% o# K, G+ j4 _5 m
#筛选需要输出的列
" q2 s) k( x) m2 O- d& Kresult = rules[['antecedents','consequents','support','confidence','lift']]
6 U9 f7 Y# k7 Q: j/ X4 g( d* ?5 mresult=result.sort_values(['confidence','lift','support'],ascending=False)9 p' ]0 D# }/ v$ m8 w0 q; b
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
E+ @1 v/ v, C ~; [0 J; w8 \" P$ J& c: R( ~3 g8 I* Z
1
- q: T) ~0 K# t" A1 I/ F! i2
7 O& l, ~8 d* M39 l& D @# i# C% J5 v" s
46 o! N$ c# N! ~$ `* U; ~
5+ e8 e% f8 G( H' Y' g9 W2 ]: S6 g
6, }# ]9 V+ M9 Z$ l) T% m; r: H
7
5 l0 i8 `) H/ W' x, j85 o3 F* J3 j$ E1 s
9
! l$ L; p+ B( B* A8 c- ^10
V5 p& ?% E8 ]7 |- O8 a11
+ d& o# M& _0 \1 K+ z12/ X2 x3 x% K3 i( r6 i' ~% d
13
; g) K% Y& Z% A* ?14: a' S @/ D( w; F. Y2 ^: B
15, r3 l/ m7 m5 i$ z
16) w& Z1 d" E% |0 f
17
0 } g& F' F( @18
- z( G$ V4 R4 i8 L19
e: P- q0 R/ B. t+ j e5 e: ]9 z/ @5 H20
+ s) |: v4 d% E$ e8 a j, G8 c5 P215 `% w9 P$ A9 G
22
% S5 j# f1 r4 n/ a* c# ]4 V9 y, Z23- t- _" N+ R" `8 Z, ^
24% N3 V t6 m: y
251 ]* i$ |3 v% s+ Z4 w% Q
26
5 Q, ~, E) O& k2 \) v5 d$ Q输出结果见下图:1 q# C$ [. T3 d6 _: ^- |* r
2 H0 F% B; H! _2 I6 L- o
————————————————
# l }0 w, b9 L5 W; q8 d0 \版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# w( D' a# N1 V- R# ^* S
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
% r, G% M0 ]. }0 k1 V
! o4 s- V3 \2 m. \5 }9 H. s4 B
. p' p/ Y+ b: h3 B0 a |
zan
|