- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563347 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174227
- 相册
- 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算法篇 S! D! L* [" P6 v8 k* q6 y5 X5 u
/ D1 v: s! R8 f$ c: c
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
6 H7 l+ c- l/ W9 ~! N* p* |% i0 [1 U( w* Z0 Q5 M
1.准备工作
" Z' i5 }, R3 a* M如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
, Y4 j, f0 v0 ~' {9 s
" E! y3 Y9 l7 y3 `. f2 Qpip install mlxtend
& s# r0 {+ @' K1 X+ i1/ `$ d, N6 o- n; o3 f9 A
为方便进行过程的演示,在此构建测试数据:
$ m6 U# p# n9 r* h8 N9 }0 k( j, ?
0 `, M# _3 j+ z1 V9 limport pandas as pd
9 V6 l! t! }) `: ^7 kdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
) l% c7 A0 ?8 n3 ~1
2 Q# {# s# x' |2 m' U- W2, b) a7 I! ~7 a1 o! a! C" {
测试数据截图如下:3 G$ H' E8 A! Z* E8 m# H: u
2 p2 @. M# ]) V- Y0 L5 X) ^* V
0 ~ g7 o9 C& x5 Q8 _9 ]
对上述的数据进行以下处理:, d/ U; k6 ]% Y" u. r
; f- Z3 N& q g# v! S: k
df_chg=df['product_list'].str.split("-")
1 i: R, t1 q- s( }19 N, W+ B/ ]7 g3 \3 t
数据处理后,结果截图如下:" I" h3 |1 \+ B* p- v
4 T7 g% L6 d9 @. }, \$ J截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
( G: D# m# `1 \1 e1 E$ Y
- G2 T" Q0 W; D/ n5 p e. g# O2.核心函数及代码
( y- |7 u/ c% E; P3 N! K [0 h2.1 数据预处理
& L9 m" ` Q0 o9 J! v. Z" q( k对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:$ C W+ y$ X8 B/ Y
% F* g; [$ u9 \+ O+ V6 g# y0 A#1.将传入的数据转换为算法可接受的数据类型(布尔值)$ y& J( F. P$ q
from mlxtend.preprocessing import TransactionEncoder
! d! j" P8 L; P7 Z& l# l. P1 e5 |1 yte = TransactionEncoder()4 t, e% s$ ^$ ? X d
df_tf = te.fit_transform(df_chg)% S$ }* x+ F4 p+ U1 N
#为方便进行查看,生成dataframe0 [5 {/ i" W' t: O) ^1 G
data = pd.DataFrame(df_tf,columns=te.columns_)
0 u. I! U( t1 h% c3 ]1 x1
' M- \$ }/ P( T7 Q; T$ u) V21 }% A; m1 V- b2 [
3$ `) I u8 ?+ Y9 {5 G5 b; Q. S# [
4
( |; Y) N1 H0 A: S5- D# M7 o8 _1 e, {, P$ K2 h
6' A% e' j. ]& }0 h, i
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
9 r7 l, X9 M& H' r% q
$ R7 k( ]- E9 N: s, r. |* p' X) S) g- D' R) M# |+ b3 ^
2.2 两个关键函数& n) n0 a1 o" O% L' X
apriori函数
& C' L: F1 {; E. h! B, |语法:' u0 v' J U* `6 y
1 R: F+ d" z! X l1 bapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
, L. K6 h9 A' \1 M. j, C0 w1
/ Y& ~2 J; P# I; z$ I2 o参数详解:4 n2 R* c$ v& B) d- R- z
. D# Q8 A3 J* o, G) n3 Sdf: pandas模块中的数据帧,DataFrame形式的数据;
, l0 _* b+ M c. q+ ?: a: Nmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
7 g+ e* Z! C2 q' e7 c/ g# Vuse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
: j4 N7 Y# D# O- Xmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。6 }3 p( x+ j& W8 S
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
6 X9 V+ Q1 D( `1 wlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。$ W H5 N, G3 r I! x2 _
association_rules函数
1 z; l( G8 _. \2 t G# ]语法:8 Y1 K# O7 s9 u. b) |
- z( W' [2 O5 z3 p7 n" Q7 _! h& l: Q
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
/ p! ]8 s" A( Q5 g, v) y7 I7 i& x1
/ o# r" D7 h/ L0 \+ _) \2 @参数如下:! u# g; H6 ^; m
1 g! C* I3 T4 [% O4 V
df: pandas模块中的数据帧,DataFrame形式的数据;' P4 p2 B7 \4 l
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’4 o8 F* ^' \- _ H/ l
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
- Q& M: z# C( R7 ssupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。# j- C3 ]: C2 z. \1 h0 E6 i: {
附带metric几种参数的计算方法:
/ K% H$ [# y* N) b
6 b u6 z6 Z& a! J4 A; Ysupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
$ [4 S; l( B7 P3 ~4 Q; a% b, a7 u+ ]( K- @" n2 j4 C6 U/ w
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
# M0 `# S0 j1 G' ?2 q' v9 {
: H0 `; s- m8 G. U8 olift(A->C) = confidence(A->C) / support(C), range: [0, inf]$ W8 \* A& ?/ o. [9 z; b) |
" ~! ^! T9 S4 c6 x8 p& K o1 r2 ?leverage(A->C) = support(A->C) - support(A)*support(C),
5 x: Y8 E' a* v0 e- U% [* q& c# O# urange: [-1, 1]9 Y5 n0 v# a7 l0 q% c+ p
$ D0 b, y; U9 c& Wconviction = [1 - support(C)] / [1 - confidence(A->C)],
. D' {. q2 G, j2 \range: [0, inf]
" ?- A, \+ ]! N2 L" q/ _
. D r" H5 G: r3.实际应用案例
) ?1 R& I! F5 D' f Z# O+ o/ z/ Y: k以下为完整的调用实例:
& z- W! P1 I( y+ P2 s; q$ D) Q) {: P2 w; C3 x' P1 P: B2 f4 n8 T
import pandas as pd1 n: K6 V. Y. S( f5 ~) `
from mlxtend.preprocessing import TransactionEncoder% s) L" n8 g: K# F8 ?
from mlxtend.frequent_patterns import apriori
" |* c; a! y6 x* F' [from mlxtend.frequent_patterns import association_rules9 Z. F7 M5 } J% h' f
#1.构建测试数据
0 F& w( n9 ^6 m T" xdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
; z1 Q6 i; n7 W: B( Zdf_chg=df['product_list'].str.split("-")! ]3 Q2 k* b3 |# I% `# X
#2.数据预处理. b5 I% O+ K* U3 |
#将传入的数据转换为算法可接受的数据类型(布尔值) }# I+ A8 x0 w$ U4 Q
te = TransactionEncoder() U I2 U1 a s. d( A
df_tf = te.fit_transform(df_chg)
; q! h% `" x% \8 J#为方便进行查看,生成dataframe
# H5 m% j Y5 x& f6 s! wdata = pd.DataFrame(df_tf,columns=te.columns_)
$ L3 O/ { \% I5 r; G#3.建模
, n$ b s5 B% h3 b7 W# [8 U; k#利用 Apriori函数,设置最小支持度为0.2$ [& @! u, T G# L H/ P7 W" Z L9 @9 ^
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
, a" s& {3 a, K6 b# s#设置关联规则,设置最小置信度为0.155 J% B' @( L- e; Z+ F \4 I
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
" ^* _7 q& u& O+ e#4.剪枝并控制输出
: D' p8 E3 Y# b" `/ Q5 t4 Q#设置最小提升度,并剔除对应的数据9 u0 L2 j" `9 a: _. m
min_lift=12 A# Y& [( y: G! ?, y( {
rules = temp.drop(temp[temp['lift']<min_lift].index)
5 p4 }' U2 L. p! A6 W4 A* [#筛选需要输出的列
6 H& V2 N. K+ d6 B$ j: Q. Z+ p. sresult = rules[['antecedents','consequents','support','confidence','lift']]
; }8 }+ A8 T3 T7 hresult=result.sort_values(['confidence','lift','support'],ascending=False)
$ K5 B& b) M3 o+ F: j" {result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
" j) Y# W# s' s6 T2 O2 D9 I+ ^( m8 u4 l( y- G9 \
10 A$ o2 D, v U2 i- l* v C
2# ^% f0 ?+ W, H3 @: g
3
! t, A& }7 l; S) f! I' z X4# |; m% n* d P
5
, r/ p( i/ Z. E) M6- Q6 p) Z! R* ?, `1 z Q; f: ?9 D
7
" b c c/ n: r8
9 S1 d+ x7 v$ u6 _2 U9. Y5 m+ p% x5 O
108 \$ }0 _6 j; K/ x- {
11
! E% ?- y0 T6 h12
* b5 I- _' `, F13
1 Q% X; [# J/ A# Q. i) k4 o6 r; j4 P& P14 ? N7 O# O' [
15
9 x$ X# F- J& w( Q2 t* f16% P" L7 x0 m! L! A+ _3 f$ q H
176 |* @1 r, X7 j$ f+ p
18
( J8 p' O1 e3 z5 H7 I; n O19
& v+ r5 `- j) G' O9 P" U6 i206 d" F W2 [! S( O
21/ ~4 Q' H9 o6 @* i1 `
22$ V; c- W; @8 y2 ]3 h
23
& V( ]: [: m; [/ q247 }4 c* f. ?# ]4 _
25+ j0 i& F- d2 o# O
26
, ?/ v' T! F' I$ M# b- n输出结果见下图:
( [- @1 _* l0 O
$ ]; M# z1 x9 j$ N1 U————————————————$ E, l# u) k4 I
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
3 w/ M: ]! S9 c0 F原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
0 Y5 _0 N1 q$ ^, H
) N' P$ ]. O9 r( J$ E7 K# p+ u v2 d
|
zan
|