在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563414 点 威望 12 点 阅读权限 255 积分 174247 相册 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算法篇
( Y, b, f, s. y) Y& L 8 a1 q; V4 f% _/ a$ F, }
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。4 E. A$ h/ U1 t F
6 `- V8 P% B) W
1.准备工作
5 |& ?3 x2 f0 E, D- a/ e, o 如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:& X L/ B6 V2 z
! Q# \0 T4 {- h0 Q& ? pip install mlxtend0 W, E0 u6 J, g: D6 W: H/ {
1( G3 \1 s8 A. k2 j+ f& x+ h$ u
为方便进行过程的演示,在此构建测试数据:0 t8 c& Y+ o4 g _/ A
* V2 |2 J% l0 e2 k6 N! H import pandas as pd
# S" o. t. e) [1 e0 \& I' e df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})6 p2 ~& n7 w" F7 d, d5 r/ R4 R5 E
1
# \ d; f. S5 ]8 G 22 I3 x) g% G$ Q8 [' c. e7 i% y( o! r
测试数据截图如下:9 B+ Y/ |0 i& l9 F) f
% b$ L& Q; I! Y
( a0 {7 Y' F! t1 k" c 对上述的数据进行以下处理:
& }1 p T. a8 ^
4 H% L9 w* ]3 i1 v' z) V y8 `9 ~ df_chg=df['product_list'].str.split("-")
4 R! w5 r; P& b/ ~ 1
- V; J% r7 X$ q" H- O 数据处理后,结果截图如下:: g6 V; q1 i0 x
& n- }! l+ x/ p0 _% W% ]
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。. V1 q0 n2 J K6 p1 j
H! ]7 C+ t+ q 2.核心函数及代码
0 c; G$ p' C9 j) o0 C [ 2.1 数据预处理3 J: B4 g1 K" T9 M
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:+ n3 }4 w% f( l0 |6 X
# D5 s: D) [1 m7 m& T* J4 S #1.将传入的数据转换为算法可接受的数据类型(布尔值)2 G# n6 T6 y8 W- o: F+ m7 }% ~3 }
from mlxtend.preprocessing import TransactionEncoder4 E; C) P, B. f' V8 [* u0 Y# a
te = TransactionEncoder()
V$ O( W' t9 c" J4 P) @2 E df_tf = te.fit_transform(df_chg)1 b1 ?, d9 ^$ T# l4 V; U
#为方便进行查看,生成dataframe# C; x9 w( t/ k0 i$ c6 [
data = pd.DataFrame(df_tf,columns=te.columns_)" o: Q s+ O4 _9 n# U
1
, f( L3 J( g0 L5 L 2
, }& I2 P" {6 u( v B$ c4 f 3
7 |5 v* Y" G3 k 4% c' D" V! P; P; ]+ R/ p
5
/ P [% @: E: i8 S 67 _/ s5 z6 s9 A8 T2 f9 g
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
, K: [5 U+ J& Y! u: I ) j1 |2 I. M8 J$ D! B! V
) [8 o5 ]. f" A
2.2 两个关键函数! Q, o6 B: T- L7 p7 N' g% S2 H( Q
apriori函数
- b% F3 A- {4 ^ 语法:
4 z. q/ I+ r* A2 P ! ?3 X5 Q( `/ r. f- s- N
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
2 a9 t- P+ L( s! z7 \ 1
; Q0 D: v1 X8 `1 }/ g0 h* Q 参数详解:, M1 V9 k \7 E6 p
1 L V. S8 C0 u3 C" S5 H/ g
df: pandas模块中的数据帧,DataFrame形式的数据;
( G- K' v' d( D) j7 m min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。( F" r( K4 Y; o" o, t) f9 t
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。 T, { [1 G" R4 Z* d8 u$ x
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。) h# w6 u7 T% i# h7 J5 B0 V
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
% [" p# ?9 P w+ C Z low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。7 U S( g! m& M6 c4 R
association_rules函数# Q2 [$ p$ _6 T W9 |
语法:0 C5 O7 W: ^4 Y; R3 `8 F/ W
7 G9 c. e8 t% B1 N" h association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)3 R6 ?% x* I* T h" L. ^# o
1
4 m" l; ^+ r3 y! | 参数如下:
. s, Q2 O6 r3 o ) c7 `7 [" E, a0 K! g$ E. ~' k) J
df: pandas模块中的数据帧,DataFrame形式的数据;$ x, v ^1 R8 v! I, I D0 K
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
" W* Y' M7 J. M. `# w: V min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
* C8 f* ]; T& l* w: F9 q- G support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。" V# S1 N( K, @3 F& d* y7 `. z+ k- f
附带metric几种参数的计算方法:
3 L( n$ c% P! k
/ f( M$ D! @2 v' S4 p' a1 B support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]+ h- V4 K4 H# o9 Y# i$ x! u' |4 w
& H+ b. |0 ?* y. r
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]& M2 y8 Y1 N3 o R' h/ d! d, y
: @) i1 r7 Z5 Z
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
) I p0 b: d4 D0 M( `# ~$ z
U/ A0 s, R. `7 ? leverage(A->C) = support(A->C) - support(A)*support(C),
7 {$ y0 I- L/ Y3 `0 H T+ B range: [-1, 1]
& o! A& W' v% E! ?, s0 L9 Q! _ ! z U! C* ^0 r
conviction = [1 - support(C)] / [1 - confidence(A->C)],, \5 @, t0 e) G! Z' z
range: [0, inf]3 v( s' G$ [7 k `
1 L8 A6 ~/ {+ @5 A+ ]3 B0 s
3.实际应用案例
+ |/ L# L6 K9 p$ ~; P- J* c5 ~5 T4 V 以下为完整的调用实例:
% r( y5 h. l1 E0 X% m
, n5 l( ~8 o9 ~, X' _/ {- a$ u import pandas as pd
# O+ U, }: M2 A- w# v. p from mlxtend.preprocessing import TransactionEncoder
; I: ^ \. X" t from mlxtend.frequent_patterns import apriori/ m2 e5 J) S. n
from mlxtend.frequent_patterns import association_rules' n% c, ^6 v$ E8 P' v) q- ?
#1.构建测试数据
. N, S4 k8 M3 x) A' l' R df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
% r/ Q" D5 ]. ^ \1 B1 e" N df_chg=df['product_list'].str.split("-")
( B0 ~ J5 ?! ? #2.数据预处理
8 Q) x7 R3 X1 v. J1 o6 Q9 S' X #将传入的数据转换为算法可接受的数据类型(布尔值)
Q/ T/ j: L$ c4 K4 ?5 {0 C te = TransactionEncoder()
7 M* {9 t$ X/ K K df_tf = te.fit_transform(df_chg)
( X1 _3 x% c( ]! G, g #为方便进行查看,生成dataframe
4 i5 k7 N6 v' D% ~; ^; ~: d3 i6 O data = pd.DataFrame(df_tf,columns=te.columns_)( H/ }! i. |, G8 @7 h# g0 R9 e
#3.建模
* h& ^; W$ W+ e' c. q #利用 Apriori函数,设置最小支持度为0.2
% }$ X2 j2 f$ D' Q t frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
* ~! r% G% L2 Y6 ~ #设置关联规则,设置最小置信度为0.15
; |7 l7 M2 o& Z2 f5 J" g temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
9 G! R: W% M: \8 s x$ R #4.剪枝并控制输出$ {9 S1 P' U" H8 v2 \+ X9 A
#设置最小提升度,并剔除对应的数据
3 _! }' d; O7 C9 C. a min_lift=17 o# F/ p b% C4 V
rules = temp.drop(temp[temp['lift']<min_lift].index)4 F- R0 o7 g! Z
#筛选需要输出的列; E5 H& O2 m; S1 V4 Z% f w
result = rules[['antecedents','consequents','support','confidence','lift']]( T+ {8 a1 L/ m8 q: P3 U
result=result.sort_values(['confidence','lift','support'],ascending=False)# J# v) W8 w, m. \4 l$ g
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')6 n) W4 M" Q% ?# F8 v
W. ?1 G( d+ w1 p: y1 q5 f5 N: @
1 A1 h8 \3 r- g
2
( ~- V/ @5 w; r' Q 3
2 m7 J) F9 A9 ?6 { 4/ v1 w$ F( a& C$ V
5- s/ b' K7 B1 `: G2 f2 d: [
6
6 }2 y4 i- @6 k7 O+ r 7
% B3 `/ P" B+ {; t9 Z5 J 8' `, r3 R% O; I% g- J; `9 r0 Z
9- s# I- w7 o" [4 Z: X: A: F
10
) z. |1 i1 I6 U/ ?) S+ f 11/ A/ T& E% q. f/ w# M# I4 t! J r
12+ _7 L$ |4 S Q! l1 Y) e
13
' a: j$ x3 m# w 14
# O- I( {' g# u 15
& r6 Z7 f% V% o7 A! [7 E 16
|: l, q5 y7 l: X o, n 171 Y1 @1 x( C' Z/ z0 Y; S
18! o$ _ ^5 a- F* K$ M- a7 E& r; R# y
19
8 G# l8 e. @+ U# l 204 ]4 c7 |, W1 m( r4 o& n
21
' L+ P" a2 f( k 22
, |: H$ y4 W7 }8 i( p5 j8 x- J7 W 23
$ d. o! m5 I# z+ {; E8 w 24% Z& f, V' K. D' Q: S- D* U( `0 C
25) l V9 ]" x2 b$ A8 P/ E
26+ o+ s, B/ u8 C. w1 T# O8 h# B
输出结果见下图:! j3 e( K/ u/ G8 A4 X2 K! N
( I. Y1 u1 z) A( e" M* i ————————————————& Y& H& @* A$ Z
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 ~- l7 v3 J) t- o6 T6 {' [ |
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
5 O2 H% g% }9 l# y" f; @" i5 J 2 i, u9 i! P2 x' f. g
- H7 R5 g% W9 B) m) ~/ d+ V% k. G
zan