- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564661 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174621
- 相册
- 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算法篇
! M m8 ], l& i4 H
1 X/ Y: i8 z# j, A0 Z2 R在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
3 Y7 a6 K( L6 _ Y' D9 R: q$ J; I. C
1.准备工作
# X3 @( w: O8 j$ x8 H& o, S8 S如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
* U$ G X; Q) H3 F& J; L" L
, Z. L7 x( \+ G q) Ppip install mlxtend0 Y) j" m. f2 H
1
5 k; j! O( b' ?1 l0 g为方便进行过程的演示,在此构建测试数据:" i" m& }9 R8 z, \
: g% |0 y' _5 K; w3 D
import pandas as pd' }+ F; N0 A' Q, k
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
3 p% b% _( s0 P. Y1) P& H: t9 g3 ` b7 c
2
?6 g" {5 n% P+ P7 c, k测试数据截图如下: R& J: }, T% i4 q, |
% M3 D" ]. k8 p1 E' r4 g6 d
' P. l6 V8 {1 {
对上述的数据进行以下处理:% l7 V2 m/ |" ]
. D, }0 s1 R$ i- l- ~* V3 S& ~% ~6 \df_chg=df['product_list'].str.split("-")
( |( t0 u: D4 U5 {# H5 A4 F1
: z5 T9 z+ H T1 l数据处理后,结果截图如下:
9 Y5 p* G5 E- W$ e6 {8 g- }$ Q
, H/ B$ t8 _. I. N. Y) y截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
/ W& w9 K3 k* B1 j/ f; U; x/ I7 F6 M- N2 }0 ~; l. E7 R/ c
2.核心函数及代码2 O' s" Z, R/ B3 A! m
2.1 数据预处理
$ V# F' a6 H% b% J1 D对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
) P0 A! G4 s, Q/ |* [
9 \% e% a2 R. u+ [! m: n, u#1.将传入的数据转换为算法可接受的数据类型(布尔值)
/ ?2 C$ p8 e" j2 t: l ?from mlxtend.preprocessing import TransactionEncoder
& I1 G* _" S) ?! j% S& D4 kte = TransactionEncoder()
}; O t7 P9 L+ R7 P4 Ldf_tf = te.fit_transform(df_chg)
: S) n& M9 p6 ~* r#为方便进行查看,生成dataframe
% o% I* F$ `# e* w- Ydata = pd.DataFrame(df_tf,columns=te.columns_): T/ Z' P5 Z7 F
18 Q4 s: }1 g( `! y L. d0 b$ X
22 t1 k, M( E- f) u
3
- H5 n; U6 b2 L4 J% C& q4
* s; O: ?& Q5 E! }9 W6 d' s5
4 I( [+ |4 \4 J0 ]1 V8 x6
9 i D' K# p0 q" r* o( d1 B; p运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:3 X) K! K W e5 c, ?/ i6 n
2 P U. J+ F) l/ B0 A) [! S( C$ r, F
" j+ X$ k% Y0 V
2.2 两个关键函数/ `' v2 F" r9 h6 M* g- \
apriori函数
' t4 ~8 z% P1 ~# M; L7 L语法:
/ }& j: v8 T1 H; R1 k: S: P4 T x$ p- Q4 t
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
, W5 C/ Y7 v I5 ^8 D& Z% v, M' @1$ a4 r& y; }. R$ D+ |6 O# |
参数详解:
- T ^. L8 |% L) U. @8 F: e. B7 v9 [2 D
df: pandas模块中的数据帧,DataFrame形式的数据;0 q0 y; o0 v8 E4 O, R( c5 }+ s. A
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
4 C0 N" k4 w' _2 quse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
2 l" t7 r' N, U$ {max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。) ^1 a* j2 A2 O" x
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
: Z1 R# p8 Q q: Flow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
6 f% E5 d' e! P Cassociation_rules函数' E9 k% J! A/ M7 d) e# }1 R1 R
语法:5 ?$ @0 H- e5 m
- i+ @/ ^- a9 L
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
O6 K9 ~) X' L, k1 ?) ]1
5 {: @2 f& z% q) n% j/ _) l6 o参数如下:
1 u% H- \6 J0 [; {# ~
' I. _0 M% ]* ?) E$ udf: pandas模块中的数据帧,DataFrame形式的数据;0 D" V3 h' G) G% m8 v
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
4 l- N; z& Q; `1 e( p( ^min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
+ U& L. O n& E- [) r8 xsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
. v0 t( O. L9 ^3 I' t附带metric几种参数的计算方法:9 l1 |: A5 q9 k3 b, f$ F
4 J i) b# q* `' o. hsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
( n* o9 ]2 d4 U0 Y
: C4 D2 |* Z9 g4 ~8 econfidence(A->C) = support(A∩C) / support(A), range: [0, 1]5 b* `: z4 a" u) V* m+ p9 n5 l
3 V' x. M4 a* ^1 Ulift(A->C) = confidence(A->C) / support(C), range: [0, inf]
+ w" h% u; k9 I$ g& Z) F, L, X+ y
. _& L" b( m3 q8 H: Tleverage(A->C) = support(A->C) - support(A)*support(C),: J9 l1 n7 P5 f3 E5 B
range: [-1, 1]
. ~4 Q( s4 @6 g$ s. L- ]( ~: W* L
/ a/ C8 c- p6 g( fconviction = [1 - support(C)] / [1 - confidence(A->C)],1 v7 M$ z. {4 |- l( ]
range: [0, inf]& }3 ?( S' w) A9 M( t6 G, f
- U9 Y2 B$ Y# z3.实际应用案例( U" P, r: f7 e
以下为完整的调用实例:7 x( X6 x) p1 ?8 e% {2 S
8 e7 |2 Y6 | W% w
import pandas as pd$ Z R3 G, L: } I
from mlxtend.preprocessing import TransactionEncoder' l+ f9 g# l* W4 X6 O
from mlxtend.frequent_patterns import apriori9 x: U# ^9 ^" X
from mlxtend.frequent_patterns import association_rules$ G7 d1 Q9 y8 B* N$ s) X
#1.构建测试数据) y5 l) y6 m$ l4 ^) O
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})4 V1 B7 i1 Q3 ?) w) B& |8 D! b+ j/ v
df_chg=df['product_list'].str.split("-")( t* \/ s, J/ Z0 J+ V
#2.数据预处理' Q/ ]! q \( T2 N3 [
#将传入的数据转换为算法可接受的数据类型(布尔值)
- l9 v6 p# E5 H8 s/ pte = TransactionEncoder()+ j$ u$ B! P* G
df_tf = te.fit_transform(df_chg)6 T- w& f& N0 s8 @" s
#为方便进行查看,生成dataframe! r3 M$ ?% I+ i+ i# U
data = pd.DataFrame(df_tf,columns=te.columns_)
/ @ k" c& o8 f+ H#3.建模1 R" ]' n% r* d* z9 o3 U9 F
#利用 Apriori函数,设置最小支持度为0.2
, W8 P, z2 N. V- P9 k9 l2 D2 yfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
* b2 j) _! u% o- c5 V#设置关联规则,设置最小置信度为0.15% V M& E; l8 l" T7 x& v: N
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
5 T2 W% r F) @( r4 S% i4 g) v#4.剪枝并控制输出
, @/ s4 q4 |# ?' E# C# `2 x#设置最小提升度,并剔除对应的数据
9 L6 w, @8 C1 p+ gmin_lift=1
, G! }$ j4 @; |rules = temp.drop(temp[temp['lift']<min_lift].index)1 ]# V+ ]6 [! n! z$ k1 j
#筛选需要输出的列* y; o; d) C6 {6 n& k- _# ]
result = rules[['antecedents','consequents','support','confidence','lift']]
" b4 Z0 V* G% Fresult=result.sort_values(['confidence','lift','support'],ascending=False)
) A9 o, T- X, Eresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
: k7 i! U" ]2 B; ^/ d) V3 r# P9 F+ z- N1 A+ v
1, [3 G8 r" O S: i `2 ~
2
. S9 D: B6 l( M$ F3
+ h9 t4 ^/ [/ ?7 r! n y3 S4" z- \1 T( g- H1 G- D% x {2 O
5- {4 {5 [6 M# m
6
; M5 F6 v# P$ Y7 U+ S9 h, L: ?7
- q# @' \2 V4 W/ i, @7 @* ~8
5 j8 r! p" F# u' }( k1 q( t9
: n4 v8 V$ S F: y' k+ }' H* O' c10
N) n, p) N! P$ k8 r: R, b11
3 w) ?7 Q t% M" d7 f% Q12
1 U7 u2 Y9 @$ v1 W! l131 m l$ ?9 V! j: N9 o0 V
14
: z v' n2 h5 q4 f15
; R% P- \6 X2 I; g+ f16
1 V4 Z( h6 a4 d/ ]17
, z `# |& p! N& }3 [9 ]7 N2 f18- O0 X9 O, s0 l5 |* J. ?
19
7 z: I' _! `' D) {- n207 ~# a; x. c: y h# V# Q
21
( P: W% V: z6 t223 F* j# k1 i( E3 G6 M+ Q
23$ }9 y: J" T+ D- I
24
, D/ B0 D# b9 j9 L25
" U% m R- L. U5 n26: z( E5 a* S# K
输出结果见下图:, ~6 }) `4 @3 x* l1 T8 [$ I# P
. g) r7 T+ j( ^% Q/ g———————————————— F7 G3 j( c3 ?/ E7 x$ E- T, e( |
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 O8 @. D: L% k+ z# L8 b
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
P" c9 ^; x: W7 t8 P* i. h# V7 m5 G- D/ u/ S
5 N( Y9 n( q7 X' E* ~ |
zan
|