数学建模社区-数学中国
标题:
数据挖掘——如何利用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 r
pip 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 X
0 R& T0 c; x1 w, j, o
import pandas as pd
1 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# p
df_chg=df['product_list'].str.split("-")
* K' g, [' b0 G
1
0 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# Q
from mlxtend.preprocessing import TransactionEncoder
0 g" k/ e% ^6 Z" ?& V0 U3 U
te = TransactionEncoder()
6 d2 ?9 i0 y' n5 F' O
df_tf = te.fit_transform(df_chg)
' E' _+ i' P5 V" y! K* A, C
#为方便进行查看,生成dataframe
8 l* h2 p1 d2 w) E
data = pd.DataFrame(df_tf,columns=te.columns_)
' o9 i' W4 ], D' N' r' ]3 t
1
, E& J( ?6 [% P
2
2 ?$ x- b9 |5 I
3
: g* s$ S6 x# r, [6 x
4
0 j( z% r0 F1 L Z' u
5
. q; S8 G' }. H
6
1 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 A
2.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
1
9 N3 i$ Y. r+ C% f
参数详解:
# w! W1 L2 n4 x8 u
7 ? Z( V( E: O, _' n; T
df: pandas模块中的数据帧,DataFrame形式的数据;
2 S9 _; X) R1 w4 G
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
9 @' P/ ~, ~5 n; T% v' o: K
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
. ?1 [7 i- [9 F3 P+ K
max_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# I
association_rules函数
' E1 w3 g- P6 }+ `
语法:
# d' q5 F6 {% I) t$ h6 Z
+ R/ J$ i. R2 `/ g% u
association_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' \& m
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
u- z( \% X1 y6 }9 }
附带metric几种参数的计算方法:
) |8 h8 i" Q. E& S3 e5 X1 D
1 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 X
confidence(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: p
range: [-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& h
from 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 s
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
2 {' V. q, u {( h
#设置关联规则,设置最小置信度为0.15
7 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=1
2 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 z
1 y5 i: o2 K+ \0 c# o$ l: E
1
/ S$ ?8 P% ^1 X5 d/ x
2
% }# D3 Y/ k s2 B v5 H$ A
3
! Q+ x! N O4 x; m# h
4
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 E
8
- 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 w
11
: c- `: v# k3 @2 |! Y; l
12
7 y3 d, i+ S8 }$ N2 K
13
- \! n# K/ p* |% ?! p5 x1 w
14
6 O8 ~$ d: N, [
15
2 e/ W p* e* W/ i% @2 Z6 y8 u6 z
16
7 d. e% B9 g$ v. F1 T2 A: y9 W: {4 s) w
17
; @& D! ^ f/ t) r0 v# s0 d
18
- L# z& {7 B& r/ q+ }
19
! F7 e6 m1 h. {/ W- ?) C/ t- K
20
) | W* I3 o+ H! U. Y4 V+ T
21
# w3 E/ q- \7 Y8 X1 n! m/ w. b$ x
22
" F; H/ q/ `# i u$ b- e2 o: S
23
( s/ ^9 E; S8 S0 D
24
. v+ g+ T& Q7 m$ o
25
7 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