数学建模社区-数学中国

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

作者: 杨利霞    时间: 2022-9-12 18:44
标题: 数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇. w) v. H, h' K0 x" E
3 I. x) {1 ^! p& {* p1 b
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。9 J; ^! n: p8 H5 ]
; g" Q0 A* C0 s
1.准备工作' s0 f# o* k* F3 J
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:; B, n. `. K7 `0 I8 S7 p

- }! g8 g% l: n5 rpip install mlxtend# ?8 q8 S. i. L. @' U' J* c4 M
1
1 u" [' V' I' d) s2 g" }为方便进行过程的演示,在此构建测试数据:
+ O' L3 R. {, r. D3 f, [2 ]6 X0 R& T0 c; x1 w, j, o
import pandas as pd1 O, t. k" F/ R: G) Y9 O
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* B+ @* k6 h; Z' k
1
' O7 H$ q) [) G) Y- c. ^2
9 i- G6 W# @& k& g) C+ u测试数据截图如下:1 Z* _8 K3 N& S! [: \9 d3 s
3 X# j2 H9 t" e0 s8 _$ R

3 I* D& g0 S: O* i, H- O; N9 w) d对上述的数据进行以下处理:
- ]( X7 ~1 Z. v/ b; S. L8 G* @
# G# l2 C0 Z* _) }; O& l# pdf_chg=df['product_list'].str.split("-")
* K' g, [' b0 G10 D0 ]- N) Z9 \, G+ p
数据处理后,结果截图如下:- g, e9 ^. Y/ U

! h* t; d4 e5 i/ t" W' T截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。1 g/ J8 z' }% h8 ^
2 \( e$ K. H/ a! ]' L0 p% Q7 N
2.核心函数及代码9 {9 ]+ j& F# T4 H$ _5 k
2.1 数据预处理, Y/ T# Y# V6 f5 o( q
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
! W7 n- Y5 W- u2 E& \0 j% V  u6 S5 c
7 D+ P! D( z( v& r2 j#1.将传入的数据转换为算法可接受的数据类型(布尔值)
% I% b1 B1 l# c  D# Qfrom mlxtend.preprocessing import TransactionEncoder0 g" k/ e% ^6 Z" ?& V0 U3 U
te = TransactionEncoder()
6 d2 ?9 i0 y' n5 F' Odf_tf = te.fit_transform(df_chg)' E' _+ i' P5 V" y! K* A, C
#为方便进行查看,生成dataframe
8 l* h2 p1 d2 w) Edata = pd.DataFrame(df_tf,columns=te.columns_)
' o9 i' W4 ], D' N' r' ]3 t1, E& J( ?6 [% P
22 ?$ x- b9 |5 I
3
: g* s$ S6 x# r, [6 x40 j( z% r0 F1 L  Z' u
5
. q; S8 G' }. H61 I% p6 R! m6 @: F/ ~+ [( k
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:: `' P3 g2 |  Z$ p  z" {

; q* r) [6 r5 [9 R
$ m4 E! c* h' W: g) I' L; m( c0 ^2 A2.2 两个关键函数! O! j" F  y& K* v
apriori函数
! H4 d. T( x! j) j6 L语法:
1 E0 Q5 n1 y% x8 h+ M5 O% E6 f* q' R( ?: n8 k$ ^  h9 m2 O
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)* ]0 q7 ~) ^1 U- i7 Z$ ]+ Z
19 N3 i$ Y. r+ C% f
参数详解:# w! W1 L2 n4 x8 u

7 ?  Z( V( E: O, _' n; Tdf: pandas模块中的数据帧,DataFrame形式的数据;
2 S9 _; X) R1 w4 Gmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。9 @' P/ ~, ~5 n; T% v' o: K
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
. ?1 [7 i- [9 F3 P+ Kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。! b8 ?' h. _( V4 f# [) d
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
% Q/ N# q8 |8 C  m$ @. Q' O& }low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
- l) V/ ^* O) g2 Y" ~, l& V# Iassociation_rules函数
' E1 w3 g- P6 }+ `语法:# d' q5 F6 {% I) t$ h6 Z

