- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 560040 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173385
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇
6 l+ D0 p ?" L' d, \7 |7 |- b
" J6 k, }0 ]! d0 H在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
8 s( Q9 |/ }6 N# I* s& G! c/ G! `: i/ Y' ^( W( i
1.准备工作
) q; L' k$ B$ o2 j, v8 H% G如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
) n$ M D, g5 J6 l# I# A. r, d8 B) U) l8 o, m W
pip install mlxtend- f0 T) }8 r2 d/ c) B
1
% H4 D4 ` }; D6 x为方便进行过程的演示,在此构建测试数据: {5 A, t* Q: K$ ]! Q8 L3 Z
3 m5 w9 ]+ W) [; D" g
import pandas as pd4 z4 L. K b! J- O4 l) d2 i
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})9 e" D8 T, ~7 J+ S; X+ D
1; H+ Z, x4 P" I, R9 F9 B
21 T5 ^- D5 J+ N0 ?
测试数据截图如下:
& H( C9 D1 S& }
+ L2 p' M7 ?' F8 e0 u1 z( s3 H$ d3 ^
对上述的数据进行以下处理:! n' p [. u# W: T m$ E$ j
- U- B' y+ u# k6 T6 _0 W
df_chg=df['product_list'].str.split("-")
+ W K3 |- n' G: \1; Y$ C. A0 H/ S5 t: o0 N' b7 M. U
数据处理后,结果截图如下:. J( t1 C: }. n" j6 [
5 |: l- H% r* Y
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。3 E4 t/ Q7 B3 E
" f% s9 B$ [* T0 g$ @8 `" k7 ~
2.核心函数及代码
# g2 ^4 H# s) f! k4 R2.1 数据预处理* f5 r" w% ? Q
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
- C4 o4 V7 Z w) K p
z' ~7 e: c7 Z0 r#1.将传入的数据转换为算法可接受的数据类型(布尔值)
8 G9 G3 U Y% W rfrom mlxtend.preprocessing import TransactionEncoder- q. N( B" y, M- c% X
te = TransactionEncoder() X) G$ R7 r4 T# H
df_tf = te.fit_transform(df_chg)
% ~3 k% R2 r6 w1 @; X; H4 U#为方便进行查看,生成dataframe" l, {- o8 n5 _: G1 D6 b. e
data = pd.DataFrame(df_tf,columns=te.columns_). ~6 h% a* |3 v* C' s% o! o
1
% ]. x# p6 q9 N/ |26 f4 M" b0 e. O7 v6 W9 S
32 r4 H$ `9 b' c
4
, T+ ?+ x# y0 E5$ q5 h, `+ g& N% b7 x
6; F: O1 `/ J! l+ F
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下: J+ Z# X6 ^! r: P, l
! k( T( P% \! U) }" ~
* h( Y x! z1 ?2.2 两个关键函数
% P4 c0 }( h! {/ h. S lapriori函数9 Y+ x+ v* |- S% I3 p5 Q
语法:
/ Y! U0 h' @. W# S
/ Y5 y( N9 h+ b8 v: aapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
8 S# V! D, Q! X& i5 W; H1 @, u$ C/ V& z* f/ k
参数详解:4 M0 o* O" g9 _4 q( I0 b
6 R! h* m2 e$ S; {7 ~! h& `% L: ?
df: pandas模块中的数据帧,DataFrame形式的数据;
) u4 x4 O7 n# X6 E% Vmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
. n" l; b3 Q! T7 p! J+ H4 euse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
+ D! h0 p' j# W% Mmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。0 q" w* ]0 D1 n2 I
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
4 n1 m$ _7 Q1 H' @1 `low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
; F( ~7 Z5 V. c0 M# T) dassociation_rules函数9 }) X/ A1 @ _0 d/ A6 ~/ I+ K
语法:# A1 a/ Q+ M7 O( \0 W% \
* q/ c2 N7 r* b3 E* oassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)! h$ M' Q. C7 |& D
1
& x2 t2 Z7 \2 I; B( a& P, ~1 n- n参数如下:% g+ l! Q) L+ z$ c; _& {* P
& v, ^/ `! H4 W
df: pandas模块中的数据帧,DataFrame形式的数据;/ M1 {! R& ^! o9 y* U" x: ^+ I# S
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
# y5 F- @% R. d( G- f; `min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
# m% D) G0 m: F& {! ^. [support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
4 P5 I) N3 u: |# U- N! L0 T6 G* | R附带metric几种参数的计算方法:
7 d% p/ O) }2 x1 M( r
) J0 E9 d. {' Q: xsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
" A o& _9 w6 F! Y: \4 m. H8 o' @
5 G9 C. \' q }confidence(A->C) = support(A∩C) / support(A), range: [0, 1]- x/ A# B) p$ @7 w6 w2 U/ g
& ?9 d2 t" c2 p/ a4 b' l# c
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]
; p& ]/ j8 s! C6 `8 M9 M8 `( s8 J% E: r6 d) j- H& k \
leverage(A->C) = support(A->C) - support(A)*support(C),' l; @7 w' z7 b% E0 O$ C
range: [-1, 1]# F& g0 U# M: X/ }' M2 l# n
+ a1 O. N; K- z) {" Tconviction = [1 - support(C)] / [1 - confidence(A->C)],
" I2 A) ^9 x' ?range: [0, inf]8 F; ]1 \; \+ c
! L8 Y1 S- d9 I' k- y: _3.实际应用案例
8 q( Y' V$ ?1 W3 c2 [7 n! X3 m4 u以下为完整的调用实例:
; U; V1 a# c2 ?) k& W4 l2 T o# z% ^, {' w" r
import pandas as pd
3 E2 E9 L! g! f4 X- Ufrom mlxtend.preprocessing import TransactionEncoder8 m$ j4 D+ S6 R& t5 c2 R
from mlxtend.frequent_patterns import apriori1 P% p! g) `0 M
from mlxtend.frequent_patterns import association_rules) f- c, Z9 ], |$ m7 [
#1.构建测试数据
- C6 F3 s4 _- b4 j+ e, Adf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* j+ i9 R/ C& t- b
df_chg=df['product_list'].str.split("-")& k0 f$ U1 Y2 w5 K
#2.数据预处理
$ z' n& s1 t0 D% U I2 D" j, i3 E#将传入的数据转换为算法可接受的数据类型(布尔值)) d( f1 n% |1 T( K3 G5 s
te = TransactionEncoder()+ y( h+ H% l- ^0 b
df_tf = te.fit_transform(df_chg)
\& D4 W$ X& T% Y6 ~#为方便进行查看,生成dataframe
, T6 |5 M& _6 N, Q" Fdata = pd.DataFrame(df_tf,columns=te.columns_)% g. _/ C! I6 [) T! |: E
#3.建模- k' `2 m/ `; [, e
#利用 Apriori函数,设置最小支持度为0.2
/ H1 o; e2 B% a$ U( \frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
+ z5 n H/ E( P' n#设置关联规则,设置最小置信度为0.15. B! a2 [9 B* z3 Q* v1 R) q
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
; y+ y" ~) G& W E! t#4.剪枝并控制输出
+ ^. Q* V4 m2 G$ z#设置最小提升度,并剔除对应的数据
$ i1 v# e. v6 U& [8 omin_lift=1
/ M$ N* K% Z* X6 lrules = temp.drop(temp[temp['lift']<min_lift].index)
5 A, m3 y+ \& \#筛选需要输出的列& ]* ?3 B& N' s/ x& }
result = rules[['antecedents','consequents','support','confidence','lift']]
/ `1 B5 \# N, k# T6 o$ D& xresult=result.sort_values(['confidence','lift','support'],ascending=False)
' c; h* _% f6 q& q+ c$ P- l1 \" zresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')+ U7 ?9 A- h( V4 l+ t6 g( {
% |" h( q! v# o1 \1, A i6 V) Z( m1 l! X# _! i, e* L) W+ R
2( g+ a3 o9 ?; V1 P$ |+ e! c
3
- m2 ^/ F6 F0 B2 o8 Q4
( R% }4 W( ]4 m8 N) y: x5
2 q7 T2 k$ o% K5 A/ @$ ~: h6
) _% n- w8 o3 G6 e8 |7
8 A) r% R1 a) G9 t8- P2 l: ^. `1 D$ A3 k
9- e$ g E, L4 y- {0 G: T, H
10
$ o+ c7 n* Z1 M) W4 {11
/ }1 u, x1 ~3 o9 |' W, \12/ P, w8 g( t2 Q3 p6 s- S; X
13+ S' t2 x/ _' s" ?( w
14
- F, P( E! d. z5 x5 e3 c! @159 O* s1 \, E9 |
160 o1 H5 z: P0 s2 L% d' B0 v* V% o
17( `; P/ K! V- d, f5 v
189 w( N+ Z. ~" o5 m5 \
19
/ \& n* q5 b- m. j( d208 B4 `/ e7 e9 z' H h" D) {
21$ F* }% ?# t& c
22
1 d& I. h& p4 X& [; d2 j9 X235 A5 S2 U2 N6 x, s: a6 R
243 M# _; Z# U9 } `1 |
25$ I7 e3 p, ~. ^6 s( d2 X, @" W4 n
26
1 p) K' J# ]" b6 a- E; ?2 x( V输出结果见下图:
4 R! @' J1 Z* p. y0 U8 K! f2 @/ d! a
* T/ D! w, ?& ~$ b/ I————————————————
9 I& M- |2 ?; @- S3 m版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 y7 Q4 V8 }. a D
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
! T. W' ^$ \$ J+ ~2 C, d% H: q- M+ o
/ Q: b" o. t& V! [ |
zan
|