- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 556555 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172339
- 相册
- 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算法篇
" w( ?; R2 q* ^1 a; }6 O+ n, V1 I
0 h+ | g/ C* N% S8 y在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。( Z6 D; t6 [3 ]- w; T$ S
! \+ M% S& s" [* \1 `: O: z1.准备工作, X; ~* s0 s! |5 t
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:$ l7 G8 J/ m0 q T4 [2 ^3 h. k
- R9 i, x% z s. z1 i2 r
pip install mlxtend
, C6 F0 F* E" i. Y9 z1 F) d7 [; [) p: s- K
为方便进行过程的演示,在此构建测试数据:
7 x) f6 b+ Z) H" q0 f6 f' K; v5 [( ~) O4 u
import pandas as pd
: Q3 Q& d x: G3 Z. Jdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})( B x% V% L" b. l# J0 i
1
0 P+ y1 f# ~4 x; v* @2
3 a2 a/ s+ I/ x7 o" D o测试数据截图如下:
4 h9 v- s/ a+ ]; J: v% D
+ y0 Q! C# p5 Q3 \' Q) ?1 s
/ R+ r- G& p6 P4 d$ [) n7 Q, I% V对上述的数据进行以下处理:% M% z: M, [, m2 U, K7 n6 r3 r
! r. `# m# `! ~: v: zdf_chg=df['product_list'].str.split("-")9 ~& d X9 t' ]
1
9 Y4 B: [4 f2 C: a; n: s8 l数据处理后,结果截图如下:
, i; ], L6 | `. {+ H* d& a
" Y8 E3 c; a: S* Z; S4 \截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
& h, Z3 B5 _% k/ o% t* O' w
1 J, W, A Z% A, A7 p( T- c* V2.核心函数及代码" d3 Y5 Z+ _" |
2.1 数据预处理
8 j3 D, E" M) ?- x# d! X对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:- I) }' X9 O$ r3 S2 `9 Y
8 d+ F$ v; {2 u#1.将传入的数据转换为算法可接受的数据类型(布尔值)9 K- ?5 `: [$ z) @% D1 W g7 O. C) t
from mlxtend.preprocessing import TransactionEncoder$ j3 H# ?. O1 z7 n% f
te = TransactionEncoder(): q$ }/ l( q: y8 C
df_tf = te.fit_transform(df_chg)
1 c2 ~) ~' g# T1 d2 x R#为方便进行查看,生成dataframe
/ ~3 N- _7 r% T' `2 [1 Udata = pd.DataFrame(df_tf,columns=te.columns_)
# l* q: o, Y% ~2 p; P1- R. k( a( i; b( p2 @ _$ u: Q
2
3 q. v5 s8 s3 K) A y0 G6 p- C% V3
3 J2 k, E# U9 w: h) _( ?" z44 q% p8 g4 u7 k- ]) o) ~2 H- t
5
5 W0 ^' y5 n" m" ~6
, u4 c8 @1 l3 T+ c$ j: V, f& y运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:& q4 V# x+ l4 Q& G6 c3 V+ J5 C' y
$ r I0 K8 P5 U2 C9 ~% k
. M ]. ^% ^4 }8 Y( `. J7 n. e2.2 两个关键函数
) l# w" b( L( `: wapriori函数9 U# A* [: A$ e
语法:
( d; G) _/ a$ o, Z5 j5 j9 t
. R6 O6 {) N3 X/ e$ P9 O0 f$ q8 v# eapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
2 O E: I" ?! u. V18 J/ U1 a8 m+ t( O; A9 l# \
参数详解:
0 }( n) v% N& g) a& r3 [) g2 `: ^+ h( v% j
df: pandas模块中的数据帧,DataFrame形式的数据;
2 W2 |- L8 J: Fmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。" G. A% {5 d) J) `+ K3 D% z+ ^
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
1 Q6 ?2 r7 o, C6 F, X4 Emax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。' Z$ y) o. \! S& V8 }2 K
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。9 ^& S+ T( [4 L3 W9 s/ g5 v
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。( Z9 F7 k9 K" c; Y+ |- x" a
association_rules函数
' v F J3 o' _. q0 @$ B0 T& ?语法:0 l- U! x& s1 H7 j; n& W
+ X5 j6 U1 ]" V, H9 H; J# oassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
- A2 t; A( A! o3 ?' c/ t2 E1! @, G* P* f9 K3 s# _' P% ^ N
参数如下:+ y$ Z8 D0 |: w
) e7 {1 y' \$ x/ ]3 \7 Vdf: pandas模块中的数据帧,DataFrame形式的数据;
; ?/ H4 ^6 D5 o: h% O2 V: Ametric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 W: z0 e3 f( n7 C9 l
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。" M- k- ~3 Z1 q5 u' S/ J
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
3 k4 Q( \) u9 ~) O z8 o附带metric几种参数的计算方法:2 m! ?. _2 V! T
5 N! u1 @& `2 Y# x J B5 }3 H
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
. }4 s$ g) }; }! I7 j3 c/ R" J. z7 B
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
0 s/ a) }( K/ k+ A, [* @6 E+ A& }; b2 S4 }+ A# _& T
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
4 A* }* {" f2 A; v3 M& q$ G: _ h2 {: ]1 q: {
leverage(A->C) = support(A->C) - support(A)*support(C),
$ a" P2 J1 t9 h% prange: [-1, 1]
h; K% o. J6 g9 c3 h8 Y! ], ?
' e/ d5 ~) c9 p: Q! |' S' n5 yconviction = [1 - support(C)] / [1 - confidence(A->C)],
_. f. {7 E; I( M: _0 G. D4 frange: [0, inf]6 k4 O5 I! W+ P& U1 ?" h
: P8 x" @& d1 n3 W6 G _* p3.实际应用案例
2 h, Z9 F7 @& ^ T$ H j0 R以下为完整的调用实例:
6 F" b. Y, V7 d5 o/ Q7 A3 [+ u; u: y1 A1 a) e; Y( g
import pandas as pd
+ z- A7 v. Y2 f- V1 u7 h7 k _$ ufrom mlxtend.preprocessing import TransactionEncoder
+ k. Y% f/ S( @, w8 Wfrom mlxtend.frequent_patterns import apriori# Z b0 P; }$ ?* O8 m" c( I, T& i6 P
from mlxtend.frequent_patterns import association_rules
9 I" O- p, c6 X+ F& O- }1 j#1.构建测试数据
, `2 d7 b! @4 Mdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
" a. T7 u& m3 u, Q, u2 zdf_chg=df['product_list'].str.split("-")6 w% f, A1 S* M$ h9 L4 L
#2.数据预处理3 ~$ Q$ {; J% i& p
#将传入的数据转换为算法可接受的数据类型(布尔值)
# N7 ?- d5 ^. qte = TransactionEncoder()
9 s, Z% \ q& y5 N! ~4 i. ~5 A5 jdf_tf = te.fit_transform(df_chg)
' e; u3 U. T" Z6 Q7 b0 p#为方便进行查看,生成dataframe
# a- F1 U# B% X$ L& Bdata = pd.DataFrame(df_tf,columns=te.columns_)
5 ~+ P- }. e/ }* `, E" _) a* B/ R#3.建模
" A) Q) U3 @) @! U) e9 |; m#利用 Apriori函数,设置最小支持度为0.24 S: A3 u& ]1 V8 l' i
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)8 m7 _3 w3 ]! d/ V
#设置关联规则,设置最小置信度为0.15
7 ~+ T4 u9 x- [/ etemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)( E5 G% k" n9 l* H1 @( M; W# W, k
#4.剪枝并控制输出. ?( e) N- v# s& U5 }
#设置最小提升度,并剔除对应的数据! E# D! G0 L4 M. }' W8 _
min_lift=1
, x: D* e/ C! krules = temp.drop(temp[temp['lift']<min_lift].index)
# {4 H9 g+ D: Y. m- `6 e. A, E#筛选需要输出的列
/ G% E8 M5 w8 {& K3 x2 Jresult = rules[['antecedents','consequents','support','confidence','lift']]3 N7 A& a, G$ {( s3 X. t
result=result.sort_values(['confidence','lift','support'],ascending=False)* b0 A! z+ U7 E: ]1 E7 D) t
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
( n! G- t5 n/ R1 Z
2 W: T7 S: n3 j0 V. B1
; A$ Q. ~# D' j9 f9 Y6 E9 K& x2
5 g* ~9 ?2 q% c* L! E% Z/ H! z. E32 @; r) J& ^, o' Q. k$ F0 m
48 n* k) J# Y0 W* ~# B
5
D6 g0 M% w% u' E$ V6
% J j( ~* D0 T, h7
$ ], s) w% v- u' r& G) H' o6 C8 h$ @8
/ i% {' }4 h# } L90 i: @$ T4 H6 ]% x0 x# [2 C# P0 p
10% A$ m, v" o! L6 b" C
110 D$ _8 R( ` g [
12* E& Q& ^' }" A& q& n
13- F- J1 D% F+ O: m; z m
14
! _# V. h1 c8 `; ]9 i0 F15
7 x0 F# U2 z! g& m16, H2 U8 X- @+ M; a. L3 Y: ?) l
17* b7 K; R7 l% X$ x- \4 r, Z
18
5 Y! J9 o- F3 a7 T9 F19- @% P: A( [2 ], V/ K# |
209 T. b4 ]( e2 U" U& m* p
210 M& B$ n! G& ^
227 o: D u- R' H( V% l. Z/ J( J
23& n1 G7 e3 c8 F7 H0 Z6 @
24, ? P, ^, @; [$ }* Z! c
25
0 X/ P9 u) `! Q! I+ W5 ~267 V4 o' k1 A8 {$ w' R
输出结果见下图:/ X! ~: l- R0 C6 r4 S
0 \8 W( a( g& a4 Q5 l————————————————
) j$ V5 N4 N; F0 A7 r& U版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。) G3 e) r9 C! n/ Q4 q
原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207596 i( b) o$ o. F0 f0 |" v+ X. V
8 v/ e" z! o' A9 c# q- d" ]. e6 E, T0 G- Q+ P% {; _
|
zan
|