- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564952 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174708
- 相册
- 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算法篇1 i# {# ~. a/ M/ C$ ]2 k+ f
, g) a" W/ `0 w$ q5 f0 n0 `
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
5 M/ V. W: H7 }* R" V9 y1 l
# K% V( j) a, ?0 I/ w& Z1.准备工作2 z# i( E; G- s+ N6 ? Z" J% U0 j) Q) z
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:2 }- i9 B" g( Y" x) Q) O; n0 ?
1 y0 s# B/ O7 bpip install mlxtend$ P3 s+ \4 r* P: P% t
1% K' p( @& ^$ Q s/ k* O
为方便进行过程的演示,在此构建测试数据:
2 K0 q. u( s/ }& {6 i
4 n% x. e2 T+ N. Z+ R0 ^import pandas as pd
: T; _/ w6 m4 k& j, jdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
& r5 V6 V2 [8 y1: b; @9 A- F/ C
2! i/ G! ^1 e4 g( s/ V {6 a
测试数据截图如下:. x1 y4 M7 ?0 S, Y& ]
+ O) b! u6 [2 Q6 F) C
7 T4 f7 l: }6 Y" m& q对上述的数据进行以下处理:6 m: m% r- D6 e8 t
6 k2 L7 [1 z- w8 s
df_chg=df['product_list'].str.split("-")
" G5 {+ v c, V6 R. X. W3 w1
. d. |4 T1 e" N# P& E数据处理后,结果截图如下:
- L- c+ j, I3 j# H, q
$ e* t5 _$ E$ F* k% C截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。( ]5 f2 | I8 z3 w4 O$ F
& Q1 `% ?, N. C3 z! `8 P
2.核心函数及代码
% P$ p9 J# l) E1 x8 r2.1 数据预处理2 F/ f4 l* B& [8 ]5 B" [
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:; e* I/ a- L" d2 B
' S+ \& P2 @6 i2 f \#1.将传入的数据转换为算法可接受的数据类型(布尔值)$ f0 d" T9 }" {. M: F6 ?0 H2 N
from mlxtend.preprocessing import TransactionEncoder' p {. G Q% b0 Y) l+ l
te = TransactionEncoder()
3 c4 v$ s" K3 W( X. g5 Gdf_tf = te.fit_transform(df_chg)) _8 n& O0 k5 O; ?3 q, _
#为方便进行查看,生成dataframe U6 C# u$ L- S" G0 ]- w W$ @
data = pd.DataFrame(df_tf,columns=te.columns_)
7 o& X. o3 l% N! }% a1! }9 F+ ~0 B4 f( A
2
F$ ~" G6 O1 q6 z0 t [3
* w# S$ Z) m) j( j5 r" |9 _- {, v3 u49 a% y8 _$ N( C: Z0 X
59 t; b1 |- E( F- W2 l5 U* N, j
62 g0 c2 ]* n9 m2 g/ a' m
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
1 y+ P, N5 Z8 r8 z
2 t! p' N3 `* x) ]2 Q
- l2 Z: {7 p1 s0 y7 @8 s2.2 两个关键函数7 w5 n1 R N: ^ \3 o
apriori函数
1 Y( s5 }$ N+ g# k9 k语法:+ ~0 ?) C2 G1 j' u% L$ c
; b' @8 I" ~3 t& g2 }5 Oapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)5 a5 J2 |+ D! a
1& X, O; u4 ]; v8 |! z$ |9 N n
参数详解:# D. h) z4 [7 q4 R
2 m+ B8 o" M- C2 B# r: ?df: pandas模块中的数据帧,DataFrame形式的数据;
6 i6 P6 u" ]5 i8 _. _4 Smin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; u, V" x+ Y; a5 {
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。, _* H! R# N/ b C6 ]& v I0 n- Y
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。; ?/ X& J( p/ s2 F2 ?$ w" C9 F
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
% ]8 h" q) t8 I e: b% Wlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。& T, o! @' w: v
association_rules函数
! B5 ]4 O% N1 V7 W8 v4 T) m语法:; E& T0 Y/ u" Q8 j5 o; k1 m
/ y% f8 z' I2 P1 z
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
4 x- `" V: X. f; V0 M' }4 M1 Y3 }& n1
e/ j/ X1 J. r N5 i! T9 g: k N参数如下:
; a6 v/ m% U' j9 C1 k7 T0 F$ z1 \" @8 j& B3 l1 }0 ^+ J; c& m
df: pandas模块中的数据帧,DataFrame形式的数据;
& @7 q+ {6 m/ q- F0 G( kmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
9 G. M4 j0 G* z) u" K, |/ Ymin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。" y. L. R; o/ H- L
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。+ f% R# Y) J: {
附带metric几种参数的计算方法:
+ Q* P* L, o* t7 L4 H ~; Z& h! R$ C+ H6 V& f1 E$ Y
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]4 y/ m+ r% k/ W# D$ u" h
' X9 U& B* ], m' H S0 Kconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]% @* W1 b4 B; x7 e5 i0 e$ ~
6 J5 j. C6 s8 Q+ d, C+ K% ^' Qlift(A->C) = confidence(A->C) / support(C), range: [0, inf]
# P0 c* Y2 V9 R& r8 J: s
8 m& j5 C! u5 m! B+ ^leverage(A->C) = support(A->C) - support(A)*support(C),0 j& N* E- J+ l! A
range: [-1, 1]- `% b3 [. d3 l
6 C; ?8 C& ~9 n/ Pconviction = [1 - support(C)] / [1 - confidence(A->C)],: ?" u3 C% [5 m
range: [0, inf]5 Z9 O1 ~( h* z3 A/ J- L0 M
! L1 v9 ]9 W' }
3.实际应用案例
8 Z/ F+ D5 V F/ m以下为完整的调用实例:
$ R" M8 U7 E) f% U# I0 U3 _- Y2 n3 Z. E/ I( l6 q1 h' a4 w
import pandas as pd/ v x: p$ s6 x! b
from mlxtend.preprocessing import TransactionEncoder
8 f; U0 ?& K- h7 R, _ W! ]from mlxtend.frequent_patterns import apriori
7 {5 j+ u; }6 xfrom mlxtend.frequent_patterns import association_rules8 Z( H7 X2 L1 h$ \
#1.构建测试数据& t' s `3 M% {1 X
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
( O* s; p3 B6 _, C# y5 ydf_chg=df['product_list'].str.split("-"); |# I" c/ _: d' o+ i; t" j- m
#2.数据预处理- z- A9 _8 t+ m9 ^
#将传入的数据转换为算法可接受的数据类型(布尔值)
4 d$ T; w/ m( i1 W6 b5 }te = TransactionEncoder()% I- z# x4 s7 }& _
df_tf = te.fit_transform(df_chg). o* w) Z$ G0 D4 f
#为方便进行查看,生成dataframe
$ ]( r0 v) ~; T1 _data = pd.DataFrame(df_tf,columns=te.columns_)
3 {) o! }: v& A+ u#3.建模' I0 [) i9 U. L# _
#利用 Apriori函数,设置最小支持度为0.2
# Y! ?' {* @7 t! gfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)! b9 y. X9 ~/ W. ?
#设置关联规则,设置最小置信度为0.15 ?$ i% J1 v* Y! ^/ k. Z1 q. k
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)8 A9 O' Z+ O% D9 h/ H0 F
#4.剪枝并控制输出5 o* R8 _* D1 H' @: Q7 S- C
#设置最小提升度,并剔除对应的数据
! ~% X" x( W; a" C/ bmin_lift=1
$ S% F1 j1 }7 o [& {( y. Irules = temp.drop(temp[temp['lift']<min_lift].index)3 M9 F& ?' d, Q! N& ^. }
#筛选需要输出的列7 @4 Y: l+ \' o" Q/ C: d- ^
result = rules[['antecedents','consequents','support','confidence','lift']]
6 k& ~0 c9 D; M0 U" ]result=result.sort_values(['confidence','lift','support'],ascending=False)
7 T3 f( x/ C0 V9 W" l4 G! }6 Nresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')- W; H2 @, N' r& L4 e
3 h. @8 s( H) O12 s! Z" `6 @( n3 l6 L9 }
2
- j$ S: i0 y$ i+ r4 A- G3
4 b9 @/ a) y5 X5 e4 u M4
% r9 s& a/ M' i: G5 z0 w( D5
2 O& m) d, \. b e6
* \+ A8 O, x& t; [- y7 L* @7: S X" a( w/ L) l' U7 m
8
& @% \9 y3 Q5 s" Y7 k/ X9
0 H# f" s9 S* ]0 s! E9 w103 K# P, R6 j! x, L {: g
11
+ Y7 u# y$ y9 u) G% y. @12& Z; n; d( U) ?- f( s5 ?; G/ ` F
13, B8 y) ~! L5 G
14* `8 j( E5 z# ` e+ X4 |
15
2 P1 u% t7 p' n' A/ i& Z16
1 V6 a+ l+ T5 I* \% b+ ]: ]17) ^& v# [- K( {( a$ n7 A6 U
188 N5 S- v- E* [: V' E8 T8 [
19
2 b: k6 S) b7 x9 }* X! `20" U }# \1 T: g% n' l" e
21
3 g: K- n8 P% L2 R% w& z22+ _4 o/ u. f! V5 p5 K( E
23
0 G. r! \$ z8 T! M2 \" ^; D2 e5 t* P2 Y24
# v) g) t/ z! A25: G' ~2 c- l1 b7 z! U
26
. P) ~' U; `' u' s S# B2 d输出结果见下图:
# S- H* E) v$ ~) {0 {7 `: \
4 g* M* n' T9 ^————————————————9 [6 w. L3 Q- |% [% a5 s
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
2 U, G9 T. l. D2 o原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
9 x( t5 {. z' R. M4 Q% P5 O. T: F- c$ J* R( N
# Y1 M# `* p: j7 L* u. d& e |
zan
|