- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 81
- 收听数
- 1
- 能力
- 120 分
- 体力
- 539940 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 167360
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5324
- 主题
- 5250
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇3 Q$ P; j+ F2 K! ^% I$ p4 g* ~
# e5 [, |4 w+ U/ g在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
& O8 b+ J: Q5 \& R* z% o$ Q& s8 h1 Y) \8 _
1.准备工作
" p3 {% [% `1 r# k" h Z如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
; A% [' q! d- Q- M- e8 e1 ]7 `1 R% E) d9 H4 i/ P; h i
pip install mlxtend, X8 Z6 t) |. k% ?, y
1
1 o' F# `5 X6 C: ?+ `( h: G为方便进行过程的演示,在此构建测试数据:; v3 W6 H/ l: E9 b; c5 c
0 W' t: _/ `. ?) R2 @
import pandas as pd( J) D9 O( s1 ]
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
1 D. x! z( Q1 ~2 t1
# B# k8 J" h0 r7 _( E, Q. Q5 ]/ B" H2- U6 ]+ ]) Y; [/ X) S/ A# r, ~
测试数据截图如下:. |- C7 k) ]4 o
1 G2 N& t7 f9 y( A! `
, \: H! V2 _. @2 ?$ H, Z1 X对上述的数据进行以下处理:, l# E0 P( C' ]; }
1 g# \, C, p# _$ y1 C J% Bdf_chg=df['product_list'].str.split("-")
5 o& k" t1 p3 j6 F+ C* ^" Y! A1 p2 G1. Q( w6 U& [/ b z5 N- q5 }
数据处理后,结果截图如下:
- K+ i0 ?4 x+ W6 P! I) E) P0 \* Q0 N
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。, x8 ]* T' }, j3 A$ @
$ z1 J1 H/ \9 k2.核心函数及代码
7 Q- O6 H. x& Z0 {; E$ j2.1 数据预处理, ~! Q" F4 c3 N% m( v
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:9 \0 m: F2 b+ z* I+ g
' M/ o/ L9 f% K, G+ q# y( A1 A#1.将传入的数据转换为算法可接受的数据类型(布尔值)
Y9 O) F y) C. Ffrom mlxtend.preprocessing import TransactionEncoder" p8 o4 a, ~0 a# R1 _
te = TransactionEncoder()
9 m; W5 [' i) ~, q2 h: T2 B; T& k( Kdf_tf = te.fit_transform(df_chg), Q4 B+ C5 d8 D q. u
#为方便进行查看,生成dataframe! u0 K$ a9 k+ t% C# e: m" q& R4 ~* w8 X
data = pd.DataFrame(df_tf,columns=te.columns_)9 Y% f, c' ^ i0 I' O
17 y+ B( Q1 j3 v- v, s2 A
25 y* u- U6 I* U3 N, N- L1 \; k* D
3' v3 U8 x( c' y
4
. R6 P' f% ^" f9 l0 q3 a/ f5
% s& q$ K: f( c/ O: w- Y6 I) D# n6) w; N; X% M! h2 r8 t1 h
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
- }2 V* b( m6 q) t8 G, [- l( W+ g; {1 w
1 V4 f& L. q1 N( o2.2 两个关键函数$ z7 Q' c" r- s( w
apriori函数
* l, N0 _+ S" V( g) M* q语法:
, `/ U0 S O) O; R5 w' o- J! ~7 \
% }' q. s( a# J6 wapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)4 f5 `2 t. ?7 @2 x+ e
1
+ z" o, M1 n0 U0 w+ y% ]+ T参数详解:
" d: l/ q' f" J8 }- M" @1 W6 H2 M/ I8 T3 ^8 M) E' ?
df: pandas模块中的数据帧,DataFrame形式的数据;
' A) P8 s7 a0 |, d( B% J3 B% z6 M* P& vmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
, j. I+ V' b% E# ]1 Guse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
$ y3 W3 U5 D% v8 D& ^4 P9 e7 Emax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。! b# V7 z: b" Q+ {6 D5 K! y* |
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
+ [! P/ }, E$ D$ f3 ]: X. [low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
/ t$ Q# z& I/ _) b# P, V3 {association_rules函数
/ w, ~9 p3 m. h& V. o7 n语法:% P4 C# j; ^, t; ]
: u' r5 {$ ~& W5 Q: o3 h lassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)' E' I& \ J# l
1; J( G/ U; P4 z& v! O2 O$ A5 J9 }; R. T
参数如下:
# W4 d. h; i' |: \. S+ J* C1 `( X) `" j! X6 _% e
df: pandas模块中的数据帧,DataFrame形式的数据;8 a: Q( d1 ]9 F/ b
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
/ [. [# ?! Y( I ~! [3 gmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
' Q, {- C; H2 t1 p' v; esupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
2 P# G7 G* l- m1 {附带metric几种参数的计算方法:: t. u' H6 Z2 {) _5 }9 i6 g( x# [
) L f% i+ e! a, A
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]/ D1 k5 {; N2 N8 \/ }. Z
# t1 b9 @# ^3 P/ a3 Tconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
5 h# H# e U" [0 D
9 B }; j; Z! @2 o! \. d/ slift(A->C) = confidence(A->C) / support(C), range: [0, inf]- M4 Y; h: _; ]6 f7 }5 P
- A8 q. F/ [: c1 U# k. ~8 z
leverage(A->C) = support(A->C) - support(A)*support(C), q( y% x e# i+ n+ m' U( K l
range: [-1, 1]4 @% J$ s9 J o: [
- T: F4 H6 H Y7 |4 n
conviction = [1 - support(C)] / [1 - confidence(A->C)],
- U3 t' c) V* W1 K1 p9 [range: [0, inf]; y0 ^0 x C) A8 j4 Y; p8 c
2 p( P" y4 D$ |) s! f! A9 N
3.实际应用案例
" ?4 G$ Y$ r5 Z) Y5 [" g以下为完整的调用实例:2 }* Z* r" e& M4 X, Q6 o: V
+ R! j% s6 Q( |$ B& M+ C
import pandas as pd! |' S& Z2 S. r3 R5 V1 G
from mlxtend.preprocessing import TransactionEncoder* G; @% C' S/ _# N2 f6 _
from mlxtend.frequent_patterns import apriori
* B; o+ N' s8 G, E7 s" Kfrom mlxtend.frequent_patterns import association_rules+ v; g. \! ?3 u8 O' e0 D( r
#1.构建测试数据0 U S% C7 j5 A
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
8 g) ? Q( v- a( Z) Odf_chg=df['product_list'].str.split("-")
0 b% R7 b0 c6 q- `7 V* m4 b#2.数据预处理6 m7 R0 s. o. ]( i, g
#将传入的数据转换为算法可接受的数据类型(布尔值)
& @3 w3 c! S) Vte = TransactionEncoder()3 v+ x$ i0 E" [+ U" U6 W
df_tf = te.fit_transform(df_chg)7 _1 |6 D) {( T* F3 D' p8 p
#为方便进行查看,生成dataframe. m. y- B! |; K& {+ H
data = pd.DataFrame(df_tf,columns=te.columns_)4 \" T( E5 @6 Z3 W r# E
#3.建模
+ j2 {0 i5 S; g2 o3 T#利用 Apriori函数,设置最小支持度为0.2
7 l: ^% M* H* s1 c9 a3 A$ Ifrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
3 f4 c# F; @& |4 i2 b* i+ W. ^2 o8 P#设置关联规则,设置最小置信度为0.153 j: D6 b( `. M R' r; }& w9 i5 r N
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)4 x" [! R: _2 S/ D- d& x
#4.剪枝并控制输出8 I8 h, u5 V5 \- c- y" L" h8 K
#设置最小提升度,并剔除对应的数据. W o l; l9 W( g* h6 x
min_lift=1
( \ w w. K1 Brules = temp.drop(temp[temp['lift']<min_lift].index)" G7 b, \0 E/ N5 S5 G6 K
#筛选需要输出的列) a) R, U8 s5 Z2 J! n5 o6 e$ R
result = rules[['antecedents','consequents','support','confidence','lift']]# D! X _2 L5 s) t4 B8 H E- `6 x5 Y
result=result.sort_values(['confidence','lift','support'],ascending=False)0 \, |& u4 a7 i- F4 c& O
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
5 o; F( w! n; U. {( o, x0 k
9 |0 _3 z8 R) b7 J- J0 h. M+ t' s1
$ V3 }0 q# S3 y. i2# M7 d4 x$ {. K8 [7 n
3! @# | B. v# N
4, C/ w! o" {( ]& p5 r6 A
5
8 x. ?3 J2 D7 G9 V6
- b8 x# u. d9 t% R8 L8 k& b! k7
0 d; }5 G+ I$ J& b4 m# H2 \; ]8% E( M W- T& t$ B
9& q3 v* N* w( ?7 Q! u
10
. C: K. v4 ]- l# K9 X110 l5 s9 @* d+ V, d- i" l
12- x3 J1 T% [2 R4 C2 e
13( @/ x& D% s7 G* x$ T0 ]0 F
14
1 h" c( }* Y' v4 i ~% l4 d15
# w# @3 L1 M, X3 O6 l16: G" e0 B8 _! z2 S# ~, S( W
17
E7 m# H+ D7 `18/ N7 d, m9 W; c/ T
19
! W" W6 f0 O0 Q. q# @20: \% S" A; Q; d' X
21, `7 ^; G, h7 g. d
22
! \' S& n, e3 O# F232 k2 B3 _' H+ E: O. j
24
+ N/ ^" w5 f% P/ ?! Q8 o8 x1 H25/ _: D; a4 w# D- f$ R! G" g4 _
26) d2 a5 s5 s0 U: x7 v7 p% j# |# }
输出结果见下图:
+ U; P( ]" r/ e
# d; S" J/ O. c3 w" i0 c————————————————
* c/ u1 f3 q% M; `+ Y" X2 `3 t" w版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* t* e/ u" ?0 F5 Q4 K$ g
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
' ~/ D2 {1 Q' H7 a" H6 A$ E7 V2 K" t& u& U
$ `* z) c3 W; {. c. p |
zan
|