- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569630 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176112
- 相册
- 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算法篇8 U" a$ {# R7 T9 `- C+ j4 W
" @. b8 }' G* B在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。; C0 R) s7 U q) q) t
6 \* k1 W! z" g1.准备工作
2 v, @* A( E5 }: C如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
% R/ j9 p; m/ F
/ ^/ Z2 K$ A% b% q2 f1 Rpip install mlxtend% I4 A8 A9 b6 p Y: s. [+ p; X" x/ Z
1
, R8 c# S r" [: V为方便进行过程的演示,在此构建测试数据:
v- N, [$ ]0 S+ d# c) p. V3 C0 |9 K K$ t2 q9 E* R# @% @5 z$ l
import pandas as pd/ ?5 K' z5 k& p% h0 D
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
7 o1 p! }0 V0 E+ x y1
: F G+ k0 }1 F- o2
+ f; c' o5 ? \+ b9 Y" g4 p: E测试数据截图如下:0 n( I) g4 }! L0 M
: P3 p2 d! ?- m
6 _* f/ }4 T( U; R# X% ~
对上述的数据进行以下处理:' v# i0 `+ e; P5 z1 v
8 y/ g6 l8 o P2 Q
df_chg=df['product_list'].str.split("-")0 ^, s. m5 w4 ^1 R
1
n( ~6 ~4 x" g数据处理后,结果截图如下:
7 z' @; o. \& s
: M( `: p0 @" C) @' Q8 T( u5 X6 Q截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
s7 V# M/ s8 w6 A# M
9 d5 }4 h: m( N I1 \1 a2.核心函数及代码
4 T; {# j0 Y) e, w7 H2.1 数据预处理: o% Y$ Y- Y! c, m# |
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
- `' N0 o* ^/ j- R3 L
m- y9 G' k t* p#1.将传入的数据转换为算法可接受的数据类型(布尔值)
7 U i6 a3 n. r* T9 Wfrom mlxtend.preprocessing import TransactionEncoder) C, l0 b' g$ f0 M. L
te = TransactionEncoder()
3 M1 [6 b0 G: Jdf_tf = te.fit_transform(df_chg)
0 C% S1 L$ L) r$ h8 X$ O#为方便进行查看,生成dataframe9 u' v: L2 Q& m9 f5 g: r {
data = pd.DataFrame(df_tf,columns=te.columns_)( N0 T, T0 L( ?7 K% X
1
' z y) M J2 w/ D$ A! g, J7 C6 e- O2
* }( F% O6 o7 t4 `8 M34 u6 z' M% `6 U' S
4
+ F/ f; u% [/ v$ @5 m5
: [$ u' T% n5 V) R; ~/ `5 o5 r- J6
# w& P) y! ^: r1 J( _运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:; J) K1 R( Z0 {/ u6 _: s+ s X# E* p
8 M+ b( I( q3 t( D5 U; [$ P8 i" p' Z" f0 q9 t
2.2 两个关键函数
7 f0 `2 z6 G( X1 xapriori函数
6 b7 W1 o5 f# |5 t# J1 s5 c语法:
f% P$ b6 a' l& h/ X, `5 H
! e3 M/ Q& Q j3 u8 n7 gapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
! J$ E( {* C }) N; _9 ], i( i1% R" P8 w- H. Y/ E6 D
参数详解:# S& f9 p; v4 @+ h1 {' a
& k* w7 Z) H! {3 D. h6 B0 W
df: pandas模块中的数据帧,DataFrame形式的数据;
$ }% M, [; y0 W4 q- E8 }- k, f9 Dmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。! r) h# ?. X4 z: v) A, }: i" x
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
x4 }, `( U0 R8 H& A5 H+ Zmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
$ C: E3 ?' V! P( R: Cverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。) w0 D, S4 z7 _
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
, b( e5 i* C) k" I5 n$ Z, L, Eassociation_rules函数
/ P) `8 }: K2 Z, f8 A9 i语法:
6 y& [# n6 t' \7 Z) n l8 f9 L7 ?
1 {7 V: e+ D- B: Tassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
+ n/ [/ k) M! r0 W2 t) C9 Y$ M& g1
4 X$ K/ t3 ?; ^1 K2 Z参数如下:
- t S% l! h, K- v' K, d- a7 o% }( j) @3 G# L4 u- p: v# ?, m/ _
df: pandas模块中的数据帧,DataFrame形式的数据;! \7 N6 Q2 U3 |' A
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’$ E S! c/ d5 v! [; C2 b/ u" U
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。: V6 g. Y" Z( i
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
% r- u' l2 L' C) {) m7 t; d附带metric几种参数的计算方法:
! M' G# F. u! h5 p4 N' w9 o; K1 a3 s: c0 E- E9 W4 I( q
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]" d O! x8 Z7 V1 G8 U% I
' |4 l) d: A7 s" W1 k8 Q
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
' p+ ?$ |# D. o" X" i( C. d
+ Q( s/ Y. _* \: plift(A->C) = confidence(A->C) / support(C), range: [0, inf]
8 _5 w( k9 m1 c- F+ x) h: U+ |( ~# R* g4 h: M0 a* T6 v! H+ U
leverage(A->C) = support(A->C) - support(A)*support(C),; O u. d' N" |: I% \4 q
range: [-1, 1]
7 J$ O% P0 Y: f2 I2 f/ `/ s' W: b! Y7 W/ V G
conviction = [1 - support(C)] / [1 - confidence(A->C)],; K- h# t" v3 K+ I& H3 t6 W9 c. h9 q
range: [0, inf]! e4 A9 y4 N# m
! N# Q/ J( O5 t6 T7 b$ x7 B
3.实际应用案例. i- l; ~5 T) q3 D4 V' B; S
以下为完整的调用实例:
5 A& M- w7 m6 p
6 L+ g8 G1 H$ _3 X! K4 Oimport pandas as pd
) Z. o2 F7 y) Y, J' _9 tfrom mlxtend.preprocessing import TransactionEncoder
1 C& q3 G3 i7 s, r1 G4 afrom mlxtend.frequent_patterns import apriori
& F; [. N4 i; _" A+ d' Cfrom mlxtend.frequent_patterns import association_rules, R& f4 U2 j7 u# e& Q, n
#1.构建测试数据4 f; B; @' E5 L) {- q6 }+ P/ y
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
! J8 e; ^2 y* A* G5 Q( s/ f8 U# Bdf_chg=df['product_list'].str.split("-")
$ G0 O4 B, B; u2 P5 k3 b#2.数据预处理
7 j: n s% N* d0 g& F6 B, M#将传入的数据转换为算法可接受的数据类型(布尔值)0 V. N! h' w- M% J
te = TransactionEncoder()! I5 O6 S& Z2 ^* G3 T
df_tf = te.fit_transform(df_chg)' a: |. i8 D+ v& F- r) D# P$ ]
#为方便进行查看,生成dataframe: r5 Y& I8 I) Y
data = pd.DataFrame(df_tf,columns=te.columns_)3 y$ o+ Y: Z' O& i7 ]
#3.建模
# p/ }# m! }+ p9 B* t3 d#利用 Apriori函数,设置最小支持度为0.2& d$ H7 D$ C: @9 S" v
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)2 ?0 I- ~; m0 V+ n3 R2 x
#设置关联规则,设置最小置信度为0.15
% Q% T, d- P) w2 ftemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)- D/ }0 Z7 y* R# }; I& @
#4.剪枝并控制输出
1 g# L b* p7 C. J, X* R#设置最小提升度,并剔除对应的数据
S, T- l: j/ Dmin_lift=19 B" }6 b! c: r9 O& I. i
rules = temp.drop(temp[temp['lift']<min_lift].index): s* u4 ?2 X& b6 x
#筛选需要输出的列) v, Q- t* W: G: ?
result = rules[['antecedents','consequents','support','confidence','lift']]% {5 v q' n1 a; M; H& y6 V
result=result.sort_values(['confidence','lift','support'],ascending=False)
* K# q# ` P1 i7 jresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig'): Y1 U/ i# n, n/ ^% f2 u/ f
: m; @& Q& r' a% y3 o; r1
1 K6 n6 u% A# V3 X( R: H7 i: V4 q2
* o& F! B% h; q6 j6 W' x! c3( [0 s& ]! M! y- ~
46 |- D. x: @) Z
5
1 o7 M. {7 H& f0 _( a6
* I% e) D1 ], Y' U2 E# q7
. m1 u- Y( ^' ]4 Z6 k2 u8
8 j8 }, d& `' V# ]& [& l97 |1 g6 z6 c7 z6 [9 a( }
10( k$ e$ Z& y H& s \, b9 e6 R
11* M% E7 ?3 P/ m. u7 w: y
12, a' B0 I9 ?& o# W9 M
13
2 n9 { o$ s, |) e142 y7 z% R( ?0 X2 k+ h
150 g3 e/ b: v/ p, g& E- l# \
166 Q z8 a6 D5 V
17
0 V9 H' ^' C, I- C183 R7 f) ^* f- {. s# o
19# Y3 Z; ]* q. m4 V- u& W" L# R
201 x% x& X$ T. @5 T
216 w$ [7 V* L3 B" o' Z2 ^6 A
22# i8 Z: F: J9 Z, H
231 M, M5 u7 ?. s
24
5 c7 ~6 X& t2 U/ M25& N& g$ n0 c' v7 H- |+ V
26. I, V# }' E: v+ d0 g
输出结果见下图:
) _8 i& E9 ]% a: h- b1 o2 i( x3 j2 z; e3 o
————————————————
. x7 v7 w8 H7 Z; c: D6 A" N版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& \: l% s0 t) O9 d8 J- _$ V5 u$ E原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
' N; ^: t5 V) Q, y, x5 h5 H% q2 x0 W
, c+ l6 ?* E- S$ Y& r3 X+ V# T3 q/ K1 z! p+ Y' T4 H
|
zan
|