- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564671 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174624
- 相册
- 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算法篇
. t) s3 G1 _9 ~* R# C, ~) a
; c+ y1 I- |7 _( C在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。8 T, X, l# n1 n0 g8 k* y, p* \0 z
) F2 k' R8 [: z7 D! z
1.准备工作
: ]. {" X" {+ R5 C7 v如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:, W) G$ L1 O9 a% o6 m# w3 k$ o
1 m& ^5 X4 h2 D; j
pip install mlxtend/ n0 R: K1 C0 S
1
* L$ ?6 q1 |+ {4 j为方便进行过程的演示,在此构建测试数据:
- y& W, j+ m) v# X% o5 M Q' r5 F' f; M
import pandas as pd" Z( n- W7 G# A: w% {7 c
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
C! J! R" N1 o% u/ K1
. t; G. U7 J+ Q! S3 I# E2
1 W v# I3 a8 H8 \# P测试数据截图如下:
5 X) b. I' z& m- Q# ^- G0 u- Q( m4 v6 j7 P
2 C8 |' v3 p' ?8 `
对上述的数据进行以下处理:
/ Q& S, s5 F' Z( ]
& }( t$ X0 H1 cdf_chg=df['product_list'].str.split("-")! h6 N! C9 [, F, O. j7 e; E: M3 h
1
% W2 H) Q- R4 r- Q* U* v' V数据处理后,结果截图如下:
: m% Y( l; ^' o' n; h6 N7 H5 z
6 \5 i8 i# L2 O/ u8 G) G0 R4 F截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
1 w. X, o& j5 x3 T9 q" V" X3 c0 t5 D- D& x* B
2.核心函数及代码6 c9 ~5 @/ F5 w- m# I* A( N7 Z
2.1 数据预处理
( n3 ^7 f$ v0 j# G l对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
5 H6 E- d- E6 m. U6 v- }( B! g, k* U
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
9 T* O% Q i. q" E$ e- Z$ E2 k6 Gfrom mlxtend.preprocessing import TransactionEncoder
% i9 Q" l5 I. fte = TransactionEncoder()
+ B" K V/ H+ x, p# ~1 R; N3 v Qdf_tf = te.fit_transform(df_chg)
; T, l: Y1 {4 V* @7 W" r! `8 x#为方便进行查看,生成dataframe' I2 e/ }2 N* ^% \2 B7 g- H$ M
data = pd.DataFrame(df_tf,columns=te.columns_)/ N. p$ I) }2 W) A6 \" X' l% ?
1
8 e2 Q- A) C) @6 ?% T% j28 \. g2 |/ C6 e/ h8 Z6 I" o
3" u4 h6 p7 w9 n# V9 u
4& ^' n `5 D% b: a9 M9 W
5
) n# n# `$ X1 L6, c0 |. \# d4 r* K- e5 ^* W
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
0 [+ x5 }0 X' D
& P+ I0 m5 Q5 m. V) s0 C0 X
6 y) w ~/ T* Z5 s& q2.2 两个关键函数) D; }* c( t3 T" {% W
apriori函数; f! e* @3 l1 u. a9 u# M2 D: F
语法:
- b3 u# K+ Y; D0 T. ]
( Q7 Z! c$ c& F, V& lapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
& |. ]" Y7 ~# }9 A1
; Q7 k) o) @/ R; z* Z+ e. `参数详解:
% x, _3 A% n7 [3 i( @
' h. k7 T4 r" Tdf: pandas模块中的数据帧,DataFrame形式的数据;
/ i( l2 S: y& U# H. o; h2 u( X6 o- pmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, g7 N2 }) J' Z6 K. l
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。; P( c. F( o! a6 D; H
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。; K, O5 y+ x+ u G% A( q
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。: y- j6 H& P7 ^1 J6 u/ ?4 ^/ y: B
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
6 R3 s) }1 _4 c7 m" o1 fassociation_rules函数
/ w6 c6 u2 E; {* f6 P! s0 x( _语法:
8 ~9 y" Z8 I: r# o7 c% b
# \6 m- R5 T4 c0 u6 N1 x" V6 sassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)' \: R! c" }/ b; ~& i
1
4 w0 e* @) d' l8 k参数如下:
$ r! T- h7 A/ }# V" J( f
; _3 q' C# {# ~& s9 _. udf: pandas模块中的数据帧,DataFrame形式的数据;. c" K c" M5 R0 u( A
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’6 r" x5 I. H& s3 h% z* o% V
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
6 f; E3 v$ {' ?" c0 {support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。1 m4 u) N! o6 h* @( Y# n
附带metric几种参数的计算方法:9 ^5 y! M! X* k2 N9 P- b! N$ S: ~6 ]
: r; j; T2 p& f+ C/ Z
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]; ]8 p- u, L5 i$ m
8 U( `) k& b5 K* ]confidence(A->C) = support(A∩C) / support(A), range: [0, 1]3 `3 L- ]+ J$ w! O* t9 F7 f
: \5 t! R; R, ?$ d) ~6 @+ [2 vlift(A->C) = confidence(A->C) / support(C), range: [0, inf]9 T+ l- u% |7 a+ R& y* `: O
3 }6 q+ b2 ?% q2 m
leverage(A->C) = support(A->C) - support(A)*support(C),2 s- b5 O6 S" ?# y* F2 N# Y4 `# j
range: [-1, 1]
* A- l- R4 j7 p# \5 A. j; C: h/ H
% E$ Y* v7 w, i. ]- wconviction = [1 - support(C)] / [1 - confidence(A->C)],9 d0 b7 G# F- @7 r5 A1 b) R2 _5 m
range: [0, inf]
0 \. V5 W4 e+ h3 S9 ^% {0 ~- F
. f* k5 c9 T9 }, P& N. z3.实际应用案例) s$ Q4 w- Y+ n" N) G0 P4 X: `. b
以下为完整的调用实例: o* k# `. j. Z, w3 y
0 x+ f9 f' _' p i' [2 Ximport pandas as pd
, Y9 ]0 { @" [3 t0 [) m7 Cfrom mlxtend.preprocessing import TransactionEncoder
# f* b5 ]1 Y' H' `$ L2 K5 T. `from mlxtend.frequent_patterns import apriori+ E8 e. _2 `$ S {; j% \
from mlxtend.frequent_patterns import association_rules
7 P" ?: b5 M8 W1 `0 p9 D#1.构建测试数据/ ]& y0 S( ^) `$ r0 D4 h5 D$ a
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})/ R; O# r1 R3 }0 }0 c M& O( [
df_chg=df['product_list'].str.split("-"); v) Z/ M5 Y) l+ R
#2.数据预处理6 r0 s9 C4 Z. o/ L* e. N
#将传入的数据转换为算法可接受的数据类型(布尔值)
9 }$ L V/ m' Fte = TransactionEncoder()
; ]- O# P. {# B1 N$ E9 Z* G- y, ]df_tf = te.fit_transform(df_chg)4 e* g$ ?& J/ Q, A6 j' r
#为方便进行查看,生成dataframe5 e( C' S. Y/ \1 i( c9 X- O! c
data = pd.DataFrame(df_tf,columns=te.columns_)
4 j% F) p+ \6 I. q0 R#3.建模3 m# U! ?- x, Q" o- c [, L
#利用 Apriori函数,设置最小支持度为0.2
. I+ a/ j% t' ]frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)- L/ D, C" I& {4 x
#设置关联规则,设置最小置信度为0.15; i# _- m4 ~5 c- H
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
: \! s, r# M( o2 \4 Y: w#4.剪枝并控制输出
$ z8 A; g6 g+ X U' f! u#设置最小提升度,并剔除对应的数据/ n6 m: d: N4 V3 z4 f' r
min_lift=1
7 J+ y+ E" |, V( I/ orules = temp.drop(temp[temp['lift']<min_lift].index)
9 p- M$ V- [" p: u- w% U- q#筛选需要输出的列
5 H( m$ _8 l5 }$ J1 \result = rules[['antecedents','consequents','support','confidence','lift']]% G& ^+ L5 ~- _
result=result.sort_values(['confidence','lift','support'],ascending=False)4 y. @ J/ G: p0 g. \4 x/ F- A
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
, @ K9 V) z: F
! ^( U8 R Z) o9 M1
; |1 n) M- Y" k2 u5 M; J2+ N0 W% k; P2 i2 w2 \3 l
34 _( R- M4 q0 i3 _. L
4
) v' s( w. E$ m& F! i8 S% c5
. M# Q1 h0 c3 a6
+ L5 t6 B, g* c% Q. Y7
+ w7 a: [7 L, Z$ V+ \ m4 z9 b85 z e1 }0 x7 c' L( j1 Y
9/ c' j% ?3 Q" Z0 v+ u& r3 P
107 A+ m1 n! F3 u9 e2 H7 Q3 D
11
! q& A2 j6 B- m' {4 N3 |1 v12! q/ F+ G o2 N- n0 z# y
13+ t/ E: i5 P2 l( z
14
- z* E, P/ i1 I* {! p& D9 f15/ u$ r; i. P6 \. h; f6 L2 s' P* T
16
/ K, |& H1 R J17
- w9 K8 f5 y4 R6 ~18
9 d8 i: D6 e: v0 W19
2 f! w, M) K( i( w3 @$ x$ s209 ~& y$ Z D/ }
21( \, U3 h/ A8 B* G) p9 j$ _
22
4 Z" j3 V" T9 b) {# U23* L! b" H9 t+ E: L
24' S# D+ O; t' |( m
257 Y& Z7 n3 g( X
26! { D5 a9 y' s3 G7 K+ |5 g' x
输出结果见下图:! `6 B: b( I! G; R; e2 }
2 n6 P( m; g0 M& h" C
————————————————
# T0 x+ y# }7 v; z, v: S. R/ v) q) R版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
) F$ n3 J `, }原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759& p6 z! A, `' {: l. t
Z. d( I0 V, `' k+ \
4 o- A* K) x( g i
|
zan
|