- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565291 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174810
- 相册
- 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算法篇+ V+ w3 ?# @/ L2 J9 q" l
% N, T& B$ {9 e5 U- `在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
- E2 M: R5 g* Q K _! R0 q% t2 W; F: d
1.准备工作
: n+ H, O- }. P% `( K$ o如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
. F. N3 g; X* [' _
: r# h a* f3 y" ]) `+ o& Cpip install mlxtend
/ O+ q2 g0 l0 B3 K7 @1
( E+ C) A1 J8 Q! w) w为方便进行过程的演示,在此构建测试数据:2 V7 a( [% r% a
. B7 \6 W! T' j4 r6 l; Q+ fimport pandas as pd
) Z9 N4 f1 l ]5 Y+ odf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
1 P6 j' D( \8 w& k1; \5 {! k; D3 W# p5 L
2% i5 b, t6 H' c0 G
测试数据截图如下:
1 f6 A5 q7 N# [( C3 y
. P# H2 u5 p) K- ]8 K% E* k# e. R9 w4 N: f j4 X
对上述的数据进行以下处理:' t J/ d$ R/ u
0 i/ I7 S3 G& G9 J8 x; S Mdf_chg=df['product_list'].str.split("-")1 b8 K+ R( `" ]
14 |2 f I1 r, D# i2 ~: L, u! P' }
数据处理后,结果截图如下:: a/ g) P, ~/ v' }" D6 @- X
) `$ [2 W) p; N9 C3 L8 `截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。, w/ ~$ I" l7 z( t% j' m4 D
3 y8 T& |, i* m4 ^% P" v( ~/ L) n2.核心函数及代码
0 P o l: g) _" r3 r* J2.1 数据预处理 I6 F }' n# ^# K, o7 r
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:# ?9 F5 Q& t ~- M
* F0 I. D+ {5 P ?' ?+ T5 d#1.将传入的数据转换为算法可接受的数据类型(布尔值)
$ @% u$ o, Y# \ P# ~& n, y! Lfrom mlxtend.preprocessing import TransactionEncoder" H |0 X' V% l* L6 H
te = TransactionEncoder()
, r/ f9 U2 Z. _& x" cdf_tf = te.fit_transform(df_chg)$ e4 U$ {* k7 d
#为方便进行查看,生成dataframe; O* b' D2 _7 s
data = pd.DataFrame(df_tf,columns=te.columns_)
( s2 g0 l% y3 \4 [; `- g0 w1; Q9 x# d0 x" q1 H# n+ a$ L
2
; C8 q* G' T0 @3+ f+ T& g& ^/ ?, @+ [; }& ~/ x
4* ]' s- [* g! J4 u4 h9 ?# ^
5
+ e1 ]6 Y- a O/ b, E6
% R( b0 N" X! f7 M0 J# t+ N- h运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
3 e* B+ F, L% D7 l6 B& D0 ~, w u! ]& {6 m- ]
6 P: ]. U# @: C ]$ O4 O8 K2.2 两个关键函数 m# L. x; `2 m) }
apriori函数* O+ B$ @2 L c% f2 o2 w
语法:
6 Z. L& ^4 y/ b. O) `* d' L5 B$ ^# ]( P
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False); k# _+ D6 i0 P5 X# o
1: F$ O% R: r4 r# k7 x# ^: i4 [8 [$ }
参数详解:3 W+ g- L" p4 P; R: O+ E! P& G
* ?) R7 B+ }" O% D0 V1 z! adf: pandas模块中的数据帧,DataFrame形式的数据;! w- ~, ~9 I, u% ?! h( r+ E
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。# \* y% ]% S8 R6 l* K0 c- R
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
; |, Q5 \1 U. a, W( g, Pmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。3 q' V0 d9 H/ [& v$ j7 z" d
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。 I$ o8 n7 b: N f- U5 K
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。7 P9 j6 c5 p; J3 L- ?
association_rules函数
7 w3 d: C1 ^/ n0 @语法:
( ~. ]/ y0 m1 U5 {- q U d
0 e2 U( b* o+ r6 ~/ V9 Vassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)$ r( e. j0 }; H$ }# F8 q. u+ w
1
9 I% S* B, z3 I; K参数如下:& F& w4 a- }$ |5 c
2 F+ \ z$ ^$ u( q ?3 c) L) l
df: pandas模块中的数据帧,DataFrame形式的数据;3 |) H! O) ?# `' Q0 x5 j! S
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’8 R z5 l2 @' [( b
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
: g: R+ I. k# V B3 csupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
. M1 k) c. ~. L+ } ?3 R8 s附带metric几种参数的计算方法:
! U6 {* z4 \# k2 c# }! ^
9 i! |( I1 e3 n3 Ysupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
- ^5 y4 n6 V9 M8 a- \+ ]2 \1 W* O
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
0 e! @/ a( @( m) Z o" }
% U: u9 k* b1 nlift(A->C) = confidence(A->C) / support(C), range: [0, inf]5 G) o9 [9 j# b( l
- u* z9 ^# `, Pleverage(A->C) = support(A->C) - support(A)*support(C),, n7 J, i+ e" q( ?* d l8 r
range: [-1, 1]
' o! Y! T& r7 F( A& X# q/ U
# e3 ?9 O: n/ O. D Y# i9 aconviction = [1 - support(C)] / [1 - confidence(A->C)],0 k2 U7 c* Z" Y9 S1 i4 {7 X5 {
range: [0, inf]
* c ^0 b5 G( V+ |2 {7 J3 N7 y. y* V- S3 C4 U3 p2 s3 z/ g
3.实际应用案例
* u E# T& T& Q# O$ S0 _# [以下为完整的调用实例:/ O7 c4 l8 M" Y
8 }6 {( b7 K: m/ ]- n3 @% }0 nimport pandas as pd
$ b. j% z) [4 P: ?# z) ?4 pfrom mlxtend.preprocessing import TransactionEncoder
+ ]; {6 |. Z. O- @& v8 Kfrom mlxtend.frequent_patterns import apriori! {4 j6 G% K0 R2 v
from mlxtend.frequent_patterns import association_rules) k; t5 n8 ^- I% b2 L5 [/ p
#1.构建测试数据
6 t8 l, J7 o7 L5 b# h Fdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
& u& L& F; e1 D4 d! pdf_chg=df['product_list'].str.split("-")# j) H4 T8 v. M8 ~
#2.数据预处理
6 _0 p, F; P- k5 Q6 \#将传入的数据转换为算法可接受的数据类型(布尔值)8 K! H% v% y3 D( H
te = TransactionEncoder()
" `; B! C \$ X. U8 {7 Sdf_tf = te.fit_transform(df_chg)
' S+ [$ y% v9 O; P3 w8 C#为方便进行查看,生成dataframe+ g, h, q$ [( f" S3 w W% S
data = pd.DataFrame(df_tf,columns=te.columns_)
( ^% a; F4 B% l, B7 ?9 J2 P. K& w1 V L#3.建模9 Q9 x& j3 p5 s) s7 R* _" A8 p
#利用 Apriori函数,设置最小支持度为0.2
# r6 t* D; u7 a9 v1 Ifrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)2 r5 u! Y- K7 f" I4 a8 m7 I
#设置关联规则,设置最小置信度为0.15
/ |# o+ q% h( r9 Qtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)5 U- L( ?+ u5 j0 R8 e X: d
#4.剪枝并控制输出, r$ I9 a1 m1 X1 U l; E
#设置最小提升度,并剔除对应的数据- d& G b6 Q* A4 P. C
min_lift=17 K% H# k% Q2 B) ^
rules = temp.drop(temp[temp['lift']<min_lift].index)* u* {/ A) @3 P' e9 m) n" v
#筛选需要输出的列
2 t9 @# K5 O4 S9 |' S/ O4 u) Mresult = rules[['antecedents','consequents','support','confidence','lift']]( g& y# e* k- F, e$ Q
result=result.sort_values(['confidence','lift','support'],ascending=False)9 P" _* ^( i E+ v5 H
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
: V! _! a; {: k0 `, R# h
9 u+ K& Z' @* L2 ~ Q1' R2 v- u* a& f' ?0 d
2
" @. _( T8 j& q3" P- N. T8 `" Y% A0 [# U" j9 o
4
% b6 v0 n0 r! r+ }9 r5
/ b6 b9 \; a9 q0 F69 R1 ]5 o$ U2 B- Z- }) L
7
: d& _: S( T: l N( k, M84 e- n" F) ]$ v
9
4 Q2 T8 B6 T2 I6 y& ]10
. y- k: ?6 c3 `* c" p2 C' v, S11
- \9 U" y& }# }7 X2 a12' U# C4 W S* J, y! |) c& G$ q
13
! O% z' |0 ?5 Z# N4 }14 t2 x* W: M5 }! c
15: `5 m, J( _2 q$ n, ?3 P |8 e
16
B/ G6 w F* a n174 E4 i$ i, G q/ X) X+ ^" k
18
; J2 \9 ?/ B& l. C. \5 ]19
* q. ?8 r3 P% d% P: P20" B( w; ^# x6 b C2 W
21/ F& J2 B! i4 h# h9 Q; T
22
. @- {, j! ?2 _235 r9 X6 M1 m, ~1 {. h' a1 H! X: R
24" B- k( T% J# W$ F' S8 p
25$ M1 G6 }; t$ j7 `4 `' `" P
26+ O+ u3 B# Q l S5 J& n: u% }0 R
输出结果见下图:
8 o; O: ?9 l7 z9 c/ m
7 g+ R) }$ O9 R, t4 _! H————————————————
# j) D L. V) b+ \, {4 c ?- h版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ t4 p. T# _. V0 X }) ]原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
! U+ T- Z, K+ x7 g$ S4 C7 L/ m
! \. O" X( @# V* {3 Q1 D3 z
% X! I5 ^9 r7 M$ M3 ^9 W M7 P' ? |
zan
|