- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563788 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174359
- 相册
- 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算法篇
, C9 o7 m- n' o# n( _6 P# L" f9 n! Q. M$ r: F0 G
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。- o! |: m+ z; T$ n
" a, K$ t7 [" z& J
1.准备工作
6 L# J$ l; D& e- l: G如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
# D* t _& V6 K/ R* i6 a5 {) E$ n; r5 a1 N8 k- \5 ]
pip install mlxtend6 T2 J8 p; H# ^
14 \3 \6 F1 N" ?3 s. L' Y5 n) b
为方便进行过程的演示,在此构建测试数据:! I" L/ J- @8 L4 r
3 r1 _0 c! _" D3 L) m2 }' ~import pandas as pd
% d8 I. G1 U y' d( M" n+ g tdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})) Y5 r+ j. \. ~, G& v) L
1
& ^& p( d' X9 C25 H& t$ [- ]& O6 h
测试数据截图如下:
: r+ r7 m' Y8 A+ `# _5 ?+ S4 c1 |* [7 j
r* I" @2 _1 \' R0 Z
对上述的数据进行以下处理:
3 _4 Z3 G( r* Y. t, l6 B" i& O) a6 Y0 C* d( Y5 b
df_chg=df['product_list'].str.split("-")3 I# }+ \+ _5 ^' }7 i6 {
1. j* X/ q* `) g* d+ ?& m. Y9 z
数据处理后,结果截图如下:
: G! c5 x4 m3 y4 L3 O0 Q/ v5 C* c1 v1 F# E% `
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。9 T, ?4 F5 v3 }. {4 P
$ z+ h& W: n# z J) d
2.核心函数及代码
1 @; Q1 G/ y _8 n6 }2.1 数据预处理
X/ y+ H @( n0 e- c( b9 j对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:6 U# Y! e0 e. V
' _! p" H% i6 P0 X1 E. p; N! r#1.将传入的数据转换为算法可接受的数据类型(布尔值)" X) Y* t& |+ t' @1 o
from mlxtend.preprocessing import TransactionEncoder
1 X1 v% B O- [8 ^; W- e/ tte = TransactionEncoder()
" s( h/ }9 C* P; Ndf_tf = te.fit_transform(df_chg)
! j8 c1 W& L" g3 B" d#为方便进行查看,生成dataframe
/ o6 `8 q9 t/ r6 N, }6 edata = pd.DataFrame(df_tf,columns=te.columns_)6 a! J$ R- d/ B6 @! N* f# _0 ~
1
% c6 i" {1 @. O" x0 _8 a2
. J* i( K; M. z% T3. }9 \) i6 z/ b6 d8 J% b
4" P1 a& ?+ w0 |, x6 j3 t9 L) z' h
5: J2 ]3 h+ _8 G' l5 y. X* @
6
8 Z1 m/ Z$ \3 [" I* ~运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
i$ K& [. q% d$ m* J1 C$ M" L0 M$ a* l7 E, m5 ?" v7 q
6 V/ d2 H8 t& f: |2.2 两个关键函数& t3 J1 d6 D8 v3 p7 B
apriori函数: ?& t& A$ S& k$ S/ l _, w. y
语法:; x* Z# A* s2 R, f
: n7 N' _8 s6 l% o" V) kapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False); a$ `. ?0 k8 y! }% ]
1: D7 }2 w/ Y/ A; S+ ]; D5 d
参数详解:
7 i: W! C: E1 E; E
6 m6 x( s2 b* v* P6 P$ I Rdf: pandas模块中的数据帧,DataFrame形式的数据;, u: Z6 B4 f) e" o
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
; w) ]$ @: Y( |5 l3 Euse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
1 N& z" O' Z! M9 U1 g! A* Mmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。, ~ T" y; f& `1 W" } T
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
, w. m+ x3 g8 h4 U' I6 Hlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
5 L4 c6 T: v# ?2 P5 P; n# Uassociation_rules函数3 Z$ l2 m/ c q% w8 k
语法:3 V$ B% [, V* U) y- V& `7 S$ I
6 S2 F2 D$ N/ ?) iassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)7 a6 g3 Q2 Z, z7 w! l
1
6 d* ?' w, O" L% |3 k& l参数如下:
* n) B" ]6 S1 d L* ^2 _5 F% j8 z# K. x B. p: A
df: pandas模块中的数据帧,DataFrame形式的数据;
! ^. N3 m; V& [4 jmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
( n% _! n5 R' q: P& v6 dmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。' \/ \6 h5 k: r5 ^! w- f9 q
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
' G( Z$ }( t5 ]; o9 J7 ]附带metric几种参数的计算方法:
4 k- |( d2 [ s3 i- Y5 v
5 t- ^, b) E& [$ w/ n# ^( E$ v8 H/ Asupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
5 X9 {+ v" U @3 d: s8 e" j) S) w+ M9 l2 Q6 G4 N6 q9 K
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
5 A+ _2 |& q4 O6 ]0 j0 O, F" N
s+ b+ v4 A! J4 K9 B9 Hlift(A->C) = confidence(A->C) / support(C), range: [0, inf]& P! E/ m q& N9 ]9 n5 S* L7 N
1 v( \' j6 h1 y7 T+ V" p$ i( Hleverage(A->C) = support(A->C) - support(A)*support(C),
0 r4 d/ J) @5 _. q; b- j) hrange: [-1, 1]
m4 L( P1 _- Q( A$ N- G# ]) J2 Y, o+ T' j2 v" R5 ?5 m$ p2 p
conviction = [1 - support(C)] / [1 - confidence(A->C)],( @5 P7 ^/ w- S8 x% X" @
range: [0, inf]0 a$ K: u+ ]7 J) d! n2 _4 l: `
4 v. P, h# }% R3.实际应用案例
, N8 J3 Y8 k* b @3 \9 D% e以下为完整的调用实例:
# n/ G7 u; ~( }7 }) |6 e% l% i K5 x/ k- C1 w, {
import pandas as pd5 c) D; u- j& C# S+ c4 S) [8 M! P
from mlxtend.preprocessing import TransactionEncoder# X6 K# L# p/ r
from mlxtend.frequent_patterns import apriori1 w3 w* O2 B& f" S4 w; x3 U0 a
from mlxtend.frequent_patterns import association_rules; s" h3 k- W* S. Y" R
#1.构建测试数据/ v' O0 X# z7 f5 d
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}). t: \& m N7 h. z8 C/ ~: Y
df_chg=df['product_list'].str.split("-")
7 ^1 Y7 u! E& e( _#2.数据预处理
6 Y- ~; v7 ~! g" ]. w+ B3 k#将传入的数据转换为算法可接受的数据类型(布尔值)( ~4 }( N4 Y7 _, o x6 p% ?0 r
te = TransactionEncoder()
" [9 `( Q) N# R0 L/ Jdf_tf = te.fit_transform(df_chg)& n/ j4 k! m. `" B9 H0 ]: s
#为方便进行查看,生成dataframe
T+ p4 ]( } X/ Jdata = pd.DataFrame(df_tf,columns=te.columns_)# X6 }: _# J/ H# q& l8 l
#3.建模, t" z0 E8 O d" a$ Y" I0 J
#利用 Apriori函数,设置最小支持度为0.2
) Q, i q' F3 j, B* W1 E+ tfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)1 h3 B. h, \- ?2 X
#设置关联规则,设置最小置信度为0.15
& L& d; w: w4 j- X# ?9 z7 Ztemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)% S& i' j% z( e0 [; S! j+ U# }: Q& o
#4.剪枝并控制输出$ |1 v6 S8 ?. [# {5 S$ W
#设置最小提升度,并剔除对应的数据
0 j; l k1 F) x4 _min_lift=1
2 K/ R- k9 B9 L% C* }) f( [8 Srules = temp.drop(temp[temp['lift']<min_lift].index)
" `% B7 U# ?" `1 S. X4 E# t#筛选需要输出的列
/ o; j6 h0 s% A: A; [result = rules[['antecedents','consequents','support','confidence','lift']]
. e8 X* _4 ]- r @. c) q) G/ oresult=result.sort_values(['confidence','lift','support'],ascending=False) Q+ F0 Z: u, Z/ i
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')3 v/ m& H# S0 k: p5 i) C/ O( f- S
+ h q: D9 ]& |( H/ r& V: U7 S
15 y- s8 f2 z( k! v$ e0 ?. V& i4 @$ t
2' `! F9 U8 U% U/ Z" z
3
) Q; y w# C4 X4 v4
( r9 \/ m! f5 w5
, i( f3 x. o; |7 G6
& z5 w, k# a8 H' h! c& c# E1 a& G" J2 S7
; X2 s4 ^$ y( ~6 R+ J9 M5 m0 X8
9 F% s% |& T+ X5 O9. Q2 C" C: G0 x2 X# Q
10- X0 t. r3 e7 H% _' K: F
11+ h3 H( T, |8 d4 f" @
12
' I$ a. M, N+ E" [! u# u1 K( Q4 a138 k( x( u% o; e" P
142 J+ K, d/ m- G, o* M B6 g
15/ X; C5 k' \: N: c3 p! B$ b
16. I& ]. j4 R( |& k8 d, H! c- }* p: ~/ o
175 y1 ?' o h! F% `
18
/ j; h [4 ]& W4 [, c192 v2 h4 C: @7 E# |
20( i5 `/ Y3 j- S9 c' i
21
( V4 X X. M, }7 c3 V22- \0 q2 F/ {9 d6 x" f0 S- H5 o6 L F
23( ^# A+ e' D: g% L0 d: }
24
- A, I$ ?0 g: L' A. R& v* n25: O2 X! m$ s& y+ U0 k
263 \0 G9 O4 `' E: V
输出结果见下图:
: z8 R7 n+ A% N6 [8 L8 d( z/ i
I* U Q' m$ V$ M8 i————————————————
1 G+ [$ _, T" _5 c- E1 y版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ ?" J+ p3 R* p; y$ m' D& @1 L原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
6 N6 H* g8 L( e2 x% Z" S6 |3 F1 H2 f# y
5 R* S; A; G0 n |
zan
|