- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 557542 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172635
- 相册
- 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算法篇/ x+ l2 D6 ^" V8 c# F
0 H5 \ V2 q, h W* n
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
2 i# }- @2 f6 o; [1 B* e1 X2 s# U
2 M% f" Y$ g4 U+ L9 l1.准备工作
: Y" X( Y8 h0 |0 m+ \/ C4 S如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
; ^1 T" K2 h1 W {, D/ c, T3 n8 `* j
pip install mlxtend
7 V3 t" @ V8 g& n# r! j12 K$ |8 O" G" `
为方便进行过程的演示,在此构建测试数据:9 M6 g0 D$ s$ W6 O* j2 _+ n
- d5 r. J: k$ R+ z
import pandas as pd4 q! T- z8 R0 y
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
' [' O* Z9 M; w, P15 r# N& }6 D- O3 f
2
2 Z+ O% @, I& K测试数据截图如下:/ `7 c E% ^0 {7 _( i9 M
0 D1 f4 Z; k- n5 s7 w4 o; P& S. m" P; Q$ b/ \4 G P
对上述的数据进行以下处理:2 w, s2 q! H5 H0 L
" c$ r4 P7 } s! x. V( E8 Wdf_chg=df['product_list'].str.split("-")! P( ~5 \0 {; B: I6 c
11 ?% W: V7 k: I4 ^* \- M+ U. |
数据处理后,结果截图如下:
( Y$ A; E9 X0 ^
% Q* [3 e3 s) B2 @截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
% v. Y6 G6 q( l9 R0 f, x7 S4 n d, t0 A _( a
2.核心函数及代码
9 w7 o7 r4 z4 z d5 u3 |2.1 数据预处理" a5 M X: H. t# l' S8 C) v# F* ]; R
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:! B& X. L' }# y8 w! P: s; a- F/ ^
5 D( T* T" Y. O( E9 R0 B% b; X" U
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
1 g$ h' W% q3 ]4 e4 B( zfrom mlxtend.preprocessing import TransactionEncoder
t2 x& {# h K5 i1 ]te = TransactionEncoder()7 Y [6 C/ T% w9 r, Z* w1 t5 J
df_tf = te.fit_transform(df_chg)& c4 h* e/ D+ u5 c' O
#为方便进行查看,生成dataframe
$ E2 F9 K9 V1 G' i" ]2 H! n7 tdata = pd.DataFrame(df_tf,columns=te.columns_)
8 S, N& c8 r7 B) H! C& \1, V" G Y( M! N' x6 V. B$ k
22 Z+ g, f) M8 J2 Q/ c2 z5 l+ M
3
. _6 [) R% U/ ~" n( g v# d4' }) W. L0 R& ^
5
2 w' x2 E% e7 o& i4 A" Z* R63 r; ]5 o( ]' y# v5 c
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:0 b1 ?# m# M. B% v/ ]. t
1 ]( c/ y- M' [- i. _2 ?
5 C9 S5 I% S9 F/ I3 [2.2 两个关键函数: v; `. t, z. G |2 N
apriori函数4 I* g( p% L/ x$ t: s: J# o# r
语法:
. G) c( \- B! a7 u, K1 d
' }0 m- X: m! _" Yapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
' {- D7 D; e) L+ m/ [1% B8 [, }' x8 N
参数详解:0 \+ Z, V l M; Q, S! m2 ~
- o% s7 r' V' G# G' Z
df: pandas模块中的数据帧,DataFrame形式的数据;
' p* J& R2 L% m. G, bmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
6 I) C1 d6 @7 Luse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。" ]+ y) L6 T" b
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
$ K2 p; y k, k! ^verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
$ ?2 |- J& K6 @& Q: alow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
$ l' t: ~7 f& P, f" W7 z zassociation_rules函数
# n* {# z& T! x% G' a' z; O语法:
( G: Z$ U# l; ]7 _% ]7 l A y6 m* t5 Z# Y' ]
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False), F! _$ ^' V6 h
1
" l. w1 g, w9 g5 k r: \" Q1 B参数如下:' {. I% N' g4 r) _3 X
2 c/ e8 \% Q$ Z8 v$ @
df: pandas模块中的数据帧,DataFrame形式的数据;
4 Q# K. E! c" M/ k" M0 hmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’3 _& Z! {1 [/ v$ B! C8 O8 S, n; F
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。# y6 O6 q# }+ \$ ]
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
1 b. B6 Y$ \$ f) I! G. h. h附带metric几种参数的计算方法:
( Z/ g8 S* H. l& |9 J! Y6 o" ?: Z2 T5 h
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]0 z2 S$ f* X! u1 f9 \/ r- a. | c
9 i7 X8 J3 Y i4 B+ rconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
4 Y. |3 l$ K/ g% a. m0 }
$ A" Q* e; y( Q; I9 L" m4 _lift(A->C) = confidence(A->C) / support(C), range: [0, inf]! ]+ _2 \ ]' C2 ^
3 K3 r) X% M" y8 F. j5 Q; h7 Xleverage(A->C) = support(A->C) - support(A)*support(C),
2 |% r/ g, U! K( ?) r9 G. urange: [-1, 1]0 f0 A" w6 [0 e8 O6 W9 Q2 a0 e
- [+ v" L! |: S0 D# S$ x) c$ K( Sconviction = [1 - support(C)] / [1 - confidence(A->C)],
) v/ j9 f9 x9 O) w3 hrange: [0, inf]# C. O: p' I8 Q' M f
3 f; {* R7 r- Y# q. }
3.实际应用案例
+ ^, J9 Y5 i4 B6 ~" H8 Y+ S以下为完整的调用实例:0 ?" ^0 X6 x7 I' E( a: F* \! |5 I
; ~% ?* F* ~: j& R
import pandas as pd; _ @/ U5 d7 X4 g
from mlxtend.preprocessing import TransactionEncoder6 |7 |; A) h' D7 ~6 e
from mlxtend.frequent_patterns import apriori+ t# o& E. @5 Y+ o
from mlxtend.frequent_patterns import association_rules! U5 u) I' |2 C
#1.构建测试数据( m E% y4 {) w" h
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
! h" X% r: ]1 a5 R- L% gdf_chg=df['product_list'].str.split("-")$ v/ d% d- @1 V: q0 I5 S6 }; z
#2.数据预处理) e1 ^9 b4 Q" U+ l- n. C, |
#将传入的数据转换为算法可接受的数据类型(布尔值)7 R! P4 B4 R/ o k
te = TransactionEncoder()$ |; c$ k7 P4 ^- w5 a$ Z$ q
df_tf = te.fit_transform(df_chg)+ ]! @; [. g- h5 j+ b
#为方便进行查看,生成dataframe
$ q3 b" ?0 K+ W% jdata = pd.DataFrame(df_tf,columns=te.columns_)' w' x3 Y R2 I9 t& c5 c
#3.建模
; U, ]% b V! _3 A; l/ |# R5 c#利用 Apriori函数,设置最小支持度为0.2) w( N U* @2 a* ^
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
( T) B+ f8 w& e) T2 n#设置关联规则,设置最小置信度为0.15. a- D7 J- \# \% a4 ?
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)! o; X/ C( x: d; c
#4.剪枝并控制输出1 Y: M8 F' Q7 C& [
#设置最小提升度,并剔除对应的数据( x4 y! a3 e4 c) V0 R- C/ P
min_lift=1
; w$ b4 H! f2 Y2 n- |6 y$ Krules = temp.drop(temp[temp['lift']<min_lift].index)
" s' ?* Q; R4 P" ^#筛选需要输出的列
: z5 ]' a# U8 T8 k' ~, D3 a+ wresult = rules[['antecedents','consequents','support','confidence','lift']]
$ a5 l) E7 B1 K# Z& Xresult=result.sort_values(['confidence','lift','support'],ascending=False)
) @% i' e1 I" Q0 x, c) \result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')5 C- V& |5 `2 u! ?# U8 v+ P
/ s: D7 b6 G7 M/ Y* u) m) [- [/ f8 o
1' b4 Z. l+ q: T+ P8 {
2, N- `; k& p* l
30 b' Y1 H* \' ~
4
) |4 a4 S- s$ `9 |# l5 x8 S% G$ Y# Z; B1 o' H* K
65 @ q$ j& d8 K' s
76 X3 K5 N, e7 Y8 h6 V
8
9 ?% b* I. w: x, Z' v U9" d% ]1 p; L. O: y
10% }; S! E/ U" A7 k% V6 ~
11
9 |" j1 T. v0 V8 o12 ~# ]5 S# x! I- Q7 h& G+ y
13
, I% U, g( F# t2 F& p2 V6 C14! t$ Y9 s" T3 [# t6 O
15
# P7 F/ K; h2 t, ^+ r4 w16
1 u5 o. p, Q4 H! b0 d; }17- M5 f" W; N$ Q2 R8 _- d
18# q @1 [8 |, y
19
3 { j8 |) C, {* O0 [" Q20
& c! L8 z/ b" q% m2 b4 E! p21* a" \1 [0 Q' }1 c5 S v; V
22
9 ~+ W" Z/ M l5 s. |0 \4 ]" _23
( E* |9 B ]( o5 ?) [6 l242 E1 V# J- m3 M' ~7 L$ ]5 J0 D
25$ J; i2 X! H+ p' `' P
26
& v9 ]2 |: Z9 _输出结果见下图:/ [* o/ i0 D7 V7 R# E
8 U9 a% L+ X! x8 Q0 v) y# n
————————————————
" l9 F- ]2 Q) s( b版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( c4 {4 J/ A9 ^) ~% Y) P' s' J原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759' ]% f4 z% [1 @$ X: n$ Y
/ m/ V( L: G) M% h( z6 [3 e6 R3 @, U/ _# H$ v6 S
|
zan
|