- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563327 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174221
- 相册
- 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算法篇/ R5 V* E# {6 h7 j
5 k" c: h% \2 [ W* F0 b在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
" f& Z4 B# M' m5 Y/ S# [4 I7 r8 E D
1.准备工作1 M6 V& k. q/ ]. L7 n, j* {& I
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:0 I' U, M( p6 T$ m# F8 ]* U; C
3 B4 d( l9 Q F9 |/ p/ Gpip install mlxtend
4 X$ B) m0 e% z! M O6 }. o& c1
" D, o7 m# i& Q: H为方便进行过程的演示,在此构建测试数据:
) k! D7 R X) ^; Y; O
$ ?! I5 r; m4 A; q6 K) u$ P, Q3 Rimport pandas as pd7 Y7 v7 u. h6 y, p2 `8 x
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
4 e4 ~ f6 b+ O, _2 }! w# R1
+ A) z3 m8 f6 Y2" \- e9 J. Q8 R5 N# O; ^$ H9 |
测试数据截图如下:
: s& k4 R) L( d* s
. F) F! p$ k" ^2 C- E2 ^! R. D' K! ~
对上述的数据进行以下处理:
* i' w: C: x. W! o; r5 J* Y6 d
df_chg=df['product_list'].str.split("-")# N4 o( W5 s/ {
1" I7 ~7 n) ]' C+ v9 o
数据处理后,结果截图如下:! {9 `8 W5 R( ^8 b" \3 ]8 G! M
0 L f& _6 `- _( H8 n& j截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
6 {- Q& m, Y2 A6 r* Z( \3 z* G6 O4 x7 ? y3 t
2.核心函数及代码( s/ T7 c6 ]: a6 {
2.1 数据预处理
8 G# H( E3 Y; k a5 c对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
: u( X+ i! ~/ {/ f
% s5 A* S" N5 x3 C: A2 u) s5 R3 \#1.将传入的数据转换为算法可接受的数据类型(布尔值)
) C! D5 h9 G) V* Sfrom mlxtend.preprocessing import TransactionEncoder
, o( s$ W1 U; f1 L: @te = TransactionEncoder()
4 P6 K t2 @ d" z- O' idf_tf = te.fit_transform(df_chg)9 @1 j3 i E/ t0 [
#为方便进行查看,生成dataframe
* Y! O# b3 L3 L) odata = pd.DataFrame(df_tf,columns=te.columns_)
# d1 g0 _, |* T: j& F/ N1
' F6 r* X3 v, P; ^' Y7 n! X0 o2
/ X: }# @9 @0 T0 q+ O3
/ F9 U/ U# P) i5 o43 F, {+ |7 t/ W9 @$ U' L
5
1 t& z4 C4 I5 B: ~& V9 m6
% p0 E" X$ u$ N# s1 u; }# P$ f% h运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
& t& l: \$ w' w9 u( N/ `3 s# ?# G. l4 @
5 Z6 i% i/ a3 f( z6 n2 g. r8 J2.2 两个关键函数
! a3 O; g& `& Q2 |; wapriori函数/ m) s# M! L& C5 s) j
语法:1 j. Q( i3 |7 }8 ]8 c, H5 k" ~6 X0 r; b
" \/ U! x# W& _9 O- h+ e, S5 M8 l3 gapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
4 P T* }; K% \! O W" b14 d: ~7 f$ b. S/ F3 T: ~; E: I
参数详解:
( \/ m3 p2 K& D; x p7 C0 Q. l3 _6 y- h- x
df: pandas模块中的数据帧,DataFrame形式的数据;1 i+ M, u3 W' @4 d
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
1 N( N; X# A. b- d! K6 j f8 @4 Guse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
. h! C5 w5 y& F8 A+ kmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。; P9 {" N' Z, ^4 N- J
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。' S7 f& `/ W* F2 k, d- y& J+ s
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
* B! {, q* l0 t6 J9 J6 I5 |association_rules函数
1 p) t% o) H* k' v" a; e( u5 B" v语法:' ~; W# U" R9 ~5 \# [8 |
' s1 d+ A! W- V& D* {0 `. w' dassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
* V# j, Y" Q+ O l. N$ P1
0 U- R) Y: A- K; `/ Y M( z& F3 c参数如下:, M; Y7 X2 h# w4 Q+ H
1 d' S; X- u2 h( [, Y- u) odf: pandas模块中的数据帧,DataFrame形式的数据;
* j! s, ~: K4 D: Jmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
5 t! T `/ X, [* j# l7 H3 a$ `. B/ Emin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。- o' y% E* e9 a
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
9 W' E+ e+ [( N& q& M% @2 S附带metric几种参数的计算方法:, Q6 R3 V4 B |5 v0 U3 W
+ N8 P) G: e2 i) ]support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1], d5 L5 Y h/ n2 {
/ Z1 N# w" E- K
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]. s! i( I Q+ c0 B& r* F
* \! s6 ~0 a* u( [: u, blift(A->C) = confidence(A->C) / support(C), range: [0, inf], j9 A% t, K! T/ p. r
' n3 F7 b! z2 a3 P0 ^5 V `6 @leverage(A->C) = support(A->C) - support(A)*support(C),
4 |, Q8 B' H; Z% p1 n+ O vrange: [-1, 1]
" _2 ^! L; c* Q; z3 a
+ \$ J/ ]- e/ ?# D% vconviction = [1 - support(C)] / [1 - confidence(A->C)],
, z( `) O6 D/ u) I# D7 yrange: [0, inf]- a( l$ ]3 I( M8 w" h3 r
! N" l9 ]) X- _3.实际应用案例, R1 L4 b- y) B/ d7 N
以下为完整的调用实例:
$ j: H+ `8 g' K1 P) @9 k9 g& B4 I& v0 I% s& J5 P/ q
import pandas as pd
0 G# k) V$ Y" T7 hfrom mlxtend.preprocessing import TransactionEncoder
( H! ?0 i* _! ]from mlxtend.frequent_patterns import apriori
Z+ j7 U" t: V$ O% P, e7 {9 Bfrom mlxtend.frequent_patterns import association_rules# u. k; n. I8 R! [3 `: s$ e& r5 [
#1.构建测试数据
0 z4 i! }4 n: qdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
# J ]1 i6 H. p' D' gdf_chg=df['product_list'].str.split("-")
/ h0 J+ U. o% _$ b2 i3 q, L- }$ J#2.数据预处理
! _2 u6 Y) l, O+ P7 j#将传入的数据转换为算法可接受的数据类型(布尔值)3 i7 W+ u. i: Z+ R& T
te = TransactionEncoder()
" X8 y! R2 _* F. |. ldf_tf = te.fit_transform(df_chg)3 P- h* Q! m) W, ?! J/ a0 D
#为方便进行查看,生成dataframe- I) r( N1 W U* u7 V) u: g
data = pd.DataFrame(df_tf,columns=te.columns_)% w! y6 {! s; m+ i3 A
#3.建模
9 _) U, H! Y) ^6 p) X#利用 Apriori函数,设置最小支持度为0.25 w7 X. y. U9 k- G# j+ K, T' V
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
" B, U3 e. `: s; s1 T' ?1 g#设置关联规则,设置最小置信度为0.15+ B& ~& T. \/ G
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
" s/ C) e% p0 I" I! ?" o#4.剪枝并控制输出
4 w% l, B* J1 J, {* e) I) k$ j#设置最小提升度,并剔除对应的数据2 s B5 ~$ B1 E& }
min_lift=1
; M" J' n. X4 \0 Drules = temp.drop(temp[temp['lift']<min_lift].index)9 j: b' v5 g/ Z' x9 z3 D. j8 f
#筛选需要输出的列* g6 C4 x. X+ d3 L- g3 c7 W2 k
result = rules[['antecedents','consequents','support','confidence','lift']]
: i' |0 F9 ]7 h8 e. x" w9 Dresult=result.sort_values(['confidence','lift','support'],ascending=False)3 H9 b' o; v' \2 M0 w% W$ C9 A
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')7 W+ l/ u4 W* A% n
0 ]/ m4 Q/ \" j2 o: m8 Q11 u: S, k2 z l' w) O5 w- G4 p
2
+ S& [& ~ `$ x3- W* y2 Z) \. V) w5 W% f
4
# @1 h5 D/ i+ q/ P5$ h) T- E2 ]# j1 O; e+ X6 o
6
5 U0 N" ]3 B, `$ i" _* {7
9 v9 S1 ~: d6 |8/ d* }& T; K3 ]. L
93 M' D. X5 v$ g5 }. O6 `1 R- x
10
7 n+ h$ K6 J! T8 D% b: i2 j$ G) G$ x11
7 H0 P' t. A: t4 M; H124 M( c& H& G8 }" g# e# \! i6 }
13
* ?( X9 |) @- ?5 _14! x4 n# `1 t) j" {$ |
15
- X8 w' R0 n. q16
5 |+ D' P u/ ^2 ~17( z3 r- F% [* N3 C( Z
18
+ u) c3 n4 q4 v4 A$ C19! A8 T* j: ^' v; s
20
# u# R, [, H7 _4 D0 k216 N/ C4 w# K% |: D q
221 x! f: ~1 i: u9 x1 ~
23
/ T: S% q7 g+ |7 J: ]24
* W; U3 @ n( @2 s4 w25# w: b# L+ k5 E
26
3 b( S$ I7 w: ]) I; \7 ]0 {4 E输出结果见下图:
4 t9 c4 ^; j+ i! J/ ]; t
' u" Q+ J$ T4 P1 I————————————————
+ a# P+ y: o. S版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: U1 C5 `0 y2 k( w0 l# Z
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759, |3 q& p' j, u# {8 R$ v/ p
! D s; q y6 c4 ]( | r: b2 S! y0 E6 w. F p- x* v
|
zan
|