- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565641 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174915
- 相册
- 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/ r- V5 L& k7 s# O
a$ e- y. a5 @# i) T在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
: i. W, B5 H5 T
. Q0 a3 n/ U# c& c4 i7 E) G1.准备工作
/ o$ @' y; A8 m* G6 y如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:* g0 S! {( d- @: O, r
9 V r$ A% j' n/ o
pip install mlxtend
' f% e" J2 r, w1$ ?9 y6 l) C+ ^+ `+ K7 X# \' h
为方便进行过程的演示,在此构建测试数据:0 k+ B) n# I/ U! t" L
2 a2 i3 K2 k& V& ?" N
import pandas as pd; Z1 o0 q! h: @0 A
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
0 `' P z: ?1 `4 \' i2 K$ H& v1) w) f( Q O9 p
21 a( G* H4 ]) `+ n& E/ [) l; j
测试数据截图如下:
. E/ s( ^2 Q% v
) ]3 T4 K( @! v {. D+ y
5 e0 N; i+ x, w: K, P对上述的数据进行以下处理:5 {5 _ H8 Q6 `7 H
6 Y! R" P. r. I! j$ \1 f2 vdf_chg=df['product_list'].str.split("-")7 n' b& R, I. g7 b# L
1, X) p! w- \% H1 }
数据处理后,结果截图如下:; Y; a' V6 U" l# e) k! B
9 F2 s" p) w7 K3 a: M' w9 W截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
/ H8 z& y \* W6 [- t. X$ Z+ v2 Q7 ^: r# l2 n$ S8 J0 M5 f
2.核心函数及代码* k1 ]) F( l) n& w# I2 a
2.1 数据预处理& d! q+ N2 G) S# N8 E
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:* A/ l0 T. s5 F9 j0 R3 u9 s
( h. M }1 s& I#1.将传入的数据转换为算法可接受的数据类型(布尔值)- K% z6 j. \- m# T5 q
from mlxtend.preprocessing import TransactionEncoder
" V' i+ a, I: {2 G+ K( Bte = TransactionEncoder()
% g2 \% N _ Edf_tf = te.fit_transform(df_chg)
1 ^* p/ J$ ^6 e#为方便进行查看,生成dataframe
- W( i( I- }' X+ W1 Adata = pd.DataFrame(df_tf,columns=te.columns_)8 r- X: t" z0 B
1, Y9 \9 I9 ^! o$ j4 Y* v( V
22 A/ C R7 N* b2 u3 d, V% Y
3
! _# c. m4 Y/ Z4+ P& s1 Y% i' P- X5 |
5
9 F. |# D+ g. M+ o8 J, w69 d0 h3 b6 m9 ^8 G7 V( x0 `
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:2 W6 J$ {! v9 I9 b) Z: U4 ]8 T% X
0 ~8 {% v* `. h& ~) G3 ?3 w' {( ?7 {) c( V+ r
2.2 两个关键函数
) S' @+ P# K& \* T- Q `# l6 |apriori函数8 s7 w8 [( `* b7 W% e
语法:7 n9 e! C0 L, b/ o
S8 C1 ^& L* q/ w/ H5 |apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)1 U' G, P' O" I, s% [
13 w* v* E7 C9 `
参数详解:4 n5 i7 e6 t( A$ n9 }% n5 p. U
% m" s" n& j9 R) F$ @; A# }/ ]df: pandas模块中的数据帧,DataFrame形式的数据;
. r/ R1 I! g) o! b6 h% wmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
0 |6 ]' b9 B* D5 o) Ause_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。3 r1 {$ s9 t& q# X/ S8 _
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
/ T/ x8 j$ d" j9 e! Dverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
% ?. r% ], y1 V" s* \' b9 Ylow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
2 W' e5 V! s# e& v: V9 \association_rules函数! E! p' V# B; c& [2 j" @+ q
语法:
! |$ I) B, y# a! d2 l0 ?- h; D( Z7 b( w3 s+ g
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
+ L% ]! A" _ ]' b' K1 j* C1
* g; O+ ?3 I/ j6 B! m参数如下:
$ X+ f8 o; _# K0 f) W! ~* k* s# O# w5 l4 t3 J' J% s( C; w
df: pandas模块中的数据帧,DataFrame形式的数据;
2 T {# r% B8 b: r, @8 n8 v* o) }metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
& E6 T8 c% C. {. v- z+ Zmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。# }& e Y; U, D+ [* q
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
6 E! F0 }" G1 `- L) Q$ s% R, U1 @附带metric几种参数的计算方法:
" e; ~: |' N9 Q' h. o" p, ^/ v% }1 V9 b# y2 b! k
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]# b( D& i/ g( E5 R+ w- {; H5 M
( H6 ~' w [2 e q5 E& ?0 B Econfidence(A->C) = support(A∩C) / support(A), range: [0, 1]& x3 k5 i% U% w1 l% P3 ~( O
9 F$ g3 ?# d _/ {, E, A: ulift(A->C) = confidence(A->C) / support(C), range: [0, inf]# r9 D0 I( g: l0 D4 G8 t
1 g. o/ M7 \7 i3 i2 Sleverage(A->C) = support(A->C) - support(A)*support(C),
- d) n9 v- k+ w6 x6 b# orange: [-1, 1]( n6 q6 h& c2 ]3 M! ?; d; s
" C% ?. h q; O8 |6 R
conviction = [1 - support(C)] / [1 - confidence(A->C)],1 G7 V0 s0 p& L7 y: T$ X. h
range: [0, inf]
5 a3 e4 T. m: }. X6 E3 {' c2 y# p! R$ u' s e
3.实际应用案例) u- S E& c1 b. i7 S+ e" V
以下为完整的调用实例:$ [( {) l* y: {" e# R
/ z9 O( ~! N6 {1 T6 n. R$ i/ v! N% ]! d5 e
import pandas as pd- E+ T4 l8 ~2 _* |6 Z! n& |
from mlxtend.preprocessing import TransactionEncoder& @0 x$ R, V; e/ I w" F
from mlxtend.frequent_patterns import apriori1 u0 N3 I; G7 Y1 K3 K5 z
from mlxtend.frequent_patterns import association_rules
, s/ w$ [8 S. C/ S0 n#1.构建测试数据
% R% p1 O5 T0 [; e6 E2 xdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}), K$ P- N1 H( x
df_chg=df['product_list'].str.split("-")
: \; Z+ N5 \( A: J- C: E#2.数据预处理7 \# P/ R p- A, D5 w- O
#将传入的数据转换为算法可接受的数据类型(布尔值)
" f! l$ H( @' [4 v' S$ ]* Xte = TransactionEncoder()7 a9 k. v- p3 }
df_tf = te.fit_transform(df_chg)2 {' m9 E, T0 u& ^
#为方便进行查看,生成dataframe
) b8 q1 o0 m2 V o+ y! U- n, ^5 Jdata = pd.DataFrame(df_tf,columns=te.columns_)
1 ?' W# C# f1 D" Q8 ~5 }#3.建模
$ E8 ~1 ?7 Y) K6 B#利用 Apriori函数,设置最小支持度为0.2
, z( c S, X: S9 q( lfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)2 N5 b: H- V4 g, P1 V# a
#设置关联规则,设置最小置信度为0.15
" x$ ]0 j5 x" Btemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
4 O, f3 _9 o; B#4.剪枝并控制输出/ R2 e8 c8 m4 w @% v
#设置最小提升度,并剔除对应的数据% ~- h4 v) i7 b' x0 x. K: [" B& u
min_lift=1# q( F d. H4 [) W5 c7 I5 R
rules = temp.drop(temp[temp['lift']<min_lift].index)& z6 B6 X# |- f8 q
#筛选需要输出的列
+ \) o, ~% u- [/ [result = rules[['antecedents','consequents','support','confidence','lift']]
9 h+ t+ z( b5 E/ v( qresult=result.sort_values(['confidence','lift','support'],ascending=False)
5 I L& C+ `/ p3 t/ jresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
# }3 J* e1 b a3 Y8 V; e
' U) p9 E% z* R7 J1
! _. Y9 M% A, o3 G6 A2
' K6 |5 Q9 K. ^3 Y( [$ X30 C! B6 Q; N. o4 K+ J# R; t# I
4
$ V, \- [( \8 |5" X+ k, j- v) U3 G! @
6. `$ q. |( p6 I/ I$ b/ w
76 j# J% |( L) u2 B( z% z
8" T _& ^: Q+ c( j% D
9$ S; q: X$ K/ z$ D7 _- `* A8 |
10
3 @1 s. S r+ I4 q+ A* e5 F11, h; R% r/ f$ B* L
12) w) i3 X* u. Y1 S/ I3 f& K1 @
13/ b8 V4 x3 K1 u! {7 }
149 f% S- P: _7 Q/ i5 h6 {6 i- M
15: k* C/ n) @% C- a- w" n8 g2 o) ?& `
16! u) D0 i% c. K& }; s! ?# M
17
4 ~" d: }, o. g7 m" D+ @8 F l18$ {" `, \0 ~0 `# W) x8 E; B
19
5 o& {, S( ^! ^. N; B20+ c# K7 l" Y; v2 v9 d
21
) e- ^( | c3 {22% ?8 |, ~) h1 W }$ `5 ~2 w; c
23
4 {9 S* w% ~5 G. H# s* j! I' z4 D24
8 g! I" J- Y, S6 c25
; J. a6 D/ l! N: S( ^( @7 @$ ^26
6 H/ g3 B, u j3 P7 L1 w: i2 @输出结果见下图:' O! I( P6 S, m0 Z
# Y7 @3 ~8 K4 Z
————————————————
4 x% q, r. c9 ], _版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
9 f6 z" V4 t9 R. A# J6 X原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759, L# x/ l: }5 B7 H
+ e0 S1 h0 L; d! Q
; k7 w: {$ q0 z% F |
zan
|