- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563255 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174199
- 相册
- 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算法篇: l. H6 D7 \# B* \# R' V4 r3 s) ]8 @
+ g% h& Q3 c A在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。. Y. ^6 }0 z8 k3 b% ^) W
. S1 \# }5 `- J) p1.准备工作9 F$ y) z% x7 x. U* a
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:8 M ^- v* H& ^/ p& S0 y5 O! _
: [2 [6 x8 w" w- ~1 z" P: \9 @/ `pip install mlxtend
?9 H' x9 n2 O! M6 ?$ a1
5 l. a( Z+ G! K6 U为方便进行过程的演示,在此构建测试数据:
4 ^4 G M/ e6 P
9 @# o0 P3 D2 n2 K4 A6 S2 Jimport pandas as pd1 ~: X) j' H: E. r$ R
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
- h% {1 {: F0 Q# S" H5 x3 X1
5 I. V% n3 U5 z2 O( E: U! b2$ A3 o3 p( `( _3 ]0 O r
测试数据截图如下:5 A! { ^, A+ g& \# K9 N6 e; s
" q* H# y' J+ a: ]7 Y9 a/ b. }
9 U9 v: E3 q$ L6 a2 s" a- R1 @" l
对上述的数据进行以下处理:# x3 {( b* ]1 B1 M3 B
6 n, j( Y. Y8 C2 H/ H8 | a
df_chg=df['product_list'].str.split("-")# q2 J9 r1 O2 z: M
1# l6 ~" e6 m( N. S6 `% T
数据处理后,结果截图如下:
. D( X- `; w2 V/ h+ U
: G2 I7 l7 H1 i3 k7 F$ P截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。 f. h$ L$ ^8 _' h
4 V( ]; ], p' N# O# ?: D, e" i- i2 I2.核心函数及代码
b, r- I, Y4 N) k% i2.1 数据预处理
/ ^9 y7 b" ?) r- e3 l对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
1 v4 c- t9 v' c- u
; a0 b. r/ F( Q1 H) R5 N+ {5 E9 ]- L `#1.将传入的数据转换为算法可接受的数据类型(布尔值)5 Q7 Y% R* G7 S; A
from mlxtend.preprocessing import TransactionEncoder
+ A" t4 f4 ^7 u5 R" u, \8 Bte = TransactionEncoder()3 q. ^/ v+ s- c4 z! z% y
df_tf = te.fit_transform(df_chg)# Y9 M7 u# [) s: I) c
#为方便进行查看,生成dataframe# I: t. i! t( z" A- o
data = pd.DataFrame(df_tf,columns=te.columns_)
4 [! \* ~$ k u8 b2 P1
A, w8 C) I7 P" |/ ~9 U3 _* X1 L9 q2
8 f2 K4 H, B! t- ?! Y' ?3
$ y5 S0 Y* b- I' y4
7 E7 e b' ?8 U% V/ S, a5
4 P' R9 {! m f8 E( O! x; B+ a" Y66 K$ O0 \; j4 S. [9 Z
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
( e$ X: L/ k! }- O! w# M! H; H$ \3 T
' i; Y8 _ h! `3 v$ h2 c1 A1 H* C- w( T
3 T: U3 }" v5 X5 \, ~2.2 两个关键函数6 V$ Q; t1 O }
apriori函数3 V' e9 N) y; K0 I8 s! |
语法:* V) d0 U5 W$ x0 V1 d8 R' O' s
( N/ `% a" V- V) ?# qapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
& i$ m# X! o! K- `) h# K: j0 ]- t& Q1
/ v( Q) Y% {& K( _) F6 p- Z' ?7 z2 e参数详解:
6 x4 x" B1 [1 f& g# R% k7 X+ W/ B3 ?8 z6 M: J( o
df: pandas模块中的数据帧,DataFrame形式的数据;0 E W% l T0 w4 H6 U( i: S
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, x$ [9 g9 U* Z" y/ w
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
& H( c8 Q+ ]/ M$ N) T4 e- R( e+ M# vmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。9 J2 u- W3 N g) s
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。! v' D4 Y) b0 j9 ] S
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
0 n7 E# N1 x( ~: ?association_rules函数
4 l. k0 r0 Q8 c5 \* n语法:6 K, R6 J5 e4 J: h
5 s& r' L3 ~: S- ?5 X1 ^; [- U
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)% @5 O2 t# C8 A: |0 ~" w4 U3 s/ a
1
1 R: F2 p2 i! M3 w; m- w参数如下:
# @3 |/ o" ?1 f6 K/ r8 R+ j3 ]6 `# W8 Y$ U0 j+ P$ o3 W- A
df: pandas模块中的数据帧,DataFrame形式的数据;7 s1 L' U2 }. Y2 |- p0 K' a
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
/ [' V0 E1 V2 j, Hmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。! \( p" T! X8 `* I
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
/ @7 B5 \/ ~5 `) L附带metric几种参数的计算方法:
* y% Z" L1 A- X8 u$ m
* J( G% {: y6 k( V; S8 C9 u4 Fsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
; u7 V/ ~( _2 x! ^; ]' D$ e
' K1 R; H" {$ ?9 `# q1 u; \; _confidence(A->C) = support(A∩C) / support(A), range: [0, 1]/ d1 i7 j9 L0 K/ m. \. X
. W( @6 R* a) y7 k* B; k# |* ]) O
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
) ^% H8 @( q! N! o5 N9 _& Y) h' t: U# o8 @/ ~
leverage(A->C) = support(A->C) - support(A)*support(C),
1 N" [0 E" ?; I) m5 [' l) e6 J' Irange: [-1, 1]- j, M1 f0 p5 C. [7 {
4 v! g8 i1 {/ |! H/ l* U$ T2 aconviction = [1 - support(C)] / [1 - confidence(A->C)],
* i; N0 d0 |. `( c6 b, }/ Prange: [0, inf] B, V& @8 X7 V+ V* L1 l1 \* a
$ Q& S( R, m( l3 Y8 ~# U# {
3.实际应用案例6 l% D& U! H$ ]( g2 Q- {: |/ w
以下为完整的调用实例:9 G+ Q1 P: \( v
, [ X$ |; K: Bimport pandas as pd# }. x) x5 n4 l$ J: ?4 W" O
from mlxtend.preprocessing import TransactionEncoder2 k1 y* z# F( f
from mlxtend.frequent_patterns import apriori
# S/ G# K/ s9 S9 d4 Qfrom mlxtend.frequent_patterns import association_rules: k6 ?: W" I" d4 n& @3 [0 `- W
#1.构建测试数据
: L& b6 J- N/ r* t; i3 Q* E% q/ m5 Vdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})6 k* j0 A8 R- n0 N3 V! c
df_chg=df['product_list'].str.split("-")
+ w+ y4 ^" ^8 @2 j#2.数据预处理
( ], Q% }4 H& k" ]* Y3 U#将传入的数据转换为算法可接受的数据类型(布尔值)- n0 j) ]9 B1 j7 y6 J. X
te = TransactionEncoder()
" Z. }. \" D$ _df_tf = te.fit_transform(df_chg)
: O w6 X* W2 v% C6 i#为方便进行查看,生成dataframe+ P- V8 \: h9 M1 _/ R6 q. @
data = pd.DataFrame(df_tf,columns=te.columns_)
" Z% q+ v5 @& V' z$ {: U. g5 C#3.建模9 _7 h2 h2 t/ T. G
#利用 Apriori函数,设置最小支持度为0.2& B6 R2 Q* c9 {$ |/ c
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
" B$ W+ V) r* A$ s0 O$ E$ a#设置关联规则,设置最小置信度为0.153 G" J& u) k/ {% I# r$ f
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
( T; i# E# {8 W. D#4.剪枝并控制输出
! l; ^. Y. w. G& P#设置最小提升度,并剔除对应的数据% g% b; C$ b5 z8 y
min_lift=1
# J4 h) x7 J5 qrules = temp.drop(temp[temp['lift']<min_lift].index)4 P, H9 [* J' l/ z3 g) Z
#筛选需要输出的列0 U% i/ v9 H" h' t0 T5 p' p2 x. C s
result = rules[['antecedents','consequents','support','confidence','lift']]5 g+ K6 j& K9 T. Z% }7 [3 W- C
result=result.sort_values(['confidence','lift','support'],ascending=False)0 g$ s4 ]6 }* B/ V3 b/ s; T+ x
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig'): p: n2 N) l Z0 r5 B* I1 U
" h5 `4 Z [" f# M6 |1$ t5 a! ?7 p! |( O' Z
20 M3 g0 U1 {2 Y
3# s0 ]9 f& D0 m) Z/ p
4
2 t; b% u% e' T0 t, @' F3 e53 h9 x+ Z6 Y/ S* v
67 K4 y2 j: y0 P& s/ d1 n
7
( w/ z+ x" a B8% w/ p/ z7 E1 s& k; b3 t/ K
94 v. D5 }5 t6 q
10- Q7 m1 k+ o; C) @8 l- ]6 V
111 e ?# u! x. Y0 j+ c2 v
12
" V: Q0 {6 _% A1 L13& ?8 x8 b1 U' S0 ^+ \9 J' B' j# u
14
1 X+ h9 j: [" B+ Z15* Q: y( r F% C" m: A4 w
16
% q; C2 n) j" {8 F+ r, ^# H17
7 o `7 D9 |. h! B$ l2 K" Z7 t18
( a7 A* L3 C" i: X* p# z+ K( e& G3 l19- y' }7 ]- x* {. z) t
20
( }, X+ N7 W' @, j$ ?% M21; o$ A+ H% y% K3 v7 C# `" v; s
22, O9 {7 ~. q! i) n- E
23
7 y$ R% ~# r7 ]. a2 R+ o- X9 V24
2 k5 U& A; g, Y/ `; L- K25$ n# X1 t M! F% t" x* v! J
26
7 \& t3 X" O8 B6 Q( G输出结果见下图:
/ p9 m5 U# J! [/ D% d- V' M: u. d! ]9 [% F; c( d) R
————————————————
+ A) G, }* H. A. k) e, f' q版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
$ {5 a, Q) p: F5 C4 \原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
" q6 q* d. i9 N' I7 i0 m, Z
+ X# B* }# f5 }) C% X
2 T6 u5 z( U7 @- H6 ] {7 }- [; J) U |
zan
|