- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564672 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174624
- 相册
- 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算法篇
6 g% D2 D# p3 E% ^; [( u( i0 ]4 r' V0 l- S0 O
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
. L+ { E- n4 V7 x7 j' S4 w W$ B2 C7 h4 s1 Z4 k( V
1.准备工作. k3 l5 I V6 _" S$ P/ y9 k& g) U
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:# K0 p$ y5 I' N
" G1 A( D, ^' l, Y Y8 i
pip install mlxtend
1 c4 A7 Z% \, a+ ~+ n1* X. Y! V/ t" X$ O2 g
为方便进行过程的演示,在此构建测试数据:
# g" F: R) ~8 {
# N5 b' r2 [! @8 }import pandas as pd
" X! p. D+ Z5 K r5 g& m# j; `, |df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
) m" d% N( C# T+ N+ y7 b$ B1: V3 l% o8 H; Q5 \. V
2" [+ a u2 X( G
测试数据截图如下:
2 U/ }5 s! |0 g! }8 Q
2 ]' }! C2 s- V" D9 v0 a' s" R3 \- C8 a! }5 Y
对上述的数据进行以下处理:
. z1 M7 ~8 K0 r. v. C) E( |0 ]% K7 H4 a3 t
df_chg=df['product_list'].str.split("-")
+ b9 g9 E7 R; o1
' T8 [* T& b/ E) g数据处理后,结果截图如下:- j& l- u9 [" H% K& n5 t- F4 p
K" d6 h4 j, _0 @0 b& b3 z6 z( k
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
, C8 t, m2 i5 C+ p# X T) y8 m
y3 V. O/ G* U5 O3 b4 Z1 I1 J2 S2.核心函数及代码
% @4 F& z! e p: L3 C+ R7 V2.1 数据预处理- z x- \3 I3 s* ~
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
y3 } X8 t# O% V! i+ p% X; |$ W e; e0 A
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
5 A% N0 J5 v& Kfrom mlxtend.preprocessing import TransactionEncoder& C$ R5 t7 U8 @. v3 ~' Y
te = TransactionEncoder()
- x- Z" ]8 u. X' a tdf_tf = te.fit_transform(df_chg)
. G8 i3 I4 e9 D#为方便进行查看,生成dataframe
- u) J7 r) O$ D' Q! D, ~data = pd.DataFrame(df_tf,columns=te.columns_)
! m% U+ ?2 I6 ]2 c' R+ G3 |2 L! _# U1' E; y: P) C. D" L! _, |
2
; J& f' ^0 X* ^( A4 u% e! W( f37 }" p" G" E8 y- ^# b
4" ~3 Z0 B3 S C' h# I7 f6 ]
58 {2 H1 Y# y' d" n
6
) I% Z' {# S$ I* t3 o运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 X7 p9 c5 A: s5 o
# j! r; ?) I" m' [
1 x) S6 a" f4 K1 i. m+ B3 [- r0 l
2.2 两个关键函数
+ m, p5 M1 q3 U* \apriori函数
# a, e3 n5 k1 M. f. r( q, F$ {语法:
2 l4 ]! X0 C6 K% `6 m# Z+ I
) H) f3 V8 n2 D6 xapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
, W0 C9 h5 H* Q6 e$ a17 S$ g7 k: n2 J- X$ ^5 y' {+ H% I2 T
参数详解:$ f& s/ E2 G# R% X
, {8 e9 y+ J) g/ ^' |4 mdf: pandas模块中的数据帧,DataFrame形式的数据;
+ J3 w, Z, q3 H# K: I5 [( z- E) Vmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。9 T5 O2 x) t; }% ~$ v: V
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
, d& b' |+ m! G j3 p( Z; @; V$ ~6 }max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。1 |7 j0 P' u- J. ` [# V u V
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
, |# R! Z. q) V0 R' I+ H% alow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
2 [) L) q6 w& Y0 cassociation_rules函数
7 K) S- o& y$ u4 b5 M! ^语法:
4 }% |- J- k ^+ A5 e5 I$ r" L
( K- L5 B2 s2 s4 ?5 P# C9 i, K; Nassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
! F" ~$ d& W+ |; n' @1
1 ^, T% z; I' m# Y/ ^" D& P% j9 ^+ `参数如下:
8 h A, H& U9 w- Y# z
1 ?* e$ I0 R* Pdf: pandas模块中的数据帧,DataFrame形式的数据;
. ~1 b. P3 d/ g( G) Tmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’, S( B' h. ~$ U8 G) | y4 s$ F
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。$ I Z1 p4 y4 O
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
8 w6 N3 {6 Q$ K4 ~' o$ r1 [" m附带metric几种参数的计算方法:. b1 k8 { t7 ?8 l6 M# M" c
" Z2 c% u) \* Y) Jsupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
( W5 l$ E; c; `( m8 ]- o7 q* p. j/ {4 K* D0 \0 j9 c
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]5 d0 J; P: t/ t2 c- T0 Y! D( E
& C6 g, u5 | llift(A->C) = confidence(A->C) / support(C), range: [0, inf]6 d# w, ^" q) {; \- m3 D
$ l4 A/ z4 _! C1 Z7 x
leverage(A->C) = support(A->C) - support(A)*support(C),
3 M# r1 T9 k& k8 jrange: [-1, 1]
7 p+ W+ U2 p+ P. q, ~, ~" n& ?5 g: L* G: W! g
conviction = [1 - support(C)] / [1 - confidence(A->C)],
" J j M- K; K% z* j& m' Crange: [0, inf]
& Q* I* _) e- {
. ~+ D! ~2 E0 @$ A& m3.实际应用案例
, w6 {2 H+ z# T; u2 \! S: L4 Z% Y7 t以下为完整的调用实例:
( J% F. b; H7 d* B5 |* r% `, R, b5 u" @; n
import pandas as pd9 N+ ]+ L+ x% x( b6 ~* M8 s- s
from mlxtend.preprocessing import TransactionEncoder! h& V* \' u" r7 |4 r b9 {
from mlxtend.frequent_patterns import apriori
! t1 Z* t3 v* ffrom mlxtend.frequent_patterns import association_rules3 d g5 _7 w" Z5 F# B
#1.构建测试数据4 \2 v+ i r" `2 t
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})* K: @0 ]+ O) K0 g* B/ n
df_chg=df['product_list'].str.split("-")! R1 l( m3 Y* m1 V+ J' n3 {
#2.数据预处理
1 X) k: }/ _8 t#将传入的数据转换为算法可接受的数据类型(布尔值)% m& l( T5 D2 G/ m8 C) C
te = TransactionEncoder()
- ~; R9 g; b$ s6 s* S+ G' X3 Ydf_tf = te.fit_transform(df_chg) `) u7 h# x1 O$ R: M' G. j
#为方便进行查看,生成dataframe
) |$ Z6 u* w$ i; Adata = pd.DataFrame(df_tf,columns=te.columns_)# Z/ P: Z4 W5 z" s! V7 }* J. z
#3.建模
" m3 ^6 n, ]+ O! f& P; s#利用 Apriori函数,设置最小支持度为0.2, Q3 m* ~* z* ]9 `6 }1 q
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)+ R. Z2 ^6 n, r/ f) X' m
#设置关联规则,设置最小置信度为0.15
+ n5 H4 |* i$ Y. ~8 p n+ A ~temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)" m4 l1 u; k+ S6 ?; [+ ~
#4.剪枝并控制输出
# D9 T. G, i; `8 v#设置最小提升度,并剔除对应的数据
- Z/ D3 c5 e8 d, O) N; l" Omin_lift=1
# k( T T: N7 c& c. }rules = temp.drop(temp[temp['lift']<min_lift].index): T) X, ] v$ e! | b% \; Z1 e
#筛选需要输出的列
' j+ y2 T* }2 K! b% H* w- w' ` cresult = rules[['antecedents','consequents','support','confidence','lift']]
) F1 D5 F) T( G3 y* V$ \( M' J# e+ wresult=result.sort_values(['confidence','lift','support'],ascending=False)
9 ~' x! V0 W/ F8 P0 }9 ?( wresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
* X& ]+ m6 Y. y
. e/ V9 J7 Z0 i3 ]- Y1
3 U' I$ z, B" U I: ~2
}/ }0 o& `7 b/ ~! K/ I3
& p9 f# `# I- t+ R% G: k2 e5 T5 K4 T6 Z4
" F# n3 h" k) ?) z- u( V5
" K8 `/ x: P8 |) ~: ^6
. [! H( w2 R, U3 O7
3 D; }" T+ [3 ?0 N/ s; | @86 S0 ~3 j6 I" y
9" t1 u. o' L8 ^- S# c- i- A) S
10% b6 u9 r0 ]% p/ ^
11
( T4 T+ U& n9 D" Q- `7 O# ]! K9 R123 M. R& Q- F) I$ G9 f$ _* { y R
13
6 z8 `3 N+ \" ]" w4 q: `3 \14
. W; a& ]! i! Y2 V& h! Z' Q15
2 M; Y6 ^$ [ L- ^16+ q' P) J e6 i" @
177 t2 n* k1 A3 W5 E/ o9 e: k- ?
18$ J3 V0 f* S" S% i6 c: z
19. v8 _1 j" y5 [2 S9 x
205 @, g" e2 x" G5 h1 _
21
8 T5 J5 D1 _. o+ K# `# ~22) r; g5 c6 ]9 {( M- S5 b
23
! i. d( Y0 z( B: M8 R+ N24( V g' A0 E' r3 U/ Y6 \
251 h4 K6 B8 N9 S9 O
26
- Q+ G1 h- J$ X* K8 y- K! |输出结果见下图:/ y, `7 U$ [9 `1 v( Q. p# d; [
- F6 y9 {; n% y+ K————————————————
/ u/ ?, |( c/ N% _- b版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: q8 v0 Z' P3 s8 R0 Y" q
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759 f6 G& Q: L$ O) |; q$ e
" f" Y" j5 H( e9 P( u& P1 r3 i! ^
* s2 d+ P% h2 `( F
|
zan
|