数学建模社区-数学中国

标题: 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇 [打印本页]

作者: 杨利霞    时间: 2022-9-12 18:44
标题: 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
' z3 e( p4 b% i# I5 A. O6 i' F3 Q8 D/ {  Z
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。. ~1 ]. q2 W: F2 l# T- B$ h' \6 |& \
- O' ?2 ~- W3 p
1.准备工作
2 l+ h8 f( ^$ B9 L( g' g7 E9 Z如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
6 g# V2 T, P# Y9 q. s" B+ C$ T9 f/ `. L! P& \
pip install mlxtend
. v" I" G" u! N. A1
, x: {" {4 F- R$ Q为方便进行过程的演示,在此构建测试数据:4 x) U3 B/ |/ A  [1 \) ?
9 k# W# `7 z7 Q( N5 m1 e8 r
import pandas as pd0 ^, Y/ d1 |6 ]* \2 ]5 `( H; D
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})9 c0 q7 F; a  m. P+ k& A
1
! P, c9 f: {- |! H/ r/ V) [2
2 y4 u' W2 X+ E. \, s, w测试数据截图如下:
/ x: |7 X2 A" f/ r
# g4 e- A, e4 W! J6 _2 b- n0 R* g8 w0 A8 ^4 L* S/ c
对上述的数据进行以下处理:
+ Q8 ?' }: ~) |# B( H: }/ @# U) Q7 v" V" o7 N8 r
df_chg=df['product_list'].str.split("-")5 G' z5 \/ n8 s1 M" ]
1
  R5 }: O' I6 [2 `9 K- y数据处理后,结果截图如下:
! v7 k2 o% i) P% }+ L" c" B& I& j: t: t0 e
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。" Q) V$ d# q9 {
  ^# r- _$ [* D7 H# _1 _' L
