数学建模社区-数学中国

标题: 数据挖掘——如何利用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 T1.准备工作& 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 mlxtend7 j5 R# A9 Z- }) c! R0 s
1/ Z  }3 A7 v3 e
为方便进行过程的演示,在此构建测试数据:
7 p/ Z$ e+ o9 T& ~+ u8 W( `2 w) m2 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
24 W/ D& S' U; h  `* _) K' g
测试数据截图如下:
+ B) U! d+ c, o2 _* s4 _; J/ s1 m1 c" l) a: D, L. T7 i
9 @/ [  p  P6 `9 O3 k
对上述的数据进行以下处理:
5 \+ y$ A) P' [/ k  d3 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 G2.核心函数及代码
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. @* Cdata = 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. X2
0 q3 S9 S2 E8 U; p4 m8 |31 i# n5 G) h: D1 r
4
8 }& ^9 m- m; i0 a0 `" G7 f- p1 O5
5 C8 i5 C* q. T1 F& S7 u6: 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 K2.2 两个关键函数
/ u( p2 @# N% {( M; t  mapriori函数
, h" }4 I& C2 M$ {1 I语法:
1 f5 N- L6 q& m" J0 `
% i( w  H& ~0 a. \* s) @' b% mapriori(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# fdf: 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 n0 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" Adf: 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 gsupport(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' slift(A->C) = confidence(A->C) / support(C), range: [0, inf]
, k( y- S3 V6 L+ F/ ?
$ U8 p5 l( m$ H, Z7 q1 B- Wleverage(A->C) = support(A->C) - support(A)*support(C),
' L8 k4 O  j) g. v7 j" Q1 Erange: [-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( drange: [0, inf]6 U6 Y1 Z/ |$ j; M

" Y. N, b. a" l3.实际应用案例* E! ~) w1 s+ _! F+ D
以下为完整的调用实例:) n' {7 Q. J4 e5 e
/ e  ?. I' O0 j& f
import pandas as pd8 ]' 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 wdf=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) `& omin_lift=1
2 I3 D) s6 e3 R# s. e. Drules = 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! Kresult=result.sort_values(['confidence','lift','support'],ascending=False)
# {+ r4 Z3 ~4 z* S4 o4 h/ oresult.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, b4
1 I: |8 `% A* b9 b) t$ r: `; X7 N59 q- Z8 R0 r# c" }
6
3 L' X) y' M0 z) @, W3 T5 k2 V74 K; E& P/ f$ K( `- j
8
" g% c$ v; H0 {* c5 P1 j5 E4 f9
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  M131 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 H160 S; ^# Y1 ?. y% ?' L5 X: _* R' T5 @
17
$ F+ f$ y6 v; a1 o189 ?) K4 ]' F+ |
191 `$ _8 \  Y" ]6 l2 w
200 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& F24
! l0 _* s8 u3 n) G0 |5 V2 O. f$ D2 I25. }/ 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/1219207597 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