- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566251 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175098
- 相册
- 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算法篇) m1 S# G" H* |# ?
- c& U9 n6 u6 w) g. G
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。+ v/ M) I$ j5 @7 X
8 W# g# q7 V: @1.准备工作
; H0 T5 K/ Q2 A' M如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
& I; e( p, r4 B1 G, [; V' R% d
pip install mlxtend; h' ~8 y( ^6 C6 y" [ N
1, j6 G# |8 a' \8 g& x2 Z+ v2 Y
为方便进行过程的演示,在此构建测试数据:+ D# r; v) U. e! T0 c1 P Q; {
$ V& m0 X5 m3 iimport pandas as pd
: U/ H. B: ~1 V5 Z/ a! J" t& Kdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
) |8 {( |" j% z% Y. T( {+ K1; Y' x5 O1 i" W6 s8 K) x
2% P* X% R8 P* d
测试数据截图如下:4 c' |3 e4 k) w0 ?/ y) @( }- U
/ @2 F8 k& q/ Y1 y% I6 ?2 F3 x
1 z, R( s1 k$ ^
对上述的数据进行以下处理:# f1 o) n W4 B! {, D- B9 k
' ]" ~! M6 v; s: kdf_chg=df['product_list'].str.split("-")
" x. w+ J5 d. R* d$ D' H \1
* o% f( z9 G2 Q; e+ E/ L数据处理后,结果截图如下:
; d0 v2 B2 M3 [4 f" k- Z9 o- e$ s
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。# L" }2 o7 F: P% N
0 V3 K$ ^# }- C. l8 w6 y6 Y
2.核心函数及代码
9 \5 `8 n1 ^, C1 P2.1 数据预处理4 E1 B! O- o' Z
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
. w& h& o) N- p) N. S0 G% s3 e* A/ W% m# `
#1.将传入的数据转换为算法可接受的数据类型(布尔值): J& Q0 e* K. N& M
from mlxtend.preprocessing import TransactionEncoder
: n* K, {1 P, l6 rte = TransactionEncoder()
$ l- D# ]' V7 w$ |7 s* zdf_tf = te.fit_transform(df_chg)
9 h) L- ^$ z" Q, o, [- b& z#为方便进行查看,生成dataframe
) B+ l& }1 x0 x0 c4 ydata = pd.DataFrame(df_tf,columns=te.columns_)$ ^" w( `0 R8 A# \& U2 B# k: U: ?
1# K& U9 h+ R3 W7 i5 D
2
: v+ @8 F- ^- W( h1 w8 J- C7 [3" [, Y6 Y8 d+ _% h
4
. D- C5 i# |/ a! w3 [52 l8 N0 b' C; \; v$ E0 [
62 u3 r# `! y/ i! I
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
& R7 t- Y1 d" r% F2 C) l: a! L+ V! X. Z
5 b4 d- B& O& X! w( T2.2 两个关键函数
4 Q$ W0 R$ \; I6 I4 |3 J! P/ r$ g+ ]apriori函数& g p' ~+ `% t2 U ` G3 s
语法:
6 P' f2 u+ r1 N8 }0 S& d
: _% [2 M( D0 M7 ]0 Sapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
7 }% X, v5 O& \; v o1' S# J) T" ?* F J. @3 H- Q2 d
参数详解:
7 H8 u$ @: a, L8 H/ b$ A R1 x" i$ j
df: pandas模块中的数据帧,DataFrame形式的数据;
5 R( x5 S. f b. _' i+ R- [6 r) e- Wmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。) Z7 y- G" O3 Y/ l* o6 G
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
: `; o3 X Q) T* _$ K0 Dmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。# A) D) f m# T V# w
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。" ?: Y' a; d0 a7 o+ r
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。8 V/ U$ R) @& c7 o- w7 V
association_rules函数$ N( K. A. Q. c3 Q/ T$ d
语法:
7 @9 ?7 a) w) D" Z& c3 `! ` [# Z6 A* [# D6 s
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
+ G4 i2 x4 E- h% X: ?1
$ {; f$ U9 u: t$ \3 y% `# o1 K6 q参数如下:, n+ _0 S. P" Y$ w0 J
$ w2 D! \( E' Q" p' T2 L7 f$ vdf: pandas模块中的数据帧,DataFrame形式的数据;
/ O2 {7 }0 ^3 n8 O) i: C$ C8 [ c; Ymetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’, \; h7 y; [: `, F; u
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。2 b9 E9 [2 n. C" L
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
4 {7 J: j( y* W" ^4 z `附带metric几种参数的计算方法:
, h5 N1 l/ c: J8 o+ C
q4 _4 F$ y, t0 G+ J1 n* `support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
1 ^, W9 q4 ^3 _; L: k& n1 s* n" n3 ]: F+ H
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]4 L. Z9 `* A& w; S' d
0 {4 d+ h- v/ s6 F9 t; g. U
lift(A->C) = confidence(A->C) / support(C), range: [0, inf], j( k! j! I0 R- M1 Q; x' m
8 B8 \4 n' l0 c- l! h, G: |8 G
leverage(A->C) = support(A->C) - support(A)*support(C),1 G9 F6 P; {' h/ c/ G
range: [-1, 1]6 p8 ?9 H2 u6 O# ?
% d+ }4 D, l; \0 N# sconviction = [1 - support(C)] / [1 - confidence(A->C)],: Z9 `* K* Q5 x
range: [0, inf]
" v; T0 X- d. Q' A% t9 z; G4 G( o/ _2 P- G
3.实际应用案例0 e& U1 B7 D- c v
以下为完整的调用实例:& }; h/ W# x, Y
& X- S1 C$ U# m y; q) _import pandas as pd' M8 g1 }" w2 p) [. l8 J: L. ?1 O
from mlxtend.preprocessing import TransactionEncoder
0 D& n' j, y2 l% e4 m. \7 e8 ^# _, Ifrom mlxtend.frequent_patterns import apriori, B) V* x4 ~* l, y' E s1 C( M
from mlxtend.frequent_patterns import association_rules+ u' s' H. X2 l( ]* u
#1.构建测试数据
+ c- |3 e) o [. a& j" bdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
, u3 b' {! \0 C" C- P" \; A7 ]df_chg=df['product_list'].str.split("-")2 r+ q9 ^0 t) W/ y. j6 G$ j
#2.数据预处理' b% R8 g4 c3 s3 [8 F5 p
#将传入的数据转换为算法可接受的数据类型(布尔值)# X9 p6 f+ ^- N$ V9 D g
te = TransactionEncoder()
* s- w+ u8 N$ u0 _' `0 S* ndf_tf = te.fit_transform(df_chg)
! n3 ~; i7 {# S! E5 @#为方便进行查看,生成dataframe
# h+ e* Y5 x7 D' L( N+ y/ Ddata = pd.DataFrame(df_tf,columns=te.columns_)
) f% p% Q; o% H5 ~ k. m1 t#3.建模0 I$ ]/ @- x& Q4 F4 N
#利用 Apriori函数,设置最小支持度为0.2
9 m* b2 y" l) b6 f) W& b* w: {+ pfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
- D/ ^: J1 t, Q- T+ d& ^( Z5 F#设置关联规则,设置最小置信度为0.154 w5 k A4 r+ h$ U+ E
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
) A8 L& c3 \, `4 y, x#4.剪枝并控制输出' F! g/ A9 S& v$ c2 q
#设置最小提升度,并剔除对应的数据
& ~/ o- C7 f4 d* {min_lift=1
7 c$ y& m$ @+ prules = temp.drop(temp[temp['lift']<min_lift].index)
, v0 U) b. |( ^2 B% B0 @/ E#筛选需要输出的列, Z2 L4 `& y: z2 t
result = rules[['antecedents','consequents','support','confidence','lift']]
# W7 n/ x& n" ~3 |result=result.sort_values(['confidence','lift','support'],ascending=False)
; F% }$ ?; Z! t1 nresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig'). m$ [4 z: H; T
- N. J+ `6 i) Y- `2 l16 f0 [# B# m5 Y" |
2
4 [( {" e( K0 k' ]1 [! G3' F0 Z; A+ C; \! F* R
4
( s( H+ D7 O' J! E8 d$ l5/ Y) s0 C# ~. n
6
) O; D4 s4 ~( ~ u6 k7
+ `) b I: p" P L: z! q86 v4 ^+ m* s1 h
9
; T5 I5 z9 J: U* W% R10
7 {( H, {7 ?$ g9 g G$ |% v- m11
9 @! e4 Y; { h( s0 i9 R6 m5 ~1 ~125 Q9 C0 q, u) I( k: G
13 ^5 e% ~7 ], x- Q
147 F. H3 S4 K) N
15, j# `+ G" e4 x' s% _2 g+ |
16) P# h- t, t( l% y9 p7 [- l3 s$ w
17
2 I8 I1 N% r" B9 h/ W0 q18" Z; J7 t7 ?5 _' [2 Z0 u4 n# B$ s
19
$ n9 l- s# f+ a4 {, V; { b20
% V L4 j/ {8 ?, F2 Y+ A0 O& L8 I21
' g0 Z8 A2 Q, o3 d22
& \3 w/ n+ m8 L4 O% i23
9 n& ^" t9 Q& [$ P5 I) K0 ?24' j1 }' B6 D2 A6 d3 b
25
! w- R+ p9 A, f" ^0 h26
3 U7 I R' F" ]输出结果见下图:
0 V$ f( y P. l+ X7 F# ^' v' @
, I. u% m6 s0 @9 X————————————————: |( i& N* R7 G+ K+ ?, n2 T
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
% l4 o6 }' W* r; X# u原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
+ F/ A& C3 [+ K- L# A2 I& E( U' x( H- ?- |4 d% w6 w
" H) {5 s& e4 K- \6 q
|
zan
|