数学建模社区-数学中国
标题:
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
[打印本页]
作者:
杨利霞
时间:
2022-9-12 18:44
标题:
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
4 ^( F" A/ q% w3 x7 T% r! E5 {
! l8 D, Q+ G; X3 s, g/ V6 \
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
& r& V6 M8 L" j! z
; P, w e9 z! N* N! p4 T
1.准备工作
& e. `% d9 o6 Y- x
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
# q D9 [9 `1 I: ~6 e8 V3 D" Y
B0 f! Z+ e* c- ]( i& W
pip install mlxtend
7 j5 R# A9 Z- }) c! R0 s
1
/ Z }3 A7 v3 e
为方便进行过程的演示,在此构建测试数据:
7 p/ Z$ e+ o9 T& ~+ u8 W( `2 w) m
2 s! j/ {" O% B. u# ~
import pandas as pd
, S% p) ?( V; q+ U* W( U2 `
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
- H6 m# W! f) z* A- q( Z* @) n
1
. V0 d8 N. \ i/ W! _6 u/ q
2
4 W/ D& S' U; h `* _) K' g
测试数据截图如下:
+ B) U! d+ c, o2 _* s4 _; J/ s1 m
1 c" l) a: D, L. T7 i
9 @/ [ p P6 `9 O3 k
对上述的数据进行以下处理:
5 \+ y$ A) P' [/ k d
3 v8 B+ N7 P# E' L$ J+ f
df_chg=df['product_list'].str.split("-")
- v9 h; P* G5 D$ f
1
* j( O: r. a- a' ~
数据处理后,结果截图如下:
9 Y% K' Y0 J3 z; @
) \; k8 W, o6 \4 P$ Y1 j
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
3 f0 l6 G+ i- e' B8 |/ Q- L8 w% P. I+ J
5 f+ K% S" l' T" t2 G
2.核心函数及代码
6 L8 ]& G+ z y$ U; W, K" ?
2.1 数据预处理
! R. R1 ^6 T7 m2 m" a4 O0 B$ o
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
' i; I( M8 [- J+ {; b- ~
! `! J" ]. k; i0 [* ? [; W6 f. Y
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
. I- R$ T. }/ u' ]
from mlxtend.preprocessing import TransactionEncoder
! `% B, z( `& Q# E# x
te = TransactionEncoder()
# p' s) r! a, Y! S/ p2 _2 A
df_tf = te.fit_transform(df_chg)
& p/ C2 n- r# m& I0 O* J8 B' ^- T
#为方便进行查看,生成dataframe
/ h* L5 L6 F# B/ Z! G. @* C
data = pd.DataFrame(df_tf,columns=te.columns_)
; D! w& p0 L/ z' v" r5 V- v: X- ^
1
8 f+ o$ Z4 e# W: H. X
2
0 q3 S9 S2 E8 U; p4 m8 |
3
1 i# n5 G) h: D1 r
4
8 }& ^9 m- m; i0 a0 `" G7 f- p1 O
5
5 C8 i5 C* q. T1 F& S7 u
6
: a" y- k9 r- f3 V8 |
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
/ ]# W5 O- A9 N( O% x" Z* J* s& b7 |
# g2 R6 p6 r: D2 c
" T$ |: b; e! w* }0 K7 K
2.2 两个关键函数
/ u( p2 @# N% {( M; t m
apriori函数
, h" }4 I& C2 M$ {1 I
语法:
1 f5 N- L6 q& m" J0 `
% i( w H& ~0 a. \* s) @' b% m
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
3 T& `0 D5 c8 b" t3 {
1
* i0 s8 z, E9 I
参数详解:
8 _2 U% P. q2 D2 N1 z
( [: A1 j$ y2 H1 H. d) p# f
df: pandas模块中的数据帧,DataFrame形式的数据;
, F7 |$ u9 k/ V: W# B' |
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
# o" Y% @# b! z
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
$ b$ E& r( z; S7 `# m, F
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
3 _; O/ ]# R/ ^$ `
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
( @9 w( v3 j+ R) F* r9 r
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
+ j6 A* V( A" M: _
association_rules函数
1 k/ R' d$ h7 e1 y* p/ b
语法:
) P4 l3 }) o: `" T% E6 x6 T2 c1 n
0 a, D; t3 Y$ c; N0 S/ I1 [( e! F6 J/ K
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
" D) ~+ E# O( F/ {5 x/ d3 _
1
, H1 Y. \2 r% S: ^8 z
参数如下:
/ O. V7 y8 c8 J" n, P
- y5 ^: n, E4 G( ~* Q: B7 |! j" A
df: pandas模块中的数据帧,DataFrame形式的数据;
* n: x3 U8 D' h% W3 n4 L2 u) q
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
6 H8 `: n: c0 k; O/ n ^1 ~
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
5 Z" [2 D1 T% [& O. m
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
T2 n7 Q8 m5 L' ?
附带metric几种参数的计算方法:
5 n: q' u* v& B' k, Y
/ c3 `8 L2 u+ N: u- W9 |( b7 g
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
5 T" r: Y* M4 Z9 O9 b3 E
2 }/ |$ e! Z+ v6 Y: b, E
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
, v M" S& _- }( f( Q0 \6 L
0 [$ r' h) A% {7 I' s
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
, k( y- S3 V6 L+ F/ ?
$ U8 p5 l( m$ H, Z7 q1 B- W
leverage(A->C) = support(A->C) - support(A)*support(C),
' L8 k4 O j) g. v7 j" Q1 E
range: [-1, 1]
' y' I' @7 q* e6 H( g6 ^
% M) T2 D. }7 ]( N
conviction = [1 - support(C)] / [1 - confidence(A->C)],
6 Q4 i0 X. ?; P( d
range: [0, inf]
6 U6 Y1 Z/ |$ j; M
" Y. N, b. a" l
3.实际应用案例
* E! ~) w1 s+ _! F+ D
以下为完整的调用实例:
) n' {7 Q. J4 e5 e
/ e ?. I' O0 j& f
import pandas as pd
8 ]' l% @) o, {7 u/ y
from mlxtend.preprocessing import TransactionEncoder
( b$ ]3 h$ ~" @6 |" V3 K
from mlxtend.frequent_patterns import apriori
; Y2 p8 t8 U; v F: J. {) @) F
from mlxtend.frequent_patterns import association_rules
/ M$ \# }3 {# X. n$ ]* l! ?6 \7 p! N6 p
#1.构建测试数据
- b4 k* m* ~5 Z9 w
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
# p; N7 R3 Z! x
df_chg=df['product_list'].str.split("-")
& |/ A4 y& U. n2 J3 L R' ?( Z: _
#2.数据预处理
5 k! U6 \8 ]. C" J }* a; m8 N
#将传入的数据转换为算法可接受的数据类型(布尔值)
9 |6 x8 l9 G: h, ^, e j- |' U) e
te = TransactionEncoder()
7 |" T0 w+ w# L. ~
df_tf = te.fit_transform(df_chg)
+ y1 ]. u ~+ t4 E
#为方便进行查看,生成dataframe
* a0 V t7 e, k0 s' X4 a! q r
data = pd.DataFrame(df_tf,columns=te.columns_)
% `1 K0 v' H' P% j
#3.建模
' @4 ^& Y6 I L, h; g
#利用 Apriori函数,设置最小支持度为0.2
, j2 ~5 e/ K% p* }% s
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
/ w8 \( p8 B$ Q2 A
#设置关联规则,设置最小置信度为0.15
; N! |; a; y( G' u# |3 m
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
. C/ O: j* P( P
#4.剪枝并控制输出
/ C- K$ @. A. G. ^8 @4 B
#设置最小提升度,并剔除对应的数据
& z: ^0 u; ?+ n9 I+ W) `& o
min_lift=1
2 I3 D) s6 e3 R# s. e. D
rules = temp.drop(temp[temp['lift']<min_lift].index)
4 m, \: s5 o9 F! |) o' S
#筛选需要输出的列
) d3 d$ x/ [& ~
result = rules[['antecedents','consequents','support','confidence','lift']]
- b7 l: |5 h, C4 \6 K y3 I! K
result=result.sort_values(['confidence','lift','support'],ascending=False)
# {+ r4 Z3 ~4 z* S4 o4 h/ o
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
f/ |5 H* ^* Q' o
3 D4 I6 i' ~4 \) u7 j
1
' d' g( G$ ~+ E9 y( H) V0 L, b; k
2
$ A4 P- R0 q6 H' \# q0 K3 v
3
~1 F, ^9 u$ X. q( B s2 Q& d# C, b
4
1 I: |8 `% A* b9 b) t$ r: `; X7 N
5
9 q- Z8 R0 r# c" }
6
3 L' X) y' M0 z) @, W3 T5 k2 V
7
4 K; E& P/ f$ K( `- j
8
" g% c$ v; H0 {* c5 P1 j5 E4 f
9
3 c7 Y5 A F! C) w. C" {
10
; M4 W& H3 J9 q8 H
11
v& ]! `0 y) O T3 d" d4 K
12
& H% C4 p/ I& B5 p M
13
1 E( X H$ [3 `9 }9 g! X- X
14
, B2 P/ d& Q/ o3 O5 s T M8 O
15
6 Q7 D4 p2 a' r6 ^% P1 ?5 h0 u6 H
16
0 S; ^# Y1 ?. y% ?' L5 X: _* R' T5 @
17
$ F+ f$ y6 v; a1 o
18
9 ?) K4 ]' F+ |
19
1 `$ _8 \ Y" ]6 l2 w
20
0 F6 k- s6 w9 l% |2 u% y8 o
21
/ T$ E7 k8 j0 q7 [
22
, K) o0 G( R2 X+ y4 R5 x/ f/ Y
23
0 d* I' G; ]9 o& F
24
! l0 _* s8 u3 n) G0 |5 V2 O. f$ D2 I
25
. }/ p- ?7 t5 L5 O
26
3 B) h6 a. b4 e
输出结果见下图:
2 M9 V- P$ M/ G! D
) p3 h& j4 |: {8 c& M
————————————————
9 X( d4 |/ u( V
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 ~) c) \, o% J- E
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
7 L0 M4 K0 j9 u9 R$ Z% \3 Q% S/ T
8 E/ ~/ Y) b: e( O/ \4 w8 l
# G, B ]9 s; G5 [
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5