- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 560035 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173383
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
% X2 e! X% s" M8 ^6 I) k9 |+ Q4 i: Z
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。; O; F' b/ @4 s8 ^! z4 x
$ u( d( {# s& x8 k: U1.准备工作
; S [0 H, b4 q# S0 U% [如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
/ H' o5 E( U: b+ B2 Z( R! g5 D: j3 ?8 \6 ^
pip install mlxtend2 R) b1 A; }! y3 x1 t( D6 y/ k
1
" G9 l; L8 z# c/ p& a. s6 P6 L. e为方便进行过程的演示,在此构建测试数据:
, m# [+ Y3 O# K# I# [5 g6 M% t
' Y3 |8 {3 C! m& x$ n! Limport pandas as pd1 q M5 M% j. s
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
; M: Q8 M& B1 Q' z1
0 C! `% f8 g7 D( f3 f" ?0 J5 c1 G25 E z9 l- j" U9 Y3 W
测试数据截图如下:. c3 q8 ?5 t( p! ^# L T0 I
+ m O) T. {0 v g- E" C9 F7 ^7 f# U k" N! l3 X; K
对上述的数据进行以下处理:
, N; L; k+ A$ b& ~4 c( p- {$ u1 t2 M3 A$ q# g
df_chg=df['product_list'].str.split("-")) l* j9 K3 N: C; @
1
; y0 I0 [- S1 V0 V数据处理后,结果截图如下:9 M, g8 w A0 Y4 t5 J; t1 Y
$ i( G$ Y( t) @( g1 s& ?
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
) H- Y2 u( M4 D* X8 ]. `" |* f" Z+ l. y
2.核心函数及代码
1 ^, {; N$ \+ I* w @6 T2.1 数据预处理9 k0 M& n0 N# Y1 s5 B; t
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
3 M: f' ]6 _ v. P1 l, Z, e" b
! C! f5 @6 ]* n0 k+ w#1.将传入的数据转换为算法可接受的数据类型(布尔值)9 l4 Q. W ^! R$ U7 T1 E S2 _
from mlxtend.preprocessing import TransactionEncoder4 u) K2 T! \% j( s6 j, \2 T+ F
te = TransactionEncoder()! O* }8 U+ }- ?6 P. ]- ]
df_tf = te.fit_transform(df_chg)( X; \. D$ I* F. p C" \4 \1 T$ e' k
#为方便进行查看,生成dataframe) n% U9 i9 e7 U
data = pd.DataFrame(df_tf,columns=te.columns_); y" Q9 ]- T" q1 j1 ?
1
5 b: \* C T; k) i# a# Y; a& u2: _* B4 l @) ~9 j4 a5 e
3
v6 W8 ~, l* M1 n, |5 H4
* H {0 j8 u7 c/ U) H" s/ C1 p5! k& `: H4 t' T* j! X& Z7 T
6
: j1 I' w) f4 M# u运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:0 e" d+ f/ i( }/ _
% S2 @) }8 {; u
. X# Z' K$ Z" u- K0 a2 p& U1 _
2.2 两个关键函数7 @4 H0 J7 k) a, Z0 u
apriori函数$ P2 t1 `) W5 q. |9 |' E
语法:
- K5 R$ w7 i6 C" T9 T7 g6 X+ B; J7 p
: h, ~ O. j# V0 K0 \* s% mapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)5 {7 D* W( c$ S% B; b
14 k2 B6 T- L5 V f
参数详解:
; ]9 m* i, n. w9 R# |% @) A+ V% R3 t. I* p0 |: d5 }2 y
df: pandas模块中的数据帧,DataFrame形式的数据;" I' d6 L A3 D2 ~9 x0 N
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; N# T8 D: t' f% m9 D- u- m
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。# p8 B! q$ z6 j, \4 X$ ^8 I
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。$ a9 |/ X0 |/ s' b7 ]
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。+ q8 Z2 }6 \7 H/ x6 |3 q* I
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
# r# ~* K3 |: rassociation_rules函数
, \7 v6 `4 e- g语法:
# S/ w. O* C+ d: i% `4 n8 A7 g; M1 ]& `* w: Z) H& P. A, }
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)! y: C8 R) O i4 u5 A% o& t0 S
11 k. D: n }4 v6 G8 \
参数如下:5 F% |8 k y+ I) K
/ q0 D2 H$ g x' C3 o; p. ~
df: pandas模块中的数据帧,DataFrame形式的数据;4 H6 Z% F2 W) J ~4 p5 p* T
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
$ j) u* Y A8 U4 J. e" z, _min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
0 m0 H1 H5 \% ?6 k. l, Ksupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。* q5 G+ W2 U: D. E( E. V
附带metric几种参数的计算方法:* ?8 h3 ~# S" S& ~5 x( }
; N6 o$ \& s, jsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
& q) H% I' Y5 K* L9 h% F3 U2 m. u0 Y$ E0 B
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
; D! c9 I+ `# I0 h8 K n
8 G' v' d. }: Y! qlift(A->C) = confidence(A->C) / support(C), range: [0, inf]
" l/ n: p4 q: p# H
1 |% o1 O; [4 ^" Kleverage(A->C) = support(A->C) - support(A)*support(C),
. @! d7 U- s" h+ |( h1 V. Mrange: [-1, 1]9 D" W4 X( v. p; D
2 O& Z6 I3 y9 @; c
conviction = [1 - support(C)] / [1 - confidence(A->C)],
5 o4 _' K. P& f$ O6 Irange: [0, inf]/ S3 |# I1 O E I9 n9 l# v
3 B0 F- u2 q3 \+ V& V& M; i5 e: ], n3.实际应用案例
2 N4 _9 x: @$ n6 |9 j- {以下为完整的调用实例:7 _- [; e6 l; m
# b+ T M z0 k; \+ O/ A. X: N) o
import pandas as pd% P! ?; y$ r* C) Q3 ^- Z
from mlxtend.preprocessing import TransactionEncoder
( R% g# R% X1 ]2 O/ Z/ F Vfrom mlxtend.frequent_patterns import apriori! B5 ~# i3 A% I$ q
from mlxtend.frequent_patterns import association_rules
6 m5 x; t$ c P& s- w4 x: e, r3 M#1.构建测试数据% f1 o, R3 N& o1 M9 f' B
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
/ S- d: Y# {: @5 W( M+ l( Hdf_chg=df['product_list'].str.split("-"). T# k& d5 u$ X7 L) ?3 m1 {5 M; G
#2.数据预处理
2 o& \* \* u4 L9 ?7 t( L( v2 x" R#将传入的数据转换为算法可接受的数据类型(布尔值)
* w5 }. J4 e) V7 g! [5 Ote = TransactionEncoder()
- s$ T. n( H, g7 Z, i' }df_tf = te.fit_transform(df_chg)
( E- f9 q0 s) b6 P6 Q: S1 O#为方便进行查看,生成dataframe
) ~8 A8 w/ m' @; _4 P, gdata = pd.DataFrame(df_tf,columns=te.columns_): E' i6 P5 _; s2 O$ Y: S
#3.建模
+ S( h t4 s; h3 q# d8 i$ c#利用 Apriori函数,设置最小支持度为0.2
^. Y+ ]5 f% E# G% l2 S5 |frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)- V; J0 }4 _5 \7 B8 v. y9 q
#设置关联规则,设置最小置信度为0.15) n" O2 y" Q/ W( R
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)/ q5 N/ i/ _7 L! I/ @% |$ W" n! G- D0 V
#4.剪枝并控制输出
% e! N8 V+ y* x" R( f4 t( u4 F#设置最小提升度,并剔除对应的数据( H. x( k0 G; t% o% M
min_lift=1
: y7 s( I# M* }: ~- J# A% brules = temp.drop(temp[temp['lift']<min_lift].index)
) w. J* i9 M& N7 G, G#筛选需要输出的列1 [) A# s5 S. J( s
result = rules[['antecedents','consequents','support','confidence','lift']]$ Z8 K. U- R7 B2 L/ O
result=result.sort_values(['confidence','lift','support'],ascending=False)
) J4 `4 v; s3 E @& |result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
- p0 `' v) ^( ]8 S/ P- g8 e& s ~# e; n, J
1/ ]( n% k- W! Q5 h
2" a. q5 I0 ]9 O: t+ Y6 K) e
31 e, ]$ D. |) h: `; \
4
5 H$ |9 T0 y" X% d& M, E8 k5
" n& q( X6 l! X# L& Y2 C$ O6+ X1 E, G1 z9 f# }3 ^: c! \1 s
7, E% Y1 `+ f' |. c+ S& E# h9 ^& d) c
8
3 q" v3 k: z8 f! O3 C% Y6 j9
- G# F4 |4 N- X. \, y' {10, R# f' n1 q/ C" E
11( `" O, G; \7 c* p0 B( h
127 H9 G( R3 ]4 [* Y' {
13
9 [/ \3 ]+ p0 ?5 k. x* ~14" ^# U3 m: H; D D3 m
15
7 l) E/ G5 o0 p* k4 s16( v+ _7 W9 C/ Q) M+ @0 s; k
17+ `2 k+ I' f. H
18- t- `, J: z3 A) L6 v2 P) F7 X
19
( k8 _7 H" o. k20
+ v1 o7 G% o |- b3 Z5 R21
8 x2 F$ F2 U! e* ?( \22
4 D3 w6 q& i* V' U* r+ C. M233 K0 {. x. E3 t$ K; o' A1 F% w
24
+ W1 b! J( B. C, f Z25: M1 c# b% ]: R* i$ z
26# \# c# Q$ V L# A) t
输出结果见下图:
3 f# s( ^% m; M4 H
8 v# h- j: X/ C" X9 x& r l. T————————————————: f! \# n# k0 S5 n
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 N! g- {" G1 u5 d) R原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759+ p1 d0 [6 e5 i: a8 d2 C* Q/ L
) w; e! p/ B9 q3 h
( e" p' l# n: x3 S( F. ~$ _1 v |
zan
|