在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 565645 点 威望 12 点 阅读权限 255 积分 174916 相册 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算法篇
+ ~8 a. V, b% a! l. R
% m, R( `* T- a' d+ a/ \" @ 在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。0 {- r) ]9 w. K, g
+ v4 C- h; P. g- {. U4 H 1.准备工作
( k, U, K2 @: X+ \8 O 如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
. |( R" Q* p% F* y" z8 b
, n7 C' k9 @3 x5 _7 y* W pip install mlxtend
2 \! U$ T/ a# t+ H# p, L 1" e0 [7 o& m3 R0 \" m- q. W2 [' S
为方便进行过程的演示,在此构建测试数据:6 U8 O) u n; D0 c- }: `
, }% a; y1 |8 f; g; d3 g/ b
import pandas as pd \& E1 N+ I# Q7 Y# ^& a+ a: U
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* d4 P* x* Z. ~7 Y* J/ K, Q6 |
1
" j& S3 {" a( y+ \' k 2
2 Y& |7 o s' Y/ E* p) @) f; j 测试数据截图如下:
$ x+ Q8 y6 m7 }9 S
/ L1 I" N5 d, i+ I / R; E: ^, i, b# z4 T, E" P
对上述的数据进行以下处理:' W3 P8 q; S% A0 `% h* u7 a9 n7 D, W
+ w+ a+ A# E6 W6 x. I
df_chg=df['product_list'].str.split("-")
% F5 d; R' G6 e& U) r. c8 y 1
" {% A( o5 Y7 W" v' H; h 数据处理后,结果截图如下:3 M0 N3 c$ _" T7 i9 f/ W
" _# P; ]: P5 D% p
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。0 K$ U8 n! P" s, ]
' d* Z8 [; u# } 2.核心函数及代码8 K) D U: X) ^
2.1 数据预处理6 `" K' M3 |4 b+ h6 Q( `) F
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
# t5 ^8 b+ D) r5 z& w: i
& y0 v; R; t1 v, ]7 r3 `3 r #1.将传入的数据转换为算法可接受的数据类型(布尔值)
8 t w, @9 A; w: z from mlxtend.preprocessing import TransactionEncoder2 ~) |( p3 z2 k! b' L
te = TransactionEncoder()
" n/ ~/ Z1 ~! m8 u5 X& P df_tf = te.fit_transform(df_chg)9 e, U7 P$ ]( l, Z: Q, [5 \
#为方便进行查看,生成dataframe
9 `8 h7 @5 I* h0 s data = pd.DataFrame(df_tf,columns=te.columns_)( v9 P: A. f J8 p O
1
1 }) J: X* F( D0 j' g 2
- I7 @2 ^& t% w 3. o' ]) F9 u% Q+ x) Y# S9 @
4
' h6 i1 K! D F7 O/ K 5) V& `, b! x+ L0 @
6
! y+ R* }( n* f+ S( q 运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 }* Y- Y' O0 Q6 w3 j
6 t! t, {6 H8 }1 L
# p& U& n3 Q4 S) h/ ^ 2.2 两个关键函数
8 l6 \+ f ?1 s; n apriori函数, _) c9 s b0 B+ ^" \: c- ^; I
语法:
1 q, d% }" j5 I3 Z7 n( R6 p/ Y 5 G+ N ~6 `# O6 }$ s
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)+ r! Z1 w$ ^% i5 h& X6 G5 I
1
? G" `9 r5 [9 K1 Y$ N 参数详解:1 ]- c- \1 ?2 B/ n
: x3 p+ z, p: u& t
df: pandas模块中的数据帧,DataFrame形式的数据;
. `' E# N; W S8 q5 W6 W; U min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, a a; ~& V$ B) J2 D
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
* K2 h5 v9 i/ n" e max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
" Z0 q- K B, N) q% ]0 u1 b verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。; v( u" q2 Z. s% l8 K3 n
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
1 ^. N9 f! K/ h8 v' ] association_rules函数8 ~ U2 A& Y5 s+ U$ Q2 }: \
语法:, } l$ s; L; |( f" W/ U
5 M8 {; H( }) `# }/ }2 z ~( @ association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
6 F. ^0 ?* o8 k# [/ K; L0 E 1# ]/ a! Y+ B! d) P. H# l$ D
参数如下:
1 s. v" r r9 l5 L# A
# k! w1 K' a& G$ u df: pandas模块中的数据帧,DataFrame形式的数据;6 X8 ?1 K( f: P: e# f
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’4 T! Y4 e* e( u! C
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
8 d; s( h+ d4 Z' @6 S& i support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。5 ]0 ^* m0 }" G, c& v
附带metric几种参数的计算方法:
+ V7 _+ s6 M/ q q
7 y4 q% a9 Y% z" @9 A0 d& i2 K, A support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]% F: u& p5 `+ {5 A8 O
* B1 x# l( G5 L& h+ ]2 c2 n. c( A/ K
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
, w6 [6 @' d$ ^* J, r0 ^3 l0 @ 0 A+ L( C; ?* m4 A
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
2 r: x s, }# {/ S5 z: a: G $ X3 h0 g1 g$ T1 S
leverage(A->C) = support(A->C) - support(A)*support(C),9 l, i/ p- M& e- g P2 |3 Q/ r
range: [-1, 1]
0 p, _; g: J, C. N6 O+ m5 p2 O $ g+ M) ?6 N) X
conviction = [1 - support(C)] / [1 - confidence(A->C)],
# c; p. |4 ]6 l0 l range: [0, inf]- _( i( s( C+ m4 C! g! t2 k J: B
v0 P; o1 }$ H& f7 B. V( D 3.实际应用案例
( D8 | V% g) ^# J- S: S 以下为完整的调用实例:
) D( i3 {9 }5 O( s! K% ?
' L' F% S: g3 A import pandas as pd" {6 ?) S* `5 B2 b
from mlxtend.preprocessing import TransactionEncoder, F" D: {2 S G( l1 |0 v3 f" v# M
from mlxtend.frequent_patterns import apriori1 [0 c5 P; t% `! ^1 ]: q
from mlxtend.frequent_patterns import association_rules5 R% t3 m! a) K* R) A" T
#1.构建测试数据
; X7 \/ c! }, u1 b5 P+ [% [, | df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
) F3 _9 i# X V/ s8 n df_chg=df['product_list'].str.split("-")8 y+ e8 c0 g, j) g' ~0 Y t
#2.数据预处理
# ^1 m, C6 n4 t2 W8 x7 Q& Y( m #将传入的数据转换为算法可接受的数据类型(布尔值)
5 X( Q- ] }9 ~ te = TransactionEncoder()0 W: ?6 `$ q; \0 }( V& F
df_tf = te.fit_transform(df_chg)
' |: I! d v2 j( n/ P( z9 l #为方便进行查看,生成dataframe
1 J6 @* o4 g) E# \- n/ u% s9 Z data = pd.DataFrame(df_tf,columns=te.columns_)5 u# Q' J6 {: Y0 y. O
#3.建模) y7 ^% b1 V6 P$ C+ J- U7 y" e3 P! u
#利用 Apriori函数,设置最小支持度为0.2
5 ?2 {! H" y* h6 P2 v+ H5 C$ F6 c frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True), u1 ^# O# @9 S. X9 _, C) ]2 d
#设置关联规则,设置最小置信度为0.15& H$ D' e& ?% D5 a: o1 f4 B* z
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
! c& q% {. q M$ v) X: q' T: |/ } #4.剪枝并控制输出! X( p" o/ k9 |) `/ T9 D
#设置最小提升度,并剔除对应的数据
2 B9 ^% ]! n! d# B min_lift=1
7 t: d0 X% n6 ?: k rules = temp.drop(temp[temp['lift']<min_lift].index)
. [0 a3 ?8 n; t! Q& q #筛选需要输出的列6 x3 _" |' X& R4 I: U: `/ e J
result = rules[['antecedents','consequents','support','confidence','lift']]. B1 V" V% o5 M; B) C
result=result.sort_values(['confidence','lift','support'],ascending=False)
" F0 ^7 a- h) Z result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')1 s, D, L9 U& U: r* z) e4 u5 y
% V+ m( \. ^; b0 I 1
! M3 {& X9 |7 B; d2 T 2/ o, q `. K6 N& A9 M `2 }3 ]
3
2 C% ^0 @( H$ E) H. Q N 4% t% b6 D" D4 _" C3 u
5
" F, P7 B& [ m' g. s8 K6 _; x2 `) d& q 6
% ?9 \; Z% W6 a4 ^ 74 W& M. u% S2 l2 b
8! [/ u. H) C+ R# j! T3 s
9
( _3 Z! T2 q( N+ O- i: e4 I% b: e 10
0 s* F; Y; ]. [7 C4 Y 11% x& C6 ~( ~- c7 k/ _; y; V& B
12: |2 F9 ]' e3 G, o X
13
* L( P6 ]( l3 {, P: H 14- Y X2 @0 [4 Q. T
15
0 S; S0 e0 V3 A 16+ a! ^( v E8 T4 n+ z$ B4 J
178 n9 S" I& G2 D: k5 p
18% E+ |" f- G- T3 a5 H
19
( [* _- `: @0 b" Y* n" }- Y 20
+ W" t5 b% q/ @2 n4 j7 d& r 21
; {# _. @* ?- C: r+ }8 { 22
! {" k# q# S4 w6 O. c: {' L 23, ?* V5 T6 Q7 H d" y
24
7 u; \" P( R, M! l+ o8 W4 N$ T( W* U 25
5 Q L g/ \% V: K 26
4 R9 u8 Y1 y( X4 d; _9 K7 W 输出结果见下图:
9 \1 E4 b( |3 y+ u9 z6 E# M 9 J8 H" Z) i3 c P" @
————————————————& u3 ]4 E8 a4 |! o
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。/ m; x3 a) X7 x6 W3 p7 x$ I9 E2 M% X
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759: D/ h/ e. r# r, t* l, W- N
3 U6 z2 o3 l) B7 O% u; B) H. c+ V* q ) J* E9 w* p! d. v) f
zan