- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565621 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174909
- 相册
- 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算法篇
: v( H' h2 [5 K. s
& I, v; e, [. U9 \在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
" f! k& w. i0 g L# g. \! }6 v2 Y; E. B6 g
1.准备工作1 q* |# c0 f( G, J0 w
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
& p+ U* a2 z9 M1 r6 R$ _
" P9 s# G3 g# g8 S9 hpip install mlxtend7 {& N9 K& X! w3 N
1
8 _, N8 [. l! w6 S) W7 \$ u5 |9 j( c为方便进行过程的演示,在此构建测试数据:
, N" e5 P/ Z" `8 Q0 D' w2 ] G
, X/ B8 l8 X* n! rimport pandas as pd
3 p( W$ B' j V* Y# |9 pdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})9 A+ T3 d) [, A" R ?- `3 x
1
; L7 U A+ o3 @8 M29 Z; Z' q; S- v1 j9 C) @/ C3 [5 ^
测试数据截图如下:
9 E$ p* H* X6 u+ ], R! v* A5 L; R
! q3 {% `% K5 g3 p5 h3 Y对上述的数据进行以下处理:
; R# u C1 S+ Y* j' X& f# e& R7 v2 j. I+ {' [5 ]2 ^
df_chg=df['product_list'].str.split("-")( D/ {) l) D8 \" q/ K- r3 a
1/ c: [' c7 l( g9 P5 T
数据处理后,结果截图如下:8 w' P9 m7 }8 K0 C: J+ _7 n
! `7 }: S6 G9 p4 D: s- S截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。6 h6 p( Z7 c; Z7 ^/ C
( @7 [, ?9 Q; Z5 z0 ^; J: J# X2.核心函数及代码, ?# i5 x2 i2 _- ?
2.1 数据预处理! Z0 o% B! p% {& A
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:8 w9 Y+ H) C0 ]& D
0 v) s' T) s# ~! B' P#1.将传入的数据转换为算法可接受的数据类型(布尔值)4 W: m8 ^0 A; P& |" ?- `& R
from mlxtend.preprocessing import TransactionEncoder8 W' v( F* B: z/ r- b
te = TransactionEncoder()
* u) ^: k" \8 ~df_tf = te.fit_transform(df_chg), d8 L# W0 p( k1 G+ A
#为方便进行查看,生成dataframe: |$ X# ?' E0 _$ H- Y6 L8 z; K F0 b
data = pd.DataFrame(df_tf,columns=te.columns_)
5 A8 f$ s+ b( @6 Z12 v& n8 f, m* @, y* F
2, u) N8 M* w* s. g- f4 H/ y! ] @
3
" A8 ? m+ ?) ], X+ G4
0 v/ C2 w* i7 X& c1 U, L5, L9 F4 H5 R. [, ^4 P
6 g5 e1 r2 B9 |4 t e* t+ p* I, l
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
- B3 y% `/ [( _* H8 {2 u5 ?
1 B _% f2 E% c' w8 X
* T7 E& r7 H3 u+ x1 i3 H+ ^2.2 两个关键函数
6 b: }) O0 R$ X8 T/ ~apriori函数4 A0 U& |$ d" U: Q1 j5 ?$ `1 C
语法:" M1 G+ l; o0 `- g: y8 e
% n, o, Z# W1 I& F. eapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False): E' d w1 n& y0 I8 O% \
1. o4 u J; F; i; Y; D+ j7 R! ^9 x. ]
参数详解:6 H2 U4 B( s) l- W
. S4 {9 }6 w$ V, q$ d" q4 Cdf: pandas模块中的数据帧,DataFrame形式的数据;+ q3 {" P9 D, K! `6 Q9 L/ P1 k: \6 Q
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
3 u+ J+ {+ e6 c: q$ h, q4 _* yuse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
3 j% a6 X* v: e/ h% Tmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
: |% [% {/ l* i H% Cverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。2 ^! ?# u$ u; m* q4 P7 S
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。5 Z) c4 p0 J0 f* Q) Y8 ~' s
association_rules函数
6 y3 j0 ]) b! R6 e语法:
! \5 @" m# A$ ~: D- g" o" E r v! o
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)% J5 z3 v8 w# j+ K
1* g, d H" o5 b# M2 F# G+ c) W
参数如下:
7 i6 ]1 p! i# x& l( C# `# m" d2 R/ h2 c" `! C! K
df: pandas模块中的数据帧,DataFrame形式的数据;
) W/ a; R, ?* ]metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
& f. e, w8 Q+ u9 Gmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。$ E7 o$ A4 e- \; M1 R' s- x' _9 Y
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。5 B1 Z6 S# q" H* ^
附带metric几种参数的计算方法:
# y, ?/ M' p! d8 X
' r% U# G8 Z1 Q6 d' ~0 |0 Qsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]' J3 y( P6 y2 t1 Q& g* u# f
; T, p9 Y9 p* ^8 b
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]* e9 b1 m$ K7 A, ]6 ~1 s
- `9 `/ r3 z5 V1 E, hlift(A->C) = confidence(A->C) / support(C), range: [0, inf]
0 x$ Z. }: m& x
5 Z0 e' C) `1 C, gleverage(A->C) = support(A->C) - support(A)*support(C),- P9 X7 z: z& [0 \7 Y8 n: }: t
range: [-1, 1]
$ W9 S9 y0 ^# L1 A0 G
/ M" Z6 T8 U. S+ lconviction = [1 - support(C)] / [1 - confidence(A->C)],% F4 e, S+ | y. w# H; c( g; `* F) @
range: [0, inf]2 \0 Y7 T$ C* y
: \$ N, S# t- \. ]9 D
3.实际应用案例9 S% b# g9 v% m- M
以下为完整的调用实例:9 E$ K) [, {$ V/ r7 W
1 C$ f/ o: C; p, P9 [
import pandas as pd! b3 W. [0 X5 l/ O% M3 j8 s8 G
from mlxtend.preprocessing import TransactionEncoder8 @* b, Q- b* p. H, g
from mlxtend.frequent_patterns import apriori
$ t5 S3 {* U( i5 v8 Zfrom mlxtend.frequent_patterns import association_rules( F3 Z4 h7 L* m. e7 A' b
#1.构建测试数据
: |. I, V2 _; R% d8 `% bdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
) ]/ Q7 ?7 u0 D1 Bdf_chg=df['product_list'].str.split("-")
& X! C1 r7 L; ~$ U4 H#2.数据预处理
% n% `: I1 {) w( f+ x9 A1 z8 |#将传入的数据转换为算法可接受的数据类型(布尔值)' o5 Y/ B2 k+ e4 f( [2 ~
te = TransactionEncoder()
( V1 _3 ?+ @; E; }, Vdf_tf = te.fit_transform(df_chg). s6 M3 @( T! ~ w6 e7 E, S
#为方便进行查看,生成dataframe6 w4 i% I8 m0 x/ E% |4 u* U: {2 i
data = pd.DataFrame(df_tf,columns=te.columns_)% q# r2 m( X' g( G, l: Y: L; z
#3.建模
; f) r% q# o0 o V#利用 Apriori函数,设置最小支持度为0.2: ]! Z/ ]2 c' H, z6 q
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
5 d& Z! E2 k/ M6 ~8 _; [2 E0 C#设置关联规则,设置最小置信度为0.153 j" @, Z, a* k! R# \$ g8 W
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)' ^3 D- i; O2 l2 a
#4.剪枝并控制输出0 h& j& y2 l) T$ z, u
#设置最小提升度,并剔除对应的数据
& i( }, d) ~5 _/ rmin_lift=1
: \& {+ i1 w0 }' m. F- ^rules = temp.drop(temp[temp['lift']<min_lift].index)
6 X9 i2 D# K. t6 Z% C" ~#筛选需要输出的列5 t; _& a1 |3 X
result = rules[['antecedents','consequents','support','confidence','lift']]% z& f! v5 }3 r( B/ D
result=result.sort_values(['confidence','lift','support'],ascending=False)
) M! G: B) d1 o2 }7 Hresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
0 u5 x6 v W6 L9 w$ {+ x$ p! ?3 `0 ~) ^+ i+ ?# v# _0 R+ t# U
1
* d0 m2 ]( x- k& F1 g2( ]5 \, V& h0 R# o( m
3
6 V( Z- `& H1 k' F$ |0 ~$ K' x4
" y5 ~9 B- M4 q3 G7 O ^5' @5 C* y/ Q0 z3 H
65 K2 S, U. q) d1 T6 V
7
' y5 l0 r* n1 `( t8
) I( n4 u5 w* J* _ i Y98 M" x( u" T) K( i/ R: P4 {
10
& t8 x- z0 w8 ?2 H' {+ a11
# O l5 s9 B2 m& \/ G120 [. U' T9 z( B$ t
13+ z5 \3 _% n5 r
140 `1 c1 q) J- t
15
. F; E2 Z! P1 Z& e0 ^: x16' ?, b4 p ?: d0 L
17
: V2 [1 A+ `9 X! r& E18
' u6 j0 m5 W& X" p" F7 J19& |8 o8 R! r/ x& ]
20# u: R9 B" b. N2 V
21
; t! m6 Q8 n( N+ \22
" a; D8 u" N4 [/ z& J4 {231 g; D: \9 V3 `; F1 z; |
248 k+ |" }( W" V8 Q- i
25, u0 t! p) K& j" m" e& j
26
9 }) f2 E5 g0 z% t5 z! j0 H输出结果见下图:
1 F2 n3 x! \, n7 G1 K5 v7 ^
* L& ^5 B3 H7 g" @2 B k9 }————————————————
8 l. E& a7 B6 G: a. A$ P5 J; r版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% B+ E1 n% H: H" r _原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207593 Z0 V% y" z( j# [& n" g
) X) N8 t+ Z- M- D7 z: Z9 G p2 V
|
zan
|