数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-12 18:44
标题: 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇+ m' v6 O# K! G0 L/ ^7 [

! z. _9 W, D! ?- M: s6 J0 m( e在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
' {9 z5 ~& o, m! k/ Z2 c9 Z
5 O! L& \5 W5 Y+ N4 v0 D5 B0 J1.准备工作
: p5 m$ U/ s3 @8 r( f4 v2 T如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:) k" S5 M0 {# {/ L5 M

9 M% h9 n2 u$ E3 p3 Cpip install mlxtend
8 n, b, }$ L2 M% Z# F1
1 G! r2 J6 q: \为方便进行过程的演示,在此构建测试数据:
4 O  j- R3 q* T/ @
! d, _. h) T) Y. R' F3 E& o' mimport pandas as pd
9 K0 r- T. B, e5 M3 E& Ndf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
& b; r. l4 t7 H7 R5 `1
5 k& u3 ]; @$ i20 p& m5 g, I+ ?) s+ }% d
测试数据截图如下:
; N  H+ w$ D% V0 h" V) M
# v7 {. L  c+ L/ I2 ~" _5 B
( [* g' x5 s2 v对上述的数据进行以下处理:
( g$ X4 W9 g+ B2 j) G+ ]# ?1 O% ?# T, o
df_chg=df['product_list'].str.split("-")4 v- m6 y8 M9 N/ d9 {' e: {1 j
1# y2 T6 z  {2 v" s0 Q
数据处理后,结果截图如下:8 }  t/ N+ n; d, x

; K" z, ]' h  f6 ~4 w2 w截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
+ S/ z& t$ t8 X4 o. C1 e% H
, T, a" [% H( G+ c2.核心函数及代码  w, X" ~# ~- p# v, c
2.1 数据预处理
8 E) |6 h7 p- r* e/ _4 k对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:1 m+ a  e; K1 G

% `& ~4 l! h* H, Z# [* A#1.将传入的数据转换为算法可接受的数据类型(布尔值)
7 V# e/ T9 g- B+ ~" a. \; ^3 U( d  Nfrom mlxtend.preprocessing import TransactionEncoder+ J9 h3 v; I. ~6 W( X( N
te = TransactionEncoder()% v3 W4 D4 n- M0 r0 O
df_tf = te.fit_transform(df_chg)
( h0 a% n8 _. b$ v+ o( c* ^9 e- }) \$ w#为方便进行查看,生成dataframe( Q5 ?  s' R4 q% j6 y8 h$ ]
data = pd.DataFrame(df_tf,columns=te.columns_); b  {+ u; o( p* u4 W1 q
1
3 z* V& j! T3 M2
& ]  i7 X  L2 U& r39 s+ X7 k% \! b; B7 z  g0 j
4
7 z0 i# `- G+ M2 l; W5& q  ?' Y5 `4 n, H! Z6 |  F
62 \. A# P* d9 c' k7 L
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:( T6 n3 f: v- {# n2 @+ q! f
; X, o* N2 R6 d( Y* x; @7 p# Z
, C6 L4 t4 J0 x  L( Z9 Q
2.2 两个关键函数8 j( W2 L9 K7 e- D' {3 `4 j
apriori函数
+ h0 n; {# u9 T7 |; v. M% @% Z语法:0 ?' I; }8 D& M; w
  T7 D- L6 e( ]
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)& `. _7 E) u+ j0 m1 a6 R" a9 T
1
) B" s% y$ A! e6 B5 o参数详解:6 T4 D! e; v- n5 ^; }

1 b) t# m$ X2 q  |+ b9 x7 edf: pandas模块中的数据帧,DataFrame形式的数据;, J8 u9 y4 p0 i* }
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; a/ w4 i& W! q' z/ ^
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。4 `' z% }1 v6 E! f
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
8 F1 h  x3 o2 s3 j2 R: Xverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
9 }4 F  C% ?: i' Y( c  _, R: klow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。. D! ^. q. {. `  Q( R+ ]
association_rules函数
" k- A+ ^! E1 y8 B" S语法:
% |+ P- M" v( T
$ v" M5 s* B5 s' G8 e1 H+ t% vassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)3 x, g4 I$ }, k% _
1' H8 ^# w7 E. W& w4 i: i% ~( b
参数如下:
0 Z8 u% ?6 X2 d2 j
  @$ \- L& c# `; d2 f& Pdf: pandas模块中的数据帧,DataFrame形式的数据;$ U$ F4 E- d% n" c, d) g4 `
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’7 i% K! B" |4 ~# B- G
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
  Q6 g2 _; R1 w: |# ?0 A4 gsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。$ t$ J1 w7 d  I5 U2 Y7 U  k, X* Z& E
附带metric几种参数的计算方法:# I" [5 ]! K! y# Z# j$ L' i
! k6 g# r6 x4 J. }! X" r
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]% L& r) A0 z' D$ M/ z* W
9 U1 d2 O% e3 B7 R  t
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]2 ~  {/ K/ u# ~6 @
, }5 J8 J# n. F% S, D
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]* e* [4 p3 t9 W7 Y9 |
7 y5 d+ H% [9 D" q
leverage(A->C) = support(A->C) - support(A)*support(C),
( a6 k& U+ Y# W! [range: [-1, 1]3 q2 z3 @/ r- J7 V% U& f

5 b0 H' k: Y' I9 H. s7 sconviction = [1 - support(C)] / [1 - confidence(A->C)],
; c( i: i" c  W. I, V% h* K- c0 }9 Qrange: [0, inf]" f0 M% ^7 Z# u5 {

1 Y9 V, o/ W0 C$ l9 Y. s3.实际应用案例% Y: w2 w/ ~, m9 c) j3 |- W
以下为完整的调用实例:" o3 S3 K( ?5 i
# q/ H" X8 ?) [. v
import pandas as pd; ^4 Y: G& Q$ O# b8 z
from mlxtend.preprocessing import TransactionEncoder
$ a: g2 g% E, b% S8 w5 ?2 \from mlxtend.frequent_patterns import apriori8 y' k  z1 {) \
from mlxtend.frequent_patterns import association_rules, o4 `  `1 g/ |. ?+ v
#1.构建测试数据) N/ |/ |- S3 p" y9 Q% }
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})# p% p6 L/ M7 i) l- o3 |
df_chg=df['product_list'].str.split("-")2 u7 U1 Z5 h$ ~; b5 ]/ J
#2.数据预处理
7 @4 R  _, C: e" |, Z0 o1 i# B9 @7 T3 g#将传入的数据转换为算法可接受的数据类型(布尔值); U2 N* U2 }: s5 u4 J
te = TransactionEncoder(): \" w& n" A- I, Q6 o# _
df_tf = te.fit_transform(df_chg)5 d/ \- S/ v! t
#为方便进行查看,生成dataframe
, h7 t9 d' J5 I, Pdata = pd.DataFrame(df_tf,columns=te.columns_)5 U0 J# t4 `" F6 C, W; n" A
#3.建模
0 k; K8 Y% |$ t  k1 o0 Y( \+ J#利用 Apriori函数,设置最小支持度为0.2$ Q' J" y) n) {4 R6 d8 L6 L
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)8 H3 z; }% l6 k  a5 M- v, \
#设置关联规则,设置最小置信度为0.15
7 ?8 X" `* y) x3 ytemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)9 S* n6 ~3 c$ t. v
#4.剪枝并控制输出1 F4 Z. Q/ Q+ p5 J+ ?- H
#设置最小提升度,并剔除对应的数据# {  J* Q) r% c* Q( @1 \
min_lift=1
! p( \: i% u( s( e1 \7 I2 \rules = temp.drop(temp[temp['lift']<min_lift].index)
$ V7 d# e. W3 P8 Z. A. P+ |#筛选需要输出的列8 ^% E* _6 w/ ~% G; l
result = rules[['antecedents','consequents','support','confidence','lift']]' E; W# h* c4 S2 j% X* ^# v1 T
result=result.sort_values(['confidence','lift','support'],ascending=False)6 H. s  K4 ]7 [/ t& H! l7 D
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
4 b! C  r, a0 \5 \& |( G
7 R. \1 x( L# A' ]- v4 g/ I3 p1
' ?1 P9 i1 G5 q0 \2 `0 T2$ a" _' L: E3 |" Q
3+ Q6 J; u' |" ~. v* z
4
2 @1 K% O6 i; S( @0 _# q/ O) }55 o7 j/ `7 W( I6 D! M0 {$ e6 ?
6
! s0 d7 x. w9 |# Z71 z  P( C8 ~, |* l' N" p, m$ B5 V
8; T+ r$ \# u. v2 q3 U( z
9
1 i# Y! E0 h$ l; w) T( t) r104 L% L7 W1 D, V2 y4 _8 P
11+ K: ~* c$ n1 d5 A
12: `: R+ e' {& T/ Y* L& u
13/ O* Q/ T: w* ?
14
  x3 o7 G8 J+ G# ?' C9 C5 m  D15
6 N$ g$ ?% }0 Q. w8 E5 q169 t; W$ w" f3 f+ L( z& X
173 M  R- v4 Z/ y+ g8 z
182 x4 o/ j# \5 M8 O
19: ]3 F& s9 |1 G0 j/ e( P
20; Z/ W) S! L' b8 ~
21- q) N9 y) `6 D# m$ D6 g8 b
22) @7 i0 ^3 v6 I" o6 t- t' _( y+ w2 Q
23- }+ h/ }4 o' U6 G
24( N. \0 t. C+ O$ A& S
25
6 @. d  y. A3 }# @. p9 e1 q26; ~! k& Y; u& |9 c) r
输出结果见下图:
' I4 r  d7 b) K/ U* w( i; g, l! h' a% M& _& }
————————————————& }4 B# ]4 n4 L3 R
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: K/ J) ^) H2 i% Z) }
原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207591 m9 U9 j: v8 D: H$ n  G

8 }8 ^2 n+ {! m' E1 T3 P! E" Y, e8 U9 h: a/ R





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