数学建模社区-数学中国

标题: 数据挖掘——如何利用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 f1.准备工作$ 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  h1+ W0 u6 E7 q+ B7 Y  n  h. l" e
为方便进行过程的演示,在此构建测试数据:
' B- i& D$ I9 v8 c* ~
7 _' V8 e( e/ w. Z- {4 Z# ~% Nimport 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 gdf_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 T1 _( C, B3 v* W) P3 W$ a8 X$ s
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
$ t- C) g$ ^) `7 m# [$ h
) T+ K8 [, \- q3 R2.核心函数及代码
' {* j+ \: |  @5 ?8 g4 e* t* Z2.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/ Tfrom mlxtend.preprocessing import TransactionEncoder! w# ?! a+ `3 Z& o; U. ^% o, @
te = TransactionEncoder()
9 i& B3 x. n' _4 a  F: Udf_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. j6! \* \+ 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" Zmin_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 kverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
" n2 g/ A' K$ n# Plow_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
12 `& 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/ fmin_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 j3 \/ 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# yconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]6 J4 {- ^6 K; d# {

; {* S) |" f7 `: U1 ylift(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. Dleverage(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* Rconviction = [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. z3.实际应用案例7 K" d6 r9 l% D; J% Y
以下为完整的调用实例:5 \) T" v8 u/ B+ F( ^. o

" w& `0 _$ H* N, o* u, e& C' Timport pandas as pd
9 W  [1 j! m& {2 m$ p; @from mlxtend.preprocessing import TransactionEncoder
( @9 {5 _2 O8 R, C$ Y1 S- Ofrom mlxtend.frequent_patterns import apriori
2 ?' U2 Y5 V- H/ ]$ V2 ifrom 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 Gdf=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# zdf_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#为方便进行查看,生成dataframe2 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.22 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- xtemp= 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 amin_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( Jresult = 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 ?, R1 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 ^
60 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 v10
! d8 |$ }1 i! v5 |: ^( U( P11
0 o0 c" }' ]9 r& ^122 |6 r# G! \- z4 d0 e7 M) s. k
136 K" q/ F7 X# S7 N
14
$ W  ^) t9 r2 {  H3 a8 o, m15
) A$ b0 O/ j+ v. D* e! P- y16
) v. x9 y& Y: C6 o7 z; Z8 t17
% X" @) L) N0 E. s9 O3 Q( n! i185 F, U4 j& b& M
19
9 K9 N4 o; `) z9 {9 X  z20
# w: C: z) V) ~) b" F8 U* s/ b, D$ r21
+ i" R2 G! P" K6 }22
7 N) A, f% k* n) t! H, m23
. h1 a, y$ P& o6 _- U24- @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' e2 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 ?* H1 b+ D% b- A3 r! A* A$ c4 A. j, w

  p: p# |! ~, `% t# H




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5