数学建模社区-数学中国
标题:
数据挖掘——如何利用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 J
1.准备工作
: p5 m$ U/ s3 @8 r( f4 v2 T
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
) k" S5 M0 {# {/ L5 M
9 M% h9 n2 u$ E3 p3 C
pip install mlxtend
8 n, b, }$ L2 M% Z# F
1
1 G! r2 J6 q: \
为方便进行过程的演示,在此构建测试数据:
4 O j- R3 q* T/ @
! d, _. h) T) Y. R' F3 E& o' m
import pandas as pd
9 K0 r- T. B, e5 M3 E& N
df=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 ]; @$ i
2
0 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+ c
2.核心函数及代码
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 N
from 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 M
2
& ] i7 X L2 U& r
3
9 s+ X7 k% \! b; B7 z g0 j
4
7 z0 i# `- G+ M2 l; W
5
& q ?' Y5 `4 n, H! Z6 | F
6
2 \. 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 e
df: 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: X
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
9 }4 F C% ?: i' Y( c _, R: k
low_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% v
association_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& P
df: 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 g
support_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 s
conviction = [1 - support(C)] / [1 - confidence(A->C)],
; c( i: i" c W. I, V% h* K- c0 }9 Q
range: [0, inf]
" f0 M% ^7 Z# u5 {
1 Y9 V, o/ W0 C$ l9 Y. s
3.实际应用案例
% 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 apriori
8 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, P
data = 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 y
temp= 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 p
1
' ?1 P9 i1 G5 q0 \2 `0 T
2
$ a" _' L: E3 |" Q
3
+ Q6 J; u' |" ~. v* z
4
2 @1 K% O6 i; S( @0 _# q/ O) }
5
5 o7 j/ `7 W( I6 D! M0 {$ e6 ?
6
! s0 d7 x. w9 |# Z
7
1 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) r
10
4 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 D
15
6 N$ g$ ?% }0 Q. w8 E5 q
16
9 t; W$ w" f3 f+ L( z& X
17
3 M R- v4 Z/ y+ g8 z
18
2 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 q
26
; ~! 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/121920759
1 m9 U9 j: v8 D: H$ n G
8 }8 ^2 n+ {! m' E
1 T3 P! E" Y, e8 U9 h: a/ R
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5