数学建模社区-数学中国
标题:
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
[打印本页]
作者:
杨利霞
时间:
2022-9-12 18:44
标题:
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
# K; ~1 X( j8 f t* ?" e
N6 v) t. i! `! r+ U0 A
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
* I$ u- @" p, |* }
0 W0 _1 F2 o% u0 } b1 f
1.准备工作
$ L9 ^( q# D6 y6 @9 F+ z( Q: u
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
" |' j9 V1 V' w. P6 ]; \
f2 e8 |/ X) k
pip install mlxtend
$ U0 G" u+ ^% o5 k) W1 q h
1
+ W0 u6 E7 q+ B7 Y n h. l" e
为方便进行过程的演示,在此构建测试数据:
' B- i& D$ I9 v8 c* ~
7 _' V8 e( e/ w. Z- {4 Z# ~% N
import pandas as pd
* ` l2 H8 }) V+ ^1 V8 f3 \
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
# R2 |: B( F/ F9 L0 S
1
- q- r" `' W8 N4 U9 v, w% t
2
5 `( d8 ?* T1 [$ ~
测试数据截图如下:
' r+ p! c! k+ l. E+ n2 N
1 p, {1 B8 f' |7 e: }
' `5 `6 Y/ P, o
对上述的数据进行以下处理:
# G1 Z( I3 |% d. {3 T/ [% p5 j, c- I
* S, g; P! ^3 g
df_chg=df['product_list'].str.split("-")
( x# l4 J1 m+ z+ c. w
1
% ^1 f3 b; M& S- y
数据处理后,结果截图如下:
5 M8 Z6 b2 N5 I6 O- x0 T
1 _( C, B3 v* W) P3 W$ a8 X$ s
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
$ t- C) g$ ^) `7 m# [$ h
) T+ K8 [, \- q3 R
2.核心函数及代码
' {* j+ \: | @5 ?8 g4 e* t* Z
2.1 数据预处理
: g0 E( ^" U: i f$ e6 c
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
: u) `) R& ~! m8 y
. ~3 O D: L) w; D2 [5 `
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
# x0 {. V4 t2 I. L& ^9 i/ T
from mlxtend.preprocessing import TransactionEncoder
! w# ?! a+ `3 Z& o; U. ^% o, @
te = TransactionEncoder()
9 i& B3 x. n' _4 a F: U
df_tf = te.fit_transform(df_chg)
/ o' `* \9 q" h x
#为方便进行查看,生成dataframe
; A( N- p& g% y0 b
data = pd.DataFrame(df_tf,columns=te.columns_)
/ P3 `- u, k" t7 ?& L* {
1
, S& N& d5 B) Z) p
2
% `$ w5 `/ f5 ]+ i8 L
3
/ k2 Z5 k. V8 g& r* B! y; h! a/ E
4
& J5 `. | ?& n) ^& V
5
# |: I) ]1 s4 y/ }4 _- I. U. j
6
! \* \+ z% C" G% K) }
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
# P7 V8 q# v$ k1 ]% {
% o( h4 d! M& D, x0 \9 _+ ]1 {
. Y7 \+ n/ _+ ]
2.2 两个关键函数
# P. m% g _# N, `1 l
apriori函数
6 Q% i+ Q9 _" k, T- c h
语法:
8 G1 H5 \* {) `9 Y
' t; D: S. Q. N6 O) C/ Y
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
) U" } z9 P* I. k0 \
1
$ e0 V7 C& K A- n! v$ s g7 D% Z
参数详解:
# {8 d) j/ W5 u/ e4 s9 y5 g5 I
* v2 w9 j( F0 X9 g7 s- B$ R
df: pandas模块中的数据帧,DataFrame形式的数据;
4 h. ~; g) X0 W" Z
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
! g% B+ [) w3 d/ k
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
) z Z, k1 k5 O6 E
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
) j4 C; E) F/ ^0 k
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
" n2 g/ A' K$ n# P
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
% s3 C9 J p. ~/ G) X7 K
association_rules函数
2 F$ j. t5 C6 ~
语法:
( Y% O9 H( E$ H
# P6 m, I* A( Z1 D: B9 A& h
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
: Y4 v) X; T' H/ e/ D
1
2 `& J& ^3 R1 h* S" U, H) Q
参数如下:
2 p) g+ _1 Z7 ^8 Y
& m4 h3 k0 T" D: K3 F* X @
df: pandas模块中的数据帧,DataFrame形式的数据;
8 q* z; q; Y' h# N; x
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
6 k; `# {2 A W/ f
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
! X0 a" X. a& {9 E; _+ Q
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
( p4 ^7 c+ e/ f* i D3 U
附带metric几种参数的计算方法:
) I1 c3 J+ q: \! K3 ?2 j
3 \/ Z! e; R$ P# J/ w* v
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
; U. `; m/ j7 M' X
( y) k" q! ^8 j+ Q; @5 c& r; V# y
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
6 J4 {- ^6 K; d# {
; {* S) |" f7 `: U1 y
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
2 _* _! e0 A( F) K _8 E% e
" \7 B( S. J- z6 F) H) P2 L. D
leverage(A->C) = support(A->C) - support(A)*support(C),
+ x! N0 b6 [ l* r1 R6 j6 ]+ z% T. ~
range: [-1, 1]
5 j! @4 j- p4 h; h s. _0 N) b6 T p
, P# M# H4 t4 r* C: H* R
conviction = [1 - support(C)] / [1 - confidence(A->C)],
* f- N; }1 y# Z" a2 t0 o
range: [0, inf]
8 R/ K6 I/ K8 b( n* s8 o
+ A8 J1 @4 _- g/ x# L* z: n7 q. z
3.实际应用案例
7 K" d6 r9 l% D; J% Y
以下为完整的调用实例:
5 \) T" v8 u/ B+ F( ^. o
" w& `0 _$ H* N, o* u, e& C' T
import pandas as pd
9 W [1 j! m& {2 m$ p; @
from mlxtend.preprocessing import TransactionEncoder
( @9 {5 _2 O8 R, C$ Y1 S- O
from mlxtend.frequent_patterns import apriori
2 ?' U2 Y5 V- H/ ]$ V2 i
from mlxtend.frequent_patterns import association_rules
o0 E/ i) m; f" K4 D; X
#1.构建测试数据
0 \4 c9 Y' o' @" S0 n4 w- n; E4 G
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
5 x1 m! ]% c/ `% P% V5 M1 S# z
df_chg=df['product_list'].str.split("-")
, f/ C- V0 c& A! R0 d8 w. p3 a
#2.数据预处理
: B9 ?, V. P& n, a3 A$ g( f( j5 j: B
#将传入的数据转换为算法可接受的数据类型(布尔值)
7 }9 i7 n$ A" \3 B) M2 ^" R
te = TransactionEncoder()
6 L* o# b3 B, J: R
df_tf = te.fit_transform(df_chg)
" T* G8 \2 R# F7 J' A; l( [- f
#为方便进行查看,生成dataframe
2 q. ~: z, H4 S1 e
data = pd.DataFrame(df_tf,columns=te.columns_)
) M3 i3 p$ v( j
#3.建模
" P9 }2 C" D8 y$ ?
#利用 Apriori函数,设置最小支持度为0.2
2 h) b, k/ n/ Y$ ^5 ^
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
' z, x3 i& o$ `/ B& r/ O
#设置关联规则,设置最小置信度为0.15
* O" }6 W9 M6 M8 b* T' X# o- x
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
/ g3 c4 f5 u7 S! g# i6 f7 G0 z* r X
#4.剪枝并控制输出
* n* g, W* A- L# N, Z* n
#设置最小提升度,并剔除对应的数据
$ X7 ?( |+ D# R* l T3 a
min_lift=1
" k" w9 d6 Y$ d5 Y4 [
rules = temp.drop(temp[temp['lift']<min_lift].index)
- H+ a6 s9 h9 ^4 d& @+ u) `
#筛选需要输出的列
9 X V8 X1 J8 P# Y7 y( J
result = rules[['antecedents','consequents','support','confidence','lift']]
" Z: O3 a) `0 e; ?
result=result.sort_values(['confidence','lift','support'],ascending=False)
" C4 I* R1 [. p$ F. m
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
5 w% D8 m) x/ ]+ C, G6 ?, R
1 m, g2 a9 Z$ T- |- B3 u& u
1
& C* y, {( Q1 _
2
$ K" V4 b- v# Q8 f( ?
3
' `+ w" K+ O" c1 v \
4
' D2 t6 A" U E: x2 v, P6 m1 }( Z
5
* {& [4 V" R1 Y' |) x- H. T; |0 N6 ^
6
0 F. R) f& X, y2 Y4 ?5 X
7
) G+ Q% \9 n. E' P) i' `
8
+ ?: I& T9 {* ]& V" r+ |7 U
9
" n5 s# C5 H S. m# k' f2 v
10
! d8 |$ }1 i! v5 |: ^( U( P
11
0 o0 c" }' ]9 r& ^
12
2 |6 r# G! \- z4 d0 e7 M) s. k
13
6 K" q/ F7 X# S7 N
14
$ W ^) t9 r2 { H3 a8 o, m
15
) A$ b0 O/ j+ v. D* e! P- y
16
) v. x9 y& Y: C6 o7 z; Z8 t
17
% X" @) L) N0 E. s9 O3 Q( n! i
18
5 F, U4 j& b& M
19
9 K9 N4 o; `) z9 {9 X z
20
# w: C: z) V) ~) b" F8 U* s/ b, D$ r
21
+ i" R2 G! P" K6 }
22
7 N) A, f% k* n) t! H, m
23
. h1 a, y$ P& o6 _- U
24
- @9 Z8 S1 P/ c# i
25
/ o7 G e, V' i. X# x
26
: B( D: I: s2 E8 g( c& R
输出结果见下图:
7 g( o- s+ {4 I+ Z* ^0 k' e
2 U$ B* o6 B# F$ l
————————————————
p1 [0 }$ I/ \8 o, l; n% v
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( E* c M, ]7 ?& z$ ?8 D
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
& D$ Y3 k. w, z: k/ m7 ?* H
1 b+ D% b- A3 r! A* A$ c4 A. j, w
p: p# |! ~, `% t# H
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5