- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563356 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174230
- 相册
- 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算法篇: m) t; Z! j z6 B
5 D* d$ z( q2 O# c* |8 W& a
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
3 y5 w( L3 h& D) ?& I9 v8 J& t# L/ Y% i2 ~9 K7 ~5 J6 L8 Y& o
1.准备工作) T6 m. U* I0 g6 O
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
: Q- S0 n% c, f, a4 ~# d; I8 \2 \' b) U( [" i+ U8 x3 p5 Y/ a7 X
pip install mlxtend! M. u: Y3 }. v) ~+ n
1
$ r+ z& E3 K9 K1 b+ ~1 T. a0 [为方便进行过程的演示,在此构建测试数据:( G' f9 ?. i2 ~* y+ }0 V8 X
4 t) y' [/ F5 L% cimport pandas as pd2 Z6 G* M( w3 V" p. N
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
0 z' g* D2 H1 O1
/ l7 v( Y3 t! v/ B! b5 `8 Y22 l! q& }; @! t' j
测试数据截图如下:
- t- e3 y) Y" Q$ h" y
$ x' `: t* I9 w6 }1 T5 X. R
1 B% o% C8 [6 B ^! }对上述的数据进行以下处理:
) l5 p0 R" i& \$ s {* N' m
+ W0 R5 P: n4 N/ Tdf_chg=df['product_list'].str.split("-")
& c( u) w6 v: d5 B1" Z; D2 a( _1 m4 v: ~% s9 Z+ G
数据处理后,结果截图如下:
7 {( ^6 c; x. I+ \+ P1 M9 {: C! F$ ?; A! T& D
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。3 n6 L. u+ U+ ], n3 I" V; J: h
7 o1 |; ?- o4 A) z% V2.核心函数及代码: k: `. X1 h% @/ X7 P
2.1 数据预处理, y7 ^; k* O% R* o# L
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
F6 o" t8 h8 I" Z3 H! R
; T- R- O, w# u; w0 x1 A#1.将传入的数据转换为算法可接受的数据类型(布尔值)
' L* c X: k3 ]+ Sfrom mlxtend.preprocessing import TransactionEncoder
4 p6 ~" V6 X, d. k4 Z6 ?te = TransactionEncoder()" c6 L: X: |- M0 _, |1 R0 k
df_tf = te.fit_transform(df_chg); p: [: P! P( u% [9 N
#为方便进行查看,生成dataframe
1 f: b, R; m' m* ndata = pd.DataFrame(df_tf,columns=te.columns_)
# o/ D6 N: {6 D! Q4 }1# v5 g+ N- a \, @3 p
21 x' `% a$ t! ]" }0 e% h, l
3
) {6 m) n y- @8 Q' D4/ i0 G) m3 N: j* S
5, l! K$ ]7 j$ X( H7 }7 q1 u
6
/ I1 g: r/ b5 R" h运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
4 u- G5 v1 I. W# M' p/ Z9 h, ]
. }: F2 K) T2 X: @1 y; t
. O# K9 K: i- K2.2 两个关键函数
) [" n! Z6 b7 S! k3 v( U9 qapriori函数9 g6 H( h0 m! D& R0 `, C
语法:6 X5 b. A) l! O- }* D
' y k, l/ B% n- |8 vapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
8 T$ }! h; y& [9 \( q% g! h6 y1# M1 z A, \8 \( h+ x
参数详解:! y. m7 G' H! r3 H9 W0 a
- O) k7 _7 G4 }! `8 W( z- D- jdf: pandas模块中的数据帧,DataFrame形式的数据;/ P% T( w! j+ B' g) r* U/ k
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
2 s6 h1 k+ I3 }use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。6 m/ P6 I* {; Z6 O) b
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
3 }, @( ^) ~ ^' ^verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
& \7 x; ]: m& S+ o$ Zlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。, ]+ t/ x- `! l# R* L
association_rules函数9 O, ^# _4 { T, Y- H6 n3 l* x
语法:
) h' W& ^/ m) v% N
" r% o9 S$ P; V x; Jassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
! K2 f. a& c, P: z9 b1
; q2 S7 } ]4 j* A" t参数如下:) @& W) _) O- F7 [
! @, P* T& z' Odf: pandas模块中的数据帧,DataFrame形式的数据;
4 |7 b3 O0 W9 k! M% x( Fmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’- x& F& D Q7 {
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。2 t$ a' j- L1 Z! B
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
1 y5 [* K! S- \/ r* f& g7 d附带metric几种参数的计算方法:
$ M1 D+ z$ H0 f$ ~5 O' T# G( |, `
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1], a. n( S# m, Z/ W0 m- ~
- A6 W& E- |3 ^- x# S$ z8 O
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]4 K+ W# N9 ]$ A6 b3 J
+ w5 ~% i$ t0 \% J% Ilift(A->C) = confidence(A->C) / support(C), range: [0, inf]
. d; R9 Z# H% J5 C- Q* L, k5 @ m% a% y6 y5 w, l) p" `- P
leverage(A->C) = support(A->C) - support(A)*support(C),* Y9 F! x; F. [2 a3 O5 ? O/ E
range: [-1, 1] i4 i; h) n2 D" V% v: A( g& r% |
0 U) J4 H" N; Kconviction = [1 - support(C)] / [1 - confidence(A->C)],! L) J* q9 U6 |4 N/ |
range: [0, inf]" C, w4 X9 J3 D1 }- c6 Z
+ K; l' h4 q5 T/ ]1 J4 g. ^$ A
3.实际应用案例: ]% ?/ p1 r' T- J+ \3 H
以下为完整的调用实例:! E) H: @* z! d: M+ S F C" \
9 A8 @; W. k' a2 z( Eimport pandas as pd
( S2 ?7 I4 f+ pfrom mlxtend.preprocessing import TransactionEncoder
) q# ]+ r/ t$ h N4 D+ M8 Tfrom mlxtend.frequent_patterns import apriori
& X# N$ {4 y" y6 I0 F$ y" g! M' mfrom mlxtend.frequent_patterns import association_rules# l9 \0 X7 N# d! o( `& }
#1.构建测试数据6 R v) d: s. Z; Q0 s
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
v, x' Z3 {) wdf_chg=df['product_list'].str.split("-")6 B; v0 S, t) T5 N+ r1 W3 U5 ?
#2.数据预处理/ v$ m$ F: i8 b* u
#将传入的数据转换为算法可接受的数据类型(布尔值)+ R( {+ G/ u" r/ W0 V, L* A' p( V
te = TransactionEncoder()
0 k* Q+ M3 L: N+ `# j$ }% _df_tf = te.fit_transform(df_chg)
! e$ R! Q5 l/ V6 B8 E; T#为方便进行查看,生成dataframe
" V. @: ?# E xdata = pd.DataFrame(df_tf,columns=te.columns_)! Z" Q& f& y$ [4 x9 ?& o
#3.建模
0 ]9 _/ d8 R- G6 b! ?; w: m#利用 Apriori函数,设置最小支持度为0.2
# u: A# C6 b9 D' U% x4 w4 Wfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
" s) L& U- q1 m4 a- ^#设置关联规则,设置最小置信度为0.15
9 k: A, {7 ^! r etemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)& x" e/ l% @* D6 a* I
#4.剪枝并控制输出
1 G% k6 [% |8 e. X$ z- h( o#设置最小提升度,并剔除对应的数据+ @8 w$ ^2 N$ ~; d8 c3 K
min_lift=18 l0 x: e* f( G
rules = temp.drop(temp[temp['lift']<min_lift].index)
% q: R% P) \7 q) T/ `#筛选需要输出的列
, M* h+ A. s' {% ^3 y3 j) J3 Aresult = rules[['antecedents','consequents','support','confidence','lift']]* f% f8 d! L# X5 Z Y+ E
result=result.sort_values(['confidence','lift','support'],ascending=False)$ H# x3 M1 ]7 y) Z
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
6 M( E& `2 J4 H+ \
+ W+ R5 L* g- ?4 q2 |1+ u- I, b2 E$ S* Z
2
* {+ k- o) X, M- X6 I* O3
; q1 O' |2 g @7 F$ [4
, p5 y7 }& L( E) U/ @# v59 ]3 M7 ~( p B1 K/ ~8 I8 T7 y6 g
63 g: ~: l$ }6 z. Y
7$ L$ d9 B; S/ {* y; c
8% q0 a8 @+ j$ w1 b' [* C
9: Q+ o( ^+ g- M* P% G+ l- }1 P
10
, \- |7 ?% w9 Z115 T( d7 @5 V+ @2 n o, A
125 S! R$ \: k2 ?# U6 V) W& z
13! R# R' P, |* c0 ^+ H6 d5 N3 P! ?
14; \, H4 f$ a0 o E9 [9 ^" P; E
156 C( O3 t0 }# O8 A
16' H! c4 ^( C }' L
17
! Z( a1 z9 B7 a3 n, ~181 s- {& P* i' c# ]0 H0 K! K
19' l+ V, `% C5 r# t; _# t
20
3 Y& `& h4 c) [21# U/ V0 B$ Z" b! r* j
22/ v( b4 }# l0 L- W9 B4 Z8 H
23
" D! Z# s V. Z6 o/ R8 v' L24; W1 \7 b4 ^% Y. [. E, k3 d! ]$ v4 E
25& _, E4 A* s" n% Q
26
9 r) i6 G- l. k& P输出结果见下图:$ A" [0 I% G# N! `5 I' [; l
$ g& p/ b1 N7 \( e) L————————————————# U- q# u8 Q* c3 k! k2 h7 W
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。; d) g9 H3 A5 U8 I. x) O) `
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
. v7 n2 c, o7 z( j9 I* h0 v' _4 Z
- S K; T c8 ]% G0 y+ I$ ?
|
zan
|