2.核心函数及代码
5 ~7 j5 F! ]2 u9 g2.1 数据预处理
9 i2 Y" N5 h0 \6 o0 b对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:- W0 e8 f5 c4 m6 r0 K% e4 P
$ V# V) K3 r. j9 R
#1.将传入的数据转换为算法可接受的数据类型(布尔值)* o& A$ B6 [( k3 z7 A
from mlxtend.preprocessing import TransactionEncoder" g- j0 q  O3 m
te = TransactionEncoder()" l5 v, m/ v; p0 ^- J
df_tf = te.fit_transform(df_chg)* M5 k/ m8 M* c4 q8 T  A6 |( }
#为方便进行查看,生成dataframe$ K/ l# |. A: U0 {+ ?
data = pd.DataFrame(df_tf,columns=te.columns_)) W+ t- k7 u, D5 p# [
1
0 o( x$ m' P: T$ t3 x8 E& v" I2
( ^* O. n/ G* G; g3, J( [" W" Q* ~/ G! P4 x: Q
4
; J& q2 k. Q% U" ]5
% K" r1 T) j5 N6$ t/ D. k' M- [, S3 i
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:# `' J6 }) k( m; r0 G5 v7 [0 U
1 r+ l: ?! E4 H1 N5 h! W; f1 L

% [, c+ q# N9 v) Z2.2 两个关键函数3 D! N! z0 P7 E& Z5 M& Q
apriori函数
& i3 e- p! }+ {6 A语法:2 N" S; R0 K4 f. z2 s
7 Y$ f: d. F2 e5 C% s$ d
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)4 u% ?6 H: r2 k
1
! k( P( p! g4 g2 c) A- I参数详解:, B* g1 R3 O4 D. }  O! k
9 M- L/ k7 M# y: i! c7 F3 v
df: pandas模块中的数据帧,DataFrame形式的数据;' r+ P2 H" W  ?4 x3 D6 ^
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。! R/ z* ^4 j3 J- J
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
( j5 Q0 X5 V+ C6 N' Z3 i/ zmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
5 I' l0 v' S+ d1 S6 nverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
; ~, B: k6 E) S- p' ?9 B# Klow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
  ?1 G. A2 O4 w  c& j% ]association_rules函数
7 Z+ m; `, q0 Y语法:! X, {7 V% c4 u5 \
3 O8 h: a8 ~5 |) l% }. l
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
( W) J- ]6 E5 K1
2 [* C( B9 c/ {( u9 f* H参数如下:: e( S8 s! _+ O( F& @( G

. m& ~) I( A3 rdf: pandas模块中的数据帧,DataFrame形式的数据;3 L; G* e, c$ Q8 M
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’# \  I2 ]) D$ |( S+ Z
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
  S( I. P$ l, f5 R% }: m+ z7 ssupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。' b3 q. u: \, G# ^4 W; I
附带metric几种参数的计算方法:3 ~- x# V9 q  I( x7 t

; d3 F1 m# i! p6 z% i# V8 o+ Qsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]' F& R8 n. l9 n) G
" l# w. J) `9 n0 w
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]- X9 u) g0 N* D- H- Z
. n+ p0 S- {* x0 ^
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
5 C6 f. ^* T5 ~: H! _9 m+ p; H; Y8 O" a9 b: n4 P  e
leverage(A->C) = support(A->C) - support(A)*support(C),& w8 h) v( o+ b# }) C% X9 W
range: [-1, 1]
0 ]% [! l# @# o3 v$ y6 Y% e* q5 i; m* d* Q  t1 z; M
conviction = [1 - support(C)] / [1 - confidence(A->C)],! @/ \5 Z+ F0 c: E: b
range: [0, inf]5 b, _: l$ r- `4 O% e6 R9 E
9 v( S# \+ [8 F9 Z: ^/ j+ U5 i
3.实际应用案例
0 d9 U% r; z) {' t1 K以下为完整的调用实例:
+ h9 G; y6 M, ?& u1 G2 N
) R' I& z) T8 zimport pandas as pd) R+ _% O4 K% M
from mlxtend.preprocessing import TransactionEncoder
/ Z, N3 c7 W6 @1 sfrom mlxtend.frequent_patterns import apriori7 s/ o0 G' ^) x' k
from mlxtend.frequent_patterns import association_rules
! x( U  S) w, a#1.构建测试数据+ Q! w/ x% G: S( @
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})' }8 f/ O- q& Q( X
df_chg=df['product_list'].str.split("-")
4 e! h" l4 p8 K- f' [2 s#2.数据预处理
) ~, I; \5 ~2 d/ S6 J: E$ u#将传入的数据转换为算法可接受的数据类型(布尔值)$ q1 t, i* a2 g! \# E
te = TransactionEncoder(). d; y# l7 ]+ T5 d3 U' j- Q
df_tf = te.fit_transform(df_chg)
5 W; Y8 Q# g$ w. V8 S#为方便进行查看,生成dataframe- v, h$ i6 H1 o, i5 |) b1 a% J0 Z, v
data = pd.DataFrame(df_tf,columns=te.columns_)
# i* y4 R9 d& W' h% ~#3.建模
4 i: E4 n  D* h0 n- W#利用 Apriori函数,设置最小支持度为0.26 Q  }) z4 K0 u4 o; j
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
1 n- l0 l5 x/ a+ y2 R#设置关联规则,设置最小置信度为0.15
3 P2 l9 u: j5 X7 }  {temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)( E6 o0 C; @: R) W
#4.剪枝并控制输出
0 i% b/ T- {% d. N( {$ B6 }#设置最小提升度,并剔除对应的数据- k% t/ L4 k  `  i6 X
min_lift=13 E9 i( e9 y! Z( d8 ]+ ]1 U
rules = temp.drop(temp[temp['lift']<min_lift].index)
; q( n' ^9 Z$ ]2 G6 G* W9 R! X#筛选需要输出的列
- u. F8 D) z% f- c- d5 y( Rresult = rules[['antecedents','consequents','support','confidence','lift']]
# [: k8 Z: q( w- hresult=result.sort_values(['confidence','lift','support'],ascending=False)' P. W, i$ }5 o: m& ~
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')2 Q3 i1 b$ m0 V+ f1 F6 b  C+ {

' e8 ~2 D+ f1 }$ N6 w3 M6 a# l9 ^12 H/ ]& ~/ I# \
22 t4 T0 a( }7 g" }% p1 Z0 i
3
" {+ T2 O& t4 K" I% G% {* \4
' y/ w6 L7 R( M3 b& K. L6 r9 s2 O5! x4 ~' _& i$ H  J
6
  {: N' J0 s3 Q; {3 G* H7/ c4 N* f7 B# M( }; ]" p
8+ \" @; x" X) F4 k
9* A- e% W. e% E. r3 b
102 P+ R3 E' y. W4 K
11
; P1 f3 X( T1 B12
5 ], g8 d) A  Q5 q0 E6 d13
. V: G5 J( p2 O  W& P14" {) s% }( f3 C! {
15( c( V5 x9 q# z# T; \# R+ s8 p
16
( |4 A4 V5 {) r/ m' B17# Q. {$ Y/ L# P$ b+ ?" p
18
+ x: a$ L+ z# l* J. n197 x9 Q6 V2 N/ y% ]6 m
20! c4 ?% r# J' _; L8 }
21
& S  T# y+ F8 a/ u3 I1 s/ E9 b22
+ U) k& z, @( w+ f  Z23
( X0 A  E) ^4 G; {, r" h5 }24% Y6 a/ K$ h9 Z
25/ i) y0 H3 t4 Q* R0 ?0 q8 @
26
$ y. l6 ?; z" |, ]4 c% b: X, W输出结果见下图:
$ h& Y1 G% a% ^- S7 N6 Q2 I) \2 |, S% l& }- _9 C
————————————————( Y. F* C& M& e% M  O
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 ]. Z( X8 w1 H( _" _
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
* W. w& g; }& Q1 r0 N+ L
. I% p5 W* `- J3 y  }" d5 k" |9 z6 ^- w





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