- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565606 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174905
- 相册
- 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) B1 w1 |$ {5 [# R7 r( k
& j! }3 |/ y+ v7 P在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。4 q6 R1 @2 X( N( g! }1 U W
4 T0 c) R" f, e, l: O6 ~1.准备工作
4 B9 I+ n+ ~$ @( K2 h/ o7 D2 H如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
2 A3 e5 Z& p; C
/ ] N! C& B. K. V9 N) ppip install mlxtend K7 y. z: F3 T3 C' h1 x9 A* d' Y
1
E$ E, Z& }9 ^ A为方便进行过程的演示,在此构建测试数据:
0 {% E9 N7 [! o J- i
9 q i2 \. O( W7 R5 \import pandas as pd$ u/ u2 \: \" _, O$ B5 t* y; C
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}); j7 p; T1 D$ }( H( r5 h
1- C( i8 g# ~9 I: ^ l
2( D2 }7 x, v; I7 i( ]* c) r3 V
测试数据截图如下:
) `. V* g7 q* _- |2 ]+ d5 O4 {! [% n6 W5 X4 h+ D
) J) |- P8 K( D4 Z: M对上述的数据进行以下处理:* c7 L. }2 h3 o0 Z, X# H3 W9 u
/ B P- E* W% R
df_chg=df['product_list'].str.split("-")" B4 m% `, v9 X+ W- ] Y
1
9 V$ G, B+ @ j6 ?" J# ~, F数据处理后,结果截图如下:/ H( l* ]+ a. ]+ u9 i/ A
( X% W2 q' f' ^- \: J
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
4 O& b- n. u1 E" `1 B8 `" C& C; A4 [( T
2.核心函数及代码
& V! ? R* V. Z& Z7 b1 y m8 J4 Q/ m2.1 数据预处理
3 N+ F* M/ B3 i2 p对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:! p/ Q3 T) `* x
# c! i. i; u0 p3 p. W& ~#1.将传入的数据转换为算法可接受的数据类型(布尔值)# q/ F; ^7 h1 r. O! W
from mlxtend.preprocessing import TransactionEncoder
) P- k: v$ r6 c3 b& `te = TransactionEncoder()
# Y2 U- N7 w2 o6 s/ a( udf_tf = te.fit_transform(df_chg)
! `% P8 a' ]2 V: g#为方便进行查看,生成dataframe
- O$ ]; a9 p) G( q tdata = pd.DataFrame(df_tf,columns=te.columns_). {. o; r: G+ l
1/ n# R0 y5 [! O5 G, F
25 B; l g& I7 Q, }9 o$ Y
3 A& z6 N, w. [) v3 h' {
47 e% H# L5 I: Q! a
5
2 `& F' [' [" Y ]/ `* r7 y6
7 d: z1 q/ K. X2 b运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
% R3 O$ t u1 A# k
4 S: @7 ]) n5 @* \2 T: {, @; Q4 k' Q7 g! k2 p* t* Q
2.2 两个关键函数
8 g; C1 Y/ e; m5 a h7 f4 f& K8 uapriori函数
j) Q7 W) f4 i0 n9 s* M! T语法:
6 m' Y& O' U" F6 M* n+ f+ B1 o8 Y D) C; [
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
t* g$ i& K3 |( X/ B4 l2 f" I. _1
/ m1 _/ E% T8 D0 m参数详解:
, Y: t$ e4 a$ u! ^3 ~
! M+ n% g- p$ ^9 R( _df: pandas模块中的数据帧,DataFrame形式的数据;5 X0 K" b, P3 }6 ?, f
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。+ F) t4 K* ~* A. D2 Q ]1 Y* G
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。, C% h: O6 F% J7 n
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
' O" g1 V4 S4 j# l- {8 E1 c' Sverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。2 `4 \! r7 w. e, r& z+ U$ I
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。8 z- j l7 v3 @$ U) m# P( n
association_rules函数
" c- h8 Z- |/ V6 z语法:7 {( N! P+ W7 j5 p6 v
) T$ g' X3 O3 c
association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)' O+ c( `' W2 ^
1
3 H* ?& j. U5 ^/ F5 y/ z参数如下:3 O) L8 W( X' {) [" a, H
^2 d: l' v# _0 i' D# F, b
df: pandas模块中的数据帧,DataFrame形式的数据;1 r+ z( c8 K# u# n B7 N
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’/ C. I- U6 [+ f$ _; M
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。 D4 d; M4 h; d/ m* s5 W" [) Y
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。' _5 g W7 e' g0 J
附带metric几种参数的计算方法:
8 W1 D$ u E3 t# y8 `8 [+ b( j; B# H( v- u! i) I' g: K
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
1 }" ]) N1 K; t. j' `
! W5 Y- l* Q8 R2 ^- R8 k5 Aconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
! S; m' o5 M. A- Y6 V* f
5 p; D, W( V" K0 v1 Slift(A->C) = confidence(A->C) / support(C), range: [0, inf]' A1 {/ R' k3 r% \
1 @2 j9 [5 y- {/ ?; |& y
leverage(A->C) = support(A->C) - support(A)*support(C),# i9 G \: ?& Z) `- o5 i \
range: [-1, 1]
" H. ?5 a, }; v1 }8 ]$ ^" p$ `
1 m& A$ T+ Q U) C) s0 k$ V8 Yconviction = [1 - support(C)] / [1 - confidence(A->C)], c, Y0 `+ u2 `# S" s; g
range: [0, inf]
6 j7 y3 ~4 k0 H* ^. a" v* r O, o& u# o9 ?7 j
3.实际应用案例/ Z5 y4 P) C$ N; f4 n
以下为完整的调用实例:& \% M- |" W1 v
$ J* v7 G+ J \! h% x! ^1 ]7 Ximport pandas as pd8 F( E' t5 a: o2 D. W' q( s
from mlxtend.preprocessing import TransactionEncoder) ]' i! \" M) Z- t. N8 a
from mlxtend.frequent_patterns import apriori3 Z" ~% p. v7 U n' _
from mlxtend.frequent_patterns import association_rules, ?/ i r! J0 G! M" _* R
#1.构建测试数据1 d7 n* X) i/ d
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
, K0 q2 K- s! Rdf_chg=df['product_list'].str.split("-")7 H2 |# i7 {3 i
#2.数据预处理& K: e" D* l/ S( Y/ @
#将传入的数据转换为算法可接受的数据类型(布尔值)
3 C, p$ ?9 L5 ], [2 e5 `9 ete = TransactionEncoder()
, y7 \8 V+ h( S# xdf_tf = te.fit_transform(df_chg)5 I( E% O" Y# M% z
#为方便进行查看,生成dataframe$ M$ q) O( ^( K2 s+ p. y7 R8 n2 G- E
data = pd.DataFrame(df_tf,columns=te.columns_)
6 ?/ F) s, o' z+ n: V#3.建模6 {# [: Z) N9 G8 Y; J! w7 w
#利用 Apriori函数,设置最小支持度为0.2- ?# r! V) O: J J* |1 d
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)% @0 w* M# u* p) }- \
#设置关联规则,设置最小置信度为0.15
% W0 X+ L1 w8 ~7 O# ]temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)% f4 Y! q: P, }* w
#4.剪枝并控制输出5 d& K: O3 G. k$ E
#设置最小提升度,并剔除对应的数据
g0 ?9 P1 R' u/ E! X! Dmin_lift=1
# @. s/ o4 {9 A/ hrules = temp.drop(temp[temp['lift']<min_lift].index)
( H+ V2 ]" k1 K3 B* f/ I' ]#筛选需要输出的列
& W m& R$ p! ?% I" }4 |( E1 |result = rules[['antecedents','consequents','support','confidence','lift']]+ V: V7 q) t, j. W
result=result.sort_values(['confidence','lift','support'],ascending=False)
2 x. q) T. g) `! I ~result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
9 r* G/ Y @& | j a- H
( S& A8 x( }! M% o8 Z2 x1
/ s/ N0 x6 d1 J4 c4 ]/ f. G, {8 V. d2
+ n9 J4 C2 S b. ^1 j3
! Q! d; H# {; v) `4
; c1 M9 {) u* c. `0 Y5
# `. d4 _. l5 B" u- l6 _- o( g7 N8 C5 n! B# v3 [4 S
7. | {) q; ~+ C7 f+ d, G6 u% G! u
8# c8 A; T! T2 Z6 n5 q& T
9
- M- p* ^( h1 p! h" Y8 _10
! x$ ]- }0 f/ z1 N* ^11: Y1 H- k* k) }1 U: y% \
12
* A2 V1 P9 n) _13. a! Y. L5 e" c4 Z& p
14
, ]# P+ Y) J8 U' r) X" m8 |; `' g+ b8 `15% I( z$ @ ^: {3 L7 s, g
16' g" ~! Z" Q; K7 G: q5 M6 \1 R1 k
17" D: h9 C# k* b' u- f% W" T3 ^
18 A' q2 Q& Y: {5 M0 C
19
8 l0 n* N, q4 S! z7 _5 E# y20
! L' [7 `3 Q% J* X21
# m: ^* ^( w0 `' v. L5 a$ z7 \22, A2 \. F/ ?) _4 t& S' b
23
; q. y2 P. v3 d24
$ ?4 W; u& D" a; h6 L/ a* K- A257 K* A# P8 u& M2 F4 }, x
26& d5 t+ H3 h$ J' Q# w( K/ z
输出结果见下图:* I K. m7 X. `: x$ B8 H$ }
- q9 T* A% a+ b) W/ y————————————————
6 E3 s; ^* A* I+ B# G. H8 F版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。# W/ H& }* W2 ~0 |! K1 G, |
原文链接:https://blog.csdn.net/qq_41780234/article/details/1219207592 \0 q/ u0 k- ]
+ a0 ?! x3 R4 I1 A
4 R0 s2 E3 P) {* |* ]3 g. o e+ u7 h |
zan
|