- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563315 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174217
- 相册
- 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算法篇
5 I9 ^, r( l1 W& R; H a$ v# ?3 E3 a" C0 S8 a
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。$ D: b3 h( G6 S4 i" p5 A
% [/ J- b/ z1 Y. K) k, y% H: f
1.准备工作
/ j5 O1 y- S, F3 l如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
) G+ e; L; W3 ]: w( k. @+ b: U# S* {% Y' c- r( X' w: c9 z1 f
pip install mlxtend
5 j+ z% r9 m2 p* I1 N. o1
5 N- Q, M; c# G5 c& }为方便进行过程的演示,在此构建测试数据:
9 X0 i( G; @$ f! ^' t
: k; K" n: K2 h6 t/ ]- u4 L, Bimport pandas as pd
; ~3 y0 S. m+ E8 A6 F' u# Ndf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
2 P- |0 A1 l% f. o5 B2 o9 r1 p+ O1
& p7 d' ?- c8 a; z4 `$ R2; n3 B1 Y: }2 l$ b* c) b" P
测试数据截图如下:
1 S; U A2 t) k/ K: @# D# \ i5 F
U$ A, F: F# m# w3 t: q
' V$ U2 N3 k8 \. `& Z* G6 m" C( i0 `对上述的数据进行以下处理:- T, j& X+ A/ B) `& o
; {( V# P1 v3 \
df_chg=df['product_list'].str.split("-")" B( ^# Y. z3 d, s. ~0 q
1
9 c0 J3 Q: T5 q/ r5 r数据处理后,结果截图如下:, I! o8 {8 J2 q% P
7 ?2 T4 Q; ^ k
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。' ~; r( C/ E0 X5 Z6 S ^
5 n, ?- W: a3 e2 A( a" Q6 T2.核心函数及代码7 D( i. h5 D8 K7 \9 B9 u' K
2.1 数据预处理
7 K# V6 |4 V% |( Z7 i( B( @# {对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:' k& z$ h6 a# r o4 g1 {5 `* Y
: Z* e& d3 R3 V
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
" Z# v/ J7 N0 b7 |% \2 N7 x( L: ]from mlxtend.preprocessing import TransactionEncoder. q, s! r; q0 H" ~# g+ }
te = TransactionEncoder()5 h) R8 [, k7 I( {
df_tf = te.fit_transform(df_chg)! p' V V, u0 F% J1 c3 K
#为方便进行查看,生成dataframe& {, N& g2 ]( T1 g i
data = pd.DataFrame(df_tf,columns=te.columns_)
! L9 F9 ^/ B: ^) ^; j1
/ L& z0 R0 }. }, ?+ s9 b0 p5 `2% g2 I5 I6 p5 s5 Z$ R2 |. z
35 [8 `2 B; y5 H9 G
4
{$ ^' |! R- F' A8 X5
/ l8 R# q# Z3 b6" `& o$ f0 @9 K% G0 M
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
9 }7 b0 Z& v# V& A, w- S6 F4 @! F' X7 \7 @6 |, N* }
( F9 `5 F6 B% K6 }% {; s. F2.2 两个关键函数
. X7 J5 S7 w$ m% z4 zapriori函数% Y' A. e$ L1 V b1 {; [" b0 n6 x
语法:
* |9 @; A7 R* y3 Y9 p( J7 g
, j5 g* Z# x" R# P* T. S: Gapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)# Q( ]0 K ?5 j) Z
1
8 u$ d( r9 n& c. T3 C参数详解:
8 Y8 M" H' P- [$ N3 t
% Z. D- ?1 f+ I. Y' fdf: pandas模块中的数据帧,DataFrame形式的数据;
( z S `+ B/ T8 W9 @) v( j; Pmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。3 a# O2 m# E' X& Y3 l9 T! p
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。" t5 L+ m4 M+ P8 k; \
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
9 r. n3 S# z$ y. j% xverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
- e% }, ^% B) n% Y- J# \. Hlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
& [* P! t1 G4 j: X1 z+ i" c2 |$ j) wassociation_rules函数
1 }) w r1 p1 l2 w, P语法:
% N- e G4 [2 m: |- w$ S
1 b! T \- m }- m/ Z, Dassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
8 w/ q: d" Q3 F0 [4 |, K1
3 m8 R/ \4 k* ?% q1 ~$ k/ f参数如下:
; g6 \# b C' p7 v+ Z! U
# ~ R' {. O9 ]; B# j1 _4 X1 K- @) Sdf: pandas模块中的数据帧,DataFrame形式的数据;9 e) x# \9 I8 v; i0 \1 T3 Q( a" [3 c
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
( G9 p* q! ]+ Zmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。. O- D# _9 H9 p7 ^6 j$ P( F/ k E( {
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。. H6 ?/ }1 ]* C: L- P# u( Y
附带metric几种参数的计算方法:! x* m- m& i/ T! a% q
0 v) M5 p: d$ A$ l1 Z6 l3 Usupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1] h6 Z5 o( ~7 ]: J0 v( c+ p1 v
) ^8 P6 p: Z+ c$ \( Tconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
0 A: ?7 z& l& O0 b# P3 O: }; N
6 a7 E5 b7 R4 J3 `* g) Zlift(A->C) = confidence(A->C) / support(C), range: [0, inf]- m* ?: l1 W% t, T/ t8 a, B
* C: q3 y! g& J' Fleverage(A->C) = support(A->C) - support(A)*support(C),3 u+ V( B b& ?" f: h5 p8 z4 |
range: [-1, 1]6 r( z6 u+ A5 G( n: c6 w; {, y8 g
1 P$ Y/ J: M( o! E, dconviction = [1 - support(C)] / [1 - confidence(A->C)],
4 g5 F4 R: c5 ^. crange: [0, inf]
l9 |9 x v/ b& P
, P+ H; V& C/ a5 F) P6 w3.实际应用案例; H# w9 J# @5 Q
以下为完整的调用实例:2 p7 H6 l+ @! r9 t1 ~' U, Y
8 D4 h% Z- b7 O H o! C, W# H9 }import pandas as pd+ k4 d V8 P( w. f' `
from mlxtend.preprocessing import TransactionEncoder# X6 \3 L! q& B# ^$ Y( N' V; i
from mlxtend.frequent_patterns import apriori, f/ [ v; G; m
from mlxtend.frequent_patterns import association_rules
0 N/ d4 Z6 a2 K. U: _9 C9 |#1.构建测试数据5 A5 k8 g: v& C: S1 h
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
# T9 U- }1 ^9 f. Bdf_chg=df['product_list'].str.split("-")3 H/ ~) J7 u1 a5 F
#2.数据预处理
y5 g# z8 Z6 Q3 b, {$ t& U3 o+ o#将传入的数据转换为算法可接受的数据类型(布尔值)
9 @. J7 o6 M" `7 z8 t6 Qte = TransactionEncoder()2 i9 E' A5 h& p9 S/ L7 S) i9 O
df_tf = te.fit_transform(df_chg)% u( N b! b( v6 |' X# ?7 q/ }
#为方便进行查看,生成dataframe
- Z2 F" h, a7 D& D" ddata = pd.DataFrame(df_tf,columns=te.columns_)
3 K' L, V7 D8 x+ c5 c#3.建模/ K5 ]- S7 w+ U" @/ G+ ^
#利用 Apriori函数,设置最小支持度为0.2% M: U- |- T5 C
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
! k, g" X3 S9 N0 t5 Y#设置关联规则,设置最小置信度为0.159 J3 z* {4 n9 |( Q; R. b
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
0 a8 c4 x# b8 l4 a4 I#4.剪枝并控制输出
5 ?/ i$ ]: ]# R- w2 ~#设置最小提升度,并剔除对应的数据9 g4 k& m6 w. Y+ _# P
min_lift=1
4 g6 n. D1 {( yrules = temp.drop(temp[temp['lift']<min_lift].index)
4 ^8 N% I7 h% A9 K#筛选需要输出的列1 q8 h1 ]) s3 o0 c
result = rules[['antecedents','consequents','support','confidence','lift']]
$ G8 _6 G; m, hresult=result.sort_values(['confidence','lift','support'],ascending=False)% S% \& R. V8 o) m4 l9 P
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')) l# o2 n+ L, Y- s- l n4 e
V9 s, d) D3 w2 W1 W- K1
; t- Y2 F; S9 ^; P: o0 |$ h2
; } U/ M: ^0 l0 G. y& Y3
5 ~7 J7 q. V# @ I* c- x0 B4; Y# r. {7 }, Z- i" h) K. l& x) k
5; k0 K' y6 m4 s- Y) g
60 \0 h( a) m& r' B( D! i
7+ f( l% |7 W- \% Q0 d
8: I- M" R& B; ^1 T" d7 [
9
! c0 M' b; ?% z2 Y0 d10/ @! O( ^ E9 U8 a- S1 [ }* A
11
/ h7 q/ e# Y9 r- }: [" H" P7 \. R: q2 q12
, X5 g7 f; D# K6 V$ X7 c' D& g13
+ R# E9 o# N% z2 h' H144 r4 b2 o: h9 ` o o: V( w) g$ o
15
5 T6 @' M* M, f0 F+ s1 k- m16
, C1 c5 L4 r1 ]5 e1 J& \6 \17: ` H3 c% o3 u% j4 T' j0 p
18
9 y0 ~; I& P2 P3 ]$ c9 u19
$ ^6 a2 |' A. X" {% O% A' ]$ Z' E20
5 q. w, q+ L# P9 w. k8 I21
, `- k$ k: n& \) z2 x. z0 y3 F22
8 @9 v; b0 j7 A7 Z0 c& J3 q- E23- r) ~3 R! c) E' H
248 {9 k* N7 m. X5 U5 I, H' A1 c
25
8 m) h% l: U- I, S5 z' \, ^268 f6 ~1 n X1 |2 G
输出结果见下图:
7 d: p/ q. v0 {1 @) u
4 n7 j! \' p+ {) N* m! X* ?+ ?————————————————
' O* w' ?& g' ~# U版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
/ p) Y: b. E/ {2 B, R3 c( G! `; F原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
+ q- ~5 H$ G! C7 h% b* _
9 U, x; a, `# Z. h6 V. j
3 v% i3 q g! S( w |
zan
|