- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 81
- 收听数
- 1
- 能力
- 120 分
- 体力
- 552240 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 171045
- 相册
- 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算法篇
3 r5 ?+ Q9 g( Y! }" A9 w) Z
- Y4 Y8 c- E7 _! j在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
' e1 V! J7 @: |" u0 u
+ \+ |; L7 j& D6 q& F1 P0 V1.准备工作' ]0 p6 V* X0 b0 U4 u4 l+ I
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:
7 N; R# w( h# F5 u8 H4 d6 |" P. z/ x& l0 l
pip install mlxtend
( x& W( |0 a& i5 N& Z' S8 O' n! f1
. R' d# C7 `! [6 t4 ]为方便进行过程的演示,在此构建测试数据:
5 q3 K4 f0 B0 u- o. [- I. C! u! ]8 q5 o
import pandas as pd' q- s3 C/ B, f; p! q1 X! u- i
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
4 J" Q: I- N" i! K' ^5 _( H: s' H1
: W' N) _2 _, H, B) j2
+ A c4 Z ^, n# E3 x+ {& T8 }测试数据截图如下:, P" W. o3 Z" {3 \* }9 b
9 t. J8 ?' o- s, I1 \
; _: M3 F- [* i
对上述的数据进行以下处理:
- q' P% @3 R( P' Z) v
7 d# q& L7 I8 y6 p; Z1 Qdf_chg=df['product_list'].str.split("-")
6 |* o( D8 O: H; q5 k- {1
) f6 r5 k1 L( [+ N$ w数据处理后,结果截图如下:9 Y3 m% W, P# H: @, C6 r6 s
- K$ @$ v9 P, }7 [* `( V7 u$ F截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。) i3 i2 y% t4 g8 Y
) |, h) v; Q3 k. R3 N5 K2.核心函数及代码
; @8 z1 D; {; O6 J- N! c- a! T2.1 数据预处理
% x6 E! G: K7 }3 K对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:# ~6 r5 }7 e1 p" }
! a' n! k0 N4 u1 R/ F: N- `
#1.将传入的数据转换为算法可接受的数据类型(布尔值)% x) F/ u, i7 j! l0 k
from mlxtend.preprocessing import TransactionEncoder, \6 h! Z2 b) ?& d" n) l/ a
te = TransactionEncoder()
7 N# X' G: g4 @: \1 [8 edf_tf = te.fit_transform(df_chg)+ L9 Z T1 \6 U
#为方便进行查看,生成dataframe
0 R: A6 T `% h* cdata = pd.DataFrame(df_tf,columns=te.columns_)
. H2 ?1 J y5 Q1 c2 c4 h1
# y: P- f3 x8 P# ?1 j2. I" Y0 {; X& H5 t0 B- G
33 |2 K- m, r0 p) `% \
4
! \9 M2 L1 H# y* e$ m l* n; A5
* j" l- ]& T1 ^/ W7 j* J7 O6+ a0 G u/ T& N U7 f8 }
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
1 |) y; h. i( n: d+ v V5 I% e9 a: I. b) {. e2 b6 r" u& n
( j; m% [5 l0 Z- Z4 _2 a; N7 C2.2 两个关键函数
0 @! g! I7 m7 ^9 F Sapriori函数4 z C" T) h9 t: w
语法:
7 [. P- q4 }( p9 O; g1 J" Q9 @0 v; p; l+ I3 ~; v
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
% t+ Q% d% C3 u8 e1/ T- ?9 K5 Q) E6 _' ?; f
参数详解: o% s$ R; |, ^; V* W# B' P- O+ R
) Q1 F' U+ {7 h3 Ndf: pandas模块中的数据帧,DataFrame形式的数据;
. ]1 r- B5 i* E" Q; x0 u$ `min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。, N% _$ T/ I5 j; _- m3 R4 O
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
. q3 _4 \6 |+ f0 Y$ A0 xmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。/ b& I& z. T% B6 Q
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。# l3 Q0 A: P: w2 u0 E
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。5 f t- x/ s& x2 ^! j9 t* Y: G
association_rules函数, ]* `7 g# g! @0 X1 \% U U7 Z3 x
语法:
, o. _9 J' j9 E- L
/ x, S7 k6 K5 p# `association_rules(df, metric='confidence', min_threshold=0.8, support_only=False)5 y! l# |# U0 b4 [1 k- l2 h* v
1- \3 d( M1 i( x& }/ g0 A' p
参数如下:
: {( D/ }& E. G( J- Z
6 B/ B9 \* @3 {df: pandas模块中的数据帧,DataFrame形式的数据;
! S# p5 m. x4 y0 J3 l" @5 j& Vmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
% M& F' H& e( {min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。- f+ Y/ d$ q5 L/ X$ E# T
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
3 C( r3 x K# J附带metric几种参数的计算方法:/ v f8 M6 a) w2 d
7 v @( [, ?; ^+ Y, csupport(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
' E& v9 A L3 f' N) \! T
% _- I: G1 n* x( W& p$ Sconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
) |* e, A6 c2 l4 i
" D/ K6 R: o! d1 dlift(A->C) = confidence(A->C) / support(C), range: [0, inf]. h5 p) `: F4 g' P5 q5 H U
" i. J" ^/ V. a; n, n- qleverage(A->C) = support(A->C) - support(A)*support(C),% C! S$ c; q0 V
range: [-1, 1]
% J6 H& m p# Z8 t2 R8 _
! m' r. O" x$ B8 b7 l4 k+ oconviction = [1 - support(C)] / [1 - confidence(A->C)],
# L$ ~& F8 y0 w4 ~8 N. n' N. xrange: [0, inf]
# @7 X$ e' K1 H' R
. g. l/ _. j4 B" ?0 M/ B0 Z" R3.实际应用案例* E. U/ M8 @* |4 B
以下为完整的调用实例:
6 M: k/ B j! I
3 ]# [9 C; \. z4 f& Cimport pandas as pd# D' u, Q. u# Z* ?9 n: c
from mlxtend.preprocessing import TransactionEncoder' f. I$ [, J/ U0 m7 X; z3 P
from mlxtend.frequent_patterns import apriori
4 @- P6 q2 U5 C+ e( e7 C. l# Zfrom mlxtend.frequent_patterns import association_rules, n. U- W' F; ?' {8 X/ p
#1.构建测试数据2 ^7 }- B" R o$ V8 P
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})0 Q f- q( l( ^, b% A2 y; q+ d/ `
df_chg=df['product_list'].str.split("-")
) ~. }7 ?% W' T; s; X2 p#2.数据预处理
1 p( t0 D- y0 Y. b1 T" G! U#将传入的数据转换为算法可接受的数据类型(布尔值)
0 K& P. E/ s+ n& Z9 ]1 }3 }te = TransactionEncoder()
8 n- T/ o* A+ i. b5 s/ Adf_tf = te.fit_transform(df_chg)
/ g4 Z* Z$ y4 K1 S- v#为方便进行查看,生成dataframe
* S0 p& l+ |9 ^* N: |% z9 rdata = pd.DataFrame(df_tf,columns=te.columns_)) G8 Y5 J9 L; {1 A" w+ F! x
#3.建模
E/ @) E- G) W5 L* F#利用 Apriori函数,设置最小支持度为0.25 G" b& j. i7 P1 ~; E; s3 h8 @
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)7 i" V5 k) {0 l d8 U
#设置关联规则,设置最小置信度为0.15
) F* Y6 A, K" h6 f+ Ttemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
* Y% D, x' ]+ J1 t, Y#4.剪枝并控制输出
3 n6 B3 K r1 ?& v0 t, N2 Q#设置最小提升度,并剔除对应的数据( d* w- l3 ^- J) A) b( `
min_lift=17 \% a9 A$ ?' j+ Y3 w( ?
rules = temp.drop(temp[temp['lift']<min_lift].index)% N3 |& _- J& [" ]7 l7 w/ G$ ]
#筛选需要输出的列
- j* Z$ w' P$ rresult = rules[['antecedents','consequents','support','confidence','lift']]
1 I/ n3 _9 L! o3 A* A6 ^; l, _: aresult=result.sort_values(['confidence','lift','support'],ascending=False)
: w$ P w" A! o1 E$ t% Eresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')0 V# A: i- Y# \4 U/ H* c% F8 j
, d$ a- p7 a: A' X1- N- j7 u( |7 Q+ }( a
2
6 j; ]1 u$ C. X2 ^8 c: k7 R5 J3( ]. x' ?) ]( p6 q0 p
4
# Z3 U# ?' l, N; h. b' k5 F5$ I2 c4 J4 Z2 \; t
6
4 m0 Q4 i( Z1 q- Y; T; H2 ~7
5 e+ y* ]2 p9 T, w8
6 e) B) e2 @' ~0 M4 N$ n9
. g Q/ z8 ^8 z0 G, x5 b10
$ g$ _4 c: L& G# l3 o11, i2 ]$ }6 P) @3 U* C7 r
12
" C/ d, G2 A p. r" o2 k G- X13
" T! n! s! k6 y9 N1 R* l3 l, P4 j14
! X6 I4 E' z, O" i1 D% D15. u4 P0 f7 w+ ~) Q( S; C9 @7 \+ [
16; }* C' p( f: n# M) y1 S4 E
172 F! R! Y; p8 }3 S7 _; M$ w
185 j$ G8 J' \2 r+ H7 C0 z* z4 v
19) ~; ^$ L# g. @6 p+ u
20
, |/ H8 Y1 k2 e21
9 {# W l' k5 Y5 Y, K22
3 B: L2 ~0 \+ f. [, M8 d( n23
. m1 Z: {+ @- p6 g24
' ~- q! a- J% |( ?( _25- l+ H# k( I6 c5 G- D: T( y
265 T# U& ?$ B% ]) R* r/ H3 e
输出结果见下图:! z8 O- A; O9 z. b" C! |
7 b+ M- k- y; t2 g) E+ B
————————————————
5 b2 ?. V7 F2 v D2 z. Y$ Q版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 ~$ i. K: ^5 O: O- l k" c: U原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
2 ?& T7 S4 {! K4 n) U3 k/ t! P. n4 F& W+ `( K d& w
4 }8 i# q" V4 y3 I1 q
|
zan
|