+ R/ J$ i. R2 `/ g% uassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)' d3 ~1 \2 ~+ p) y: h! w' [4 T
1
' C+ I: _' n* W, T3 B, v+ q$ e# W; y2 [参数如下:
% U  I4 b+ j- H2 b8 L' _5 x! D' O8 @- ~0 F# V2 g8 @; O% w
df: pandas模块中的数据帧,DataFrame形式的数据;6 M. @4 W- ?" \. I
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’; O2 p2 ~9 D" }$ y) v' D2 r* ]/ n
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
7 \2 H8 K4 C) x$ Z! y& x- t' \& msupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。  u- z( \% X1 y6 }9 }
附带metric几种参数的计算方法:
) |8 h8 i" Q. E& S3 e5 X1 D1 v0 H2 \1 s& {5 m$ v; b# G) f
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
+ i; A" V, J, _' [9 j4 m3 x! g% u
+ X" A/ K: b% J' j5 \# l4 Xconfidence(A->C) = support(A∩C) / support(A), range: [0, 1], s( n" k3 |7 U& S( {9 M! }

5 f" z6 i( P2 \* ?lift(A->C) = confidence(A->C) / support(C), range: [0, inf]1 ]4 f- ?3 s( Z6 c* f
9 c* D% r  \4 a0 n9 K+ u
leverage(A->C) = support(A->C) - support(A)*support(C),
" g( t* ?. ]7 s+ @! L$ l( S4 J: prange: [-1, 1]  x# Q8 `" C& ], B6 a& }
. O+ H: t: `( e2 K
conviction = [1 - support(C)] / [1 - confidence(A->C)],0 Y4 Q2 T; h$ H  X% Y$ U: W
range: [0, inf]
8 X; d. [8 H" }8 g/ |. I: [# B; G2 K: {7 h  ^9 U2 A* M# H5 N
3.实际应用案例
. Z0 V: L3 r+ y' q以下为完整的调用实例:; @1 B- @. T& I9 n0 m
& \' r+ D) K8 M, B5 F
import pandas as pd) a- B! d% w) K
from mlxtend.preprocessing import TransactionEncoder# [/ {. p7 V) g2 l: \0 `+ P* f
from mlxtend.frequent_patterns import apriori
& I. g0 w. p8 r) Z& hfrom mlxtend.frequent_patterns import association_rules
. S' P7 e/ z3 s8 o#1.构建测试数据4 c9 _; ^# S- v% t6 Y7 R0 c
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
6 h' i& {/ \( W7 ]" D6 ]df_chg=df['product_list'].str.split("-")
2 l3 {  D# u6 s7 Q* v5 |#2.数据预处理5 P/ \+ a& B$ |( e
#将传入的数据转换为算法可接受的数据类型(布尔值)% g2 {, g+ K" {
te = TransactionEncoder()# f/ L/ x6 [0 F/ M3 g
df_tf = te.fit_transform(df_chg)
7 i" D! U; L& U0 x$ u; K#为方便进行查看,生成dataframe# s5 G+ Y; R" [8 v! j5 T8 ]+ \6 w
data = pd.DataFrame(df_tf,columns=te.columns_)) G$ ]: g% g5 G( |1 H  q! _. ^9 [9 X
#3.建模( H( f3 Q& f' T5 M0 ^
#利用 Apriori函数,设置最小支持度为0.2
- ]3 z6 g4 Z9 B: T" l* ]9 sfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
2 {' V. q, u  {( h#设置关联规则,设置最小置信度为0.157 j: [* \9 q6 v
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
9 c+ f: m1 m9 [. m9 q' x#4.剪枝并控制输出
2 T% p1 i* Y6 b, ~0 B" y#设置最小提升度,并剔除对应的数据; t/ M$ m' u4 W1 {2 A- K
min_lift=12 W: X) T2 ^# I1 d
rules = temp.drop(temp[temp['lift']<min_lift].index)
2 w" [/ V$ X& R" I#筛选需要输出的列$ m& V9 O; R  f2 B+ t! o
result = rules[['antecedents','consequents','support','confidence','lift']], P. e$ g1 K) \/ D6 c
result=result.sort_values(['confidence','lift','support'],ascending=False)% I: B/ i3 m" I6 i; d
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
1 m& T4 C( q) }- m% L5 z1 y5 i: o2 K+ \0 c# o$ l: E
1
/ S$ ?8 P% ^1 X5 d/ x2% }# D3 Y/ k  s2 B  v5 H$ A
3
! Q+ x! N  O4 x; m# h4
6 e; ^6 F( U4 l  j! p0 g1 \5) S8 D: p9 E2 R9 U6 R  k  p: g& ?/ |3 w
6/ z" C$ d& ^( U+ |" Y: J( O4 A
7
* o5 F. j; Q2 E5 G9 E8- p) w2 Z- h, @" V3 F0 ^- D
9' C: L1 B% M' {. u: h9 G6 p0 w
10
+ a7 z, g# I1 F2 e( K8 c9 R& w8 w11: c- `: v# k3 @2 |! Y; l
12
7 y3 d, i+ S8 }$ N2 K13
- \! n# K/ p* |% ?! p5 x1 w146 O8 ~$ d: N, [
15
2 e/ W  p* e* W/ i% @2 Z6 y8 u6 z167 d. e% B9 g$ v. F1 T2 A: y9 W: {4 s) w
17
; @& D! ^  f/ t) r0 v# s0 d18- L# z& {7 B& r/ q+ }
19! F7 e6 m1 h. {/ W- ?) C/ t- K
20
) |  W* I3 o+ H! U. Y4 V+ T21
# w3 E/ q- \7 Y8 X1 n! m/ w. b$ x22
" F; H/ q/ `# i  u$ b- e2 o: S23
( s/ ^9 E; S8 S0 D24
. v+ g+ T& Q7 m$ o257 v+ O6 N+ [5 c3 {3 I! o( ]
26/ p. R2 u/ Z' J0 l. H
输出结果见下图:
5 b4 `- r- K0 Q; k
) E! n5 o: u! V: ]( k( N————————————————# V3 c- ^- `4 S5 D7 I6 b
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 m4 K- n- n( g( B+ t+ _% g原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
! O# l) d, R2 D4 Y! K5 s
: h9 s" N( F5 ?6 j2 n1 r+ ?3 x# `" {: `& a





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