- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564671 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174624
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇- D: e; h: ]$ z N
1 R/ k1 T: P( R, L U& i" D/ ~2 M在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
$ C' v4 O/ H2 f+ \
' n% R7 Q: n4 W# ~: A. l1.准备工作2 K5 k7 x s( u
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
$ H/ [+ p* j0 b" b# ] V" `: N* t# p9 M5 Q" p" c
pip install mlxtend+ ]8 `& x, h1 o6 G$ L* B1 ]7 g+ H
18 x* B" s/ k2 b5 i- O6 S7 e8 T
为方便进行过程的演示,在此构建测试数据:
' d1 A) _* y% \, \4 s: I2 j* j! B7 Q- \5 C7 u' ?2 @! D
import pandas as pd* m2 h7 r6 A9 F" U
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
/ D& w7 p1 i0 F% A9 _1
: V" J; N2 X: Q2
! t1 e7 n' R9 t3 M测试数据截图如下:3 Q2 p6 I1 w# b7 ~' O
, P/ j+ E) d/ `
2 k' Y$ _8 w$ i( p5 _3 P对上述的数据进行以下处理:) {/ g3 F! _8 ~; V( x; V0 ^ t
: f& T6 N& x3 e o5 D
df_chg=df['product_list'].str.split("-")
& f. |" d5 |. p. V( R13 y- r$ H0 D; l- B' m
数据处理后,结果截图如下:
. n" r$ d- m: x: O- B5 I5 `8 i& C4 N8 u/ f/ @0 Q$ Y3 _; d
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。1 D; W+ D% d5 ~- g+ o) q1 i0 l
# w, }$ B: [- T0 g
2.核心函数及代码
2 I# R0 h# Q' {6 S7 X" Y8 i! z2.1 数据预处理
. B) I8 ^, a0 s# A0 p+ \对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
3 c: k0 Z, N, R/ ^6 o+ S: D/ }9 k2 L3 a! d$ @( n
#1.将传入的数据转换为算法可接受的数据类型(布尔值)0 H3 _8 j2 [" ?; v1 q/ f3 e0 ?
from mlxtend.preprocessing import TransactionEncoder
6 c4 f) N6 j( ^+ }6 g- dte = TransactionEncoder()
: R/ s5 _: i; h/ bdf_tf = te.fit_transform(df_chg)+ d- Z; d# C9 F# i
#为方便进行查看,生成dataframe! ~- S* ~" w% G/ k/ Y Q/ R
data = pd.DataFrame(df_tf,columns=te.columns_)
( @' P! [' G% Z3 w/ w( x, ?1
6 h! L& {1 ]" O4 Q3 Y; P4 i* a2+ n1 ]5 z7 n% x0 Z Z6 Z9 m5 T
3
8 o1 k8 t4 K) O! j& m3 P; }$ P4 ^4# r# u" ]5 e. D* K/ a) X
5. K# @# C+ k" ?% |# Z
6
: y a" Q e- x9 Q4 d6 U# f1 f! _运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
/ W3 @5 R0 \1 z! f
% D9 i, x! f$ }' A; N% `! G4 n4 o% V& @5 `7 P
2.2 两个关键函数* B" D0 [# Z @- `% j @: o
apriori函数* A9 L4 J. b( y. t3 h* T0 p" n
语法:. ^1 k. ^( D. t
1 s) c* q, e( _' g) `apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
, D% q7 z6 p+ e8 Y; b) U4 X1
1 p% q* h! D) [; i0 i参数详解:
( _% a! M8 W; B* ^, T* G1 I
y0 r) C6 w8 M( L& p* G" Zdf: pandas模块中的数据帧,DataFrame形式的数据;2 O. ?5 h* G/ T" V
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
8 ~$ p' g6 [# L: B% ~! juse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
/ J* M7 K7 f" ~$ v/ kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
, v+ j( x P% H& k5 \' A, X9 Qverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。. L- ], ]/ e- c# h9 I
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。. h! Q& y! h: T1 d L( ^$ ^
association_rules函数% B: F, d. C, f4 j, L% R
语法:
% h& d+ |: l) x3 x5 e, h v
0 E+ [* Q- X# kassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)0 F$ Y. a2 x- Q- V) s8 I# g' i0 A
19 V# G8 v2 Y; V/ ]& o8 f
参数如下:# \4 x/ h) Z' o) v/ N6 j/ x
: O( s: e, `5 Pdf: pandas模块中的数据帧,DataFrame形式的数据;
0 v( Z- h! U* T4 R: x9 \: C, ]; _metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
1 U. |# K1 s7 n! S: e# g$ Xmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。3 N- R2 ]2 T( O9 O' a, Q( o
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。# E3 G3 l5 l5 P7 p1 J2 A% f0 @
附带metric几种参数的计算方法:2 H6 x' j& a, H' ^! z9 P9 h
. q$ B- f T* S- l7 K
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
/ g: B- _7 B$ }% D& y5 H, }, r8 G& Z+ s. r- I5 O
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
+ U. y9 J" p7 ` g H) B1 x# [( B0 e) d; w6 R0 l
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
( n& W- }& z# h7 h2 P' |$ }6 _; O% C* d- N0 O
leverage(A->C) = support(A->C) - support(A)*support(C),/ i8 V" Z: r# `3 |* I1 N: j) T
range: [-1, 1]
/ d' P! H2 _8 f# _
$ R$ m& O9 x4 g' Z2 X/ L1 y" Uconviction = [1 - support(C)] / [1 - confidence(A->C)], E! D) O- ^/ s/ }& y
range: [0, inf]9 ?: o1 R4 x. S1 z5 T) B
( X! {( O4 M# D. P/ m
3.实际应用案例& n. y& Z' ` c
以下为完整的调用实例:4 D2 @* L( B+ R: l/ x7 l2 _
( K! T4 h+ M5 p* t+ dimport pandas as pd
% S( }6 l9 Q e4 ^; ufrom mlxtend.preprocessing import TransactionEncoder
2 N( N5 m$ Y% b$ i% M" V& Z& \from mlxtend.frequent_patterns import apriori
. u; y/ u& u! @* Cfrom mlxtend.frequent_patterns import association_rules; a# a. @9 i: z8 Z. R
#1.构建测试数据4 c* O* S f% b0 b1 [3 ~4 O
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
) V# l4 K0 O* c$ I; ]- D! Udf_chg=df['product_list'].str.split("-")( R7 R3 }2 B/ |2 o7 Q
#2.数据预处理
" G8 Y5 h2 @5 u; ^" R#将传入的数据转换为算法可接受的数据类型(布尔值)$ }: H* H8 p* r. y, V; b
te = TransactionEncoder()5 F) L5 r5 W4 Q' j* c4 N# `3 |
df_tf = te.fit_transform(df_chg); u* Y, J! o* e8 L) `1 [
#为方便进行查看,生成dataframe$ i6 i* t3 p J! S/ O s7 {! r
data = pd.DataFrame(df_tf,columns=te.columns_)
( }4 c$ H# L% ~7 m/ V8 g+ p* z#3.建模7 J6 o5 p" Q. u5 ?
#利用 Apriori函数,设置最小支持度为0.2% k7 S) X o" D' B
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
( z+ @' ?! G a4 I& A% T#设置关联规则,设置最小置信度为0.15
8 L4 d1 [6 ]/ `# J4 V9 otemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
0 z5 I0 ]7 K. ~% [2 X6 R#4.剪枝并控制输出
2 P5 Z( X! S* Y" e& T#设置最小提升度,并剔除对应的数据+ L0 p& _5 ~" K9 V2 I# Q7 V
min_lift=15 G' V' d# p+ v. J) |
rules = temp.drop(temp[temp['lift']<min_lift].index)8 R# N6 m8 d6 @/ F; E( j5 ]
#筛选需要输出的列9 n+ @; h- X% `1 x4 m
result = rules[['antecedents','consequents','support','confidence','lift']]
2 Y6 @* R0 k; Y+ v9 h+ q( z9 Cresult=result.sort_values(['confidence','lift','support'],ascending=False)
: E D" b$ q' v/ M' p8 j0 f8 J kresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')$ Q3 X) u8 j6 O$ s
" O+ P7 S A ^) ?1 h1 s
1
[# ^2 L0 L- B' L9 a21 O0 N; V L' e9 r ?& \3 {
3+ r9 L8 p# n$ I; A8 [
4
9 e& i I; G; \4 B4 B n* n6 r' z8 h5: h! H* @0 n9 B5 C& g; l
6
! i2 U; K! _: k a# M/ o# Q7
9 Z9 l" R& z- z+ f2 ~5 Z8 k8
* R( [% l4 p5 X9- D3 v: F, _% v$ m, F( j' N
10
& T9 a# {+ V) `0 G6 k+ h U l; l; Y% @11 `7 X# u+ V9 k* v6 W9 u
12
+ i; V+ P8 ]3 d0 ]; ^13
% R* ~; _4 S7 r$ g) g3 A* _14' R/ u9 Z* ^" F- {/ ^: r! u6 H
15
& d( L3 B$ z# T2 T( r- K16
1 y7 ]7 S7 t0 D5 A/ y. C/ k17+ J8 R8 K% j; Y
18) ? Z+ o# H" t" H- d
197 w$ s9 ~- P" {% g# b1 I, v
201 s0 }+ E2 {0 N5 ^( Q, b4 v% y
21
2 y# x2 Y% x4 E. w22' z8 C6 \0 @! |: I5 m; n
23 w' ^, v) }7 O8 e$ U
24
# f! Z) E& @- L4 f7 J3 K259 J2 B7 s0 y& p$ k
264 ]6 M }2 D2 y) p) e! w3 w
输出结果见下图:
# ^; E3 s9 b: Z5 z" j3 X/ D3 g: X, \1 d" y& Q3 h" I4 y
————————————————
7 K! _0 V1 Q* S. B版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" K& T a, N: H; q8 }, d- r% N3 A. N
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
: _" t$ B' c; m7 J( r4 g' a4 G' f- r7 ?( G( @/ N
1 ^& {" \6 y+ g4 ~- s |
zan
|