- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558194 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172831
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
1 Z7 t% _. L, H0 s# ~. L0 A7 {. D0 E2 k+ C; P
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
: P1 E' b4 l: c, r) M! c7 E1 g% F' o0 @% B
1.准备工作
) p8 I8 q& L% m2 f1 N如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
- }+ S( f( D! A
0 ^. M7 Z5 n# i; S0 C9 y7 D' spip install mlxtend
( U0 r' v" t6 @5 ^' f6 v; l( b1
7 S5 V+ Q1 e8 E" }/ ~为方便进行过程的演示,在此构建测试数据:/ [3 \- m, d6 U/ R, N0 ^4 k
0 K( f0 |1 @6 h |8 Ximport pandas as pd5 n @) Q- U- l6 ^5 v, ]2 O- e4 M
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}): B3 ~" ~+ k! Y( v. q
1
# b& O* P0 A$ K2 ^2
7 D/ l# [! p8 n0 z$ h8 e4 l' q% S测试数据截图如下:) m' i1 E6 F) F. a
4 s* ~- }/ t! n: _# \9 R; Q! m
* B( Q* K, }$ k8 M5 T i3 A8 V' R对上述的数据进行以下处理:7 o7 n$ w/ w0 {. W
$ A- N O2 F! C1 R7 n0 j4 Z
df_chg=df['product_list'].str.split("-")
m' g3 P9 q/ x- k8 f+ I5 L7 A$ d& U1+ b7 v3 E5 [7 N2 i- o( E1 Z
数据处理后,结果截图如下:( i+ r1 F# I; g* E( Z- o! D" J! s! `
0 C$ J- ?- g G: M2 Q) \3 |截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。# V% Q; g' L3 r+ b' s
5 j2 ^( L) i- P% b+ o3 e
2.核心函数及代码, c$ p/ S$ E0 o
2.1 数据预处理2 {: k; t/ J2 h6 g) R. Y, s: Q4 g7 \% c
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:3 k. j6 f" G, A( W% u* y5 `% X
. b. ~3 w' _, u' D& m0 S#1.将传入的数据转换为算法可接受的数据类型(布尔值). o6 i2 B! X6 |8 d5 s6 m
from mlxtend.preprocessing import TransactionEncoder7 r% g9 u! m0 U) [# x; q! D% C
te = TransactionEncoder()3 t9 Q8 \$ r, B
df_tf = te.fit_transform(df_chg)" Y. R n3 ?- A! S' g2 @
#为方便进行查看,生成dataframe* t- O- w. `- R8 b5 I+ d
data = pd.DataFrame(df_tf,columns=te.columns_)( X( @6 a! P2 I! b
10 T5 _, \# t# ^
22 C+ Z, j* ~- I7 z4 d0 z
3
) ?8 L! S; H6 ?% |3 g+ [4
7 `. R7 ~3 H# N: a9 v0 d5( R/ D& S l& w! n2 o
6- W2 m5 \* W( A6 b/ @- j, s0 R
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
* B- L' z! u8 t9 l! L8 R. ?9 \0 B( G) a3 f& N3 J: `
# B+ S6 R0 W( H. K r% u
2.2 两个关键函数1 w0 w2 Q1 K* q2 Y
apriori函数# g* V, `- o) v1 m- \! Y) w0 I* U8 t
语法:
5 Y0 z+ e$ H5 @
* ]' L- W W3 W2 qapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)( f) s% x0 p9 m8 r+ n N
1% z( O/ A- ^+ `$ m5 c, s
参数详解:
$ s( Y" {* z' u1 d+ d7 U4 W5 L( t, ~9 v6 H) P- X
df: pandas模块中的数据帧,DataFrame形式的数据;) C: P$ c! ^& }: o5 s, u
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。2 \$ I8 H; j# f7 X9 b1 ~: W# r
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
$ c7 W& T, G+ M' g' K7 I- R wmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
. r" Z% ]/ A& jverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。; x* x: A( T" t9 a
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。# v- W) Y7 r& [% K
association_rules函数
6 X) p& W3 ?2 k) Z. m( \语法:3 ^2 d: F6 O( ]8 n: D' G
# r" }, A7 I! A, ^! ?2 c" s
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
7 y5 L, H; `/ u% a5 S1
5 a& ?* R, ]! q0 k( {参数如下:
# g8 Z2 D9 G# y3 m& K e$ ]$ _& i
df: pandas模块中的数据帧,DataFrame形式的数据;
0 [' i5 a) }4 j( H1 wmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
0 ^' M) s0 e, t) m+ F! umin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
* Y& ^" l) X1 q1 C" hsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
" D9 D, n, z0 l: v. V! q附带metric几种参数的计算方法:
4 `' D, d6 D" a, X
. X# B+ c5 o6 z9 D% A0 q! M" n! U, esupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
0 [: F8 Y; J' ~8 D& t: o( a
w9 e9 f7 D5 _* Y6 Oconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]: H0 i D% _+ J6 R
9 _. V( m% |" Q- {8 flift(A->C) = confidence(A->C) / support(C), range: [0, inf]
! F' e2 \- N9 h' z. @! |* x2 h$ x$ t% m0 S
leverage(A->C) = support(A->C) - support(A)*support(C),
0 a* [4 {4 [$ f; k' G$ C2 Crange: [-1, 1]
$ o% Q' H' T$ h" P0 r4 G6 K6 ^# O7 q5 h# N& `# Y
conviction = [1 - support(C)] / [1 - confidence(A->C)],
- Y" W4 {$ D& e* S$ B [range: [0, inf]
5 B+ a# P# y0 W! v" G, r* f7 l& e' N7 l6 r
3.实际应用案例: [% i( e% z6 Z* S8 K& |
以下为完整的调用实例:# n2 L0 A a8 ?/ X$ t
3 H& A3 b% p5 c* P/ dimport pandas as pd
% d0 U0 ?5 \% |9 B# P r& Hfrom mlxtend.preprocessing import TransactionEncoder
5 Q, W$ _3 y k* Ifrom mlxtend.frequent_patterns import apriori
) H5 t1 j ]+ p* Qfrom mlxtend.frequent_patterns import association_rules
* F. l/ T3 i* j3 L( L#1.构建测试数据) W. s a/ ~3 J
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
/ @6 c" J# K }" K7 Gdf_chg=df['product_list'].str.split("-"); U$ ?* j8 w6 E0 |0 b+ T2 C
#2.数据预处理
+ p! J; T. y4 Y7 ? f#将传入的数据转换为算法可接受的数据类型(布尔值). X" I2 {+ L+ G' K @
te = TransactionEncoder()
8 f( b* |" F: cdf_tf = te.fit_transform(df_chg)
( ?- D3 ^- T" {' L) l#为方便进行查看,生成dataframe3 o+ c5 Z# i* I$ a; Y5 R# q) K
data = pd.DataFrame(df_tf,columns=te.columns_)+ l6 a, y- p( v: S0 I
#3.建模8 `4 H9 B# B8 }+ s. {. u e1 N6 s
#利用 Apriori函数,设置最小支持度为0.2
L% f% n0 a* d L; hfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
+ f" Q5 C6 z1 T/ ?4 r#设置关联规则,设置最小置信度为0.15
# r* R$ J; [ C- o$ itemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
7 v5 X$ v% K$ s#4.剪枝并控制输出 H3 n' t0 Q+ T- m; ]" ^ g
#设置最小提升度,并剔除对应的数据
: G' i$ H! L; U" ~- c7 `5 J0 z/ I- Rmin_lift=1( L# w2 A$ Y+ x/ M
rules = temp.drop(temp[temp['lift']<min_lift].index)8 i$ V* G+ w* i5 c$ `8 D0 a$ m# M' O
#筛选需要输出的列) o6 c' a( r$ J; i* G" w. }
result = rules[['antecedents','consequents','support','confidence','lift']], C1 G6 _; J- G. e' v0 W, t4 U
result=result.sort_values(['confidence','lift','support'],ascending=False)
% A- \# d; L2 ~/ T5 Y* x: P* H2 ~result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')+ X! v N" `$ I- M/ r& C5 K: `
: A: ]: l$ @! l1 }) n1 D) n1
, R3 q- [# g/ Q5 \, w# k- b21 \. e5 d5 ]% K5 H: H' j
3
* N m: E z; D/ M4
0 {7 O0 T* m* R5 r$ _5
+ J2 C9 S# c1 j3 X6/ y/ a, j* F4 z
7& A4 c7 ~+ R% b7 `. {
8
/ y2 q' [+ j2 {9 t3 x. L9
2 c& u% j, L- r# n# o, F10
% i/ y# O9 ?4 W) [8 f3 e11* [* K- _2 Q! w0 f
12) x1 L3 c+ x$ P A: o# }& `+ |; p
13 ~* w- X2 d" `
14+ s$ u0 E2 b- E+ S1 m% {
15: z0 d; d- z. `. V' r
16
9 t0 q* E d% t5 u/ Z17
4 R7 F+ R. y2 h) u" Z181 {2 t1 E* a" |0 G$ S' N- p
19
' v6 T; C0 d4 {! l20
: s9 R" l1 z, U3 m* C- r! z( @. I21
V6 P6 B) V. p4 @# @* \8 B- s22
, u" b- b) B6 \* |0 u. G C: ]23
8 j7 R/ F2 M) g/ V/ B& ~24: @# H9 K& C4 `( D7 B2 ^) L
25
+ B4 _0 I, L0 B9 b/ k- {1 O261 M# H- z# j3 x- d n+ o+ w" R
输出结果见下图:! O, e5 e' v7 O4 j, l; u& j3 v
; x3 P6 ^. D/ X! l————————————————4 X" A3 B+ N( H2 s
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: G6 ~! z3 Y. u2 T5 ?. q原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207593 i/ a0 E% Q0 N* M9 M9 x
1 h5 m- P7 c5 l4 y
( c& l# ?; f& ~- x& ~
|
zan
|