- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 556878 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172436
- 相册
- 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算法篇
5 ~2 c8 n2 b4 A' G4 q! m! U1 d. J" ~0 @1 _* l3 f
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
) \4 A3 p" ?" R0 X$ `& t
( K3 N7 X* }6 N1.准备工作; ]0 k5 O' q; Q
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:# z/ o/ p7 x& s+ o# L2 C3 b
- Z- ^; {) ?; T! ]; Rpip install mlxtend
* Y$ B4 k/ I1 r$ ~4 i% v; e1& U$ P0 X; I4 k8 j3 z% u
为方便进行过程的演示,在此构建测试数据:
' [/ U5 ]7 I& j2 J/ U& _$ Z/ x/ q S
import pandas as pd
2 t9 o: ?7 `$ Y3 G5 z# bdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
5 i: O8 Y: t$ n- ]4 ~% V1
6 w' @$ D( e2 `5 Z9 a+ `' e3 W2
& ?8 ?" h W% U* j8 H" t/ i测试数据截图如下:2 ^- C8 b' a' m; U
" v3 ?4 \ ~. N3 r
% t* }5 I3 t6 {0 O3 Z; l4 V. T
对上述的数据进行以下处理:
, _0 \8 p- k- W7 @
. F6 S8 ]0 w$ k* ^df_chg=df['product_list'].str.split("-")
& [; {$ z: ]: ~0 P1; y& @. P/ K) m
数据处理后,结果截图如下:
( j7 @0 X2 Q/ R* _7 K7 k
9 w0 M- N8 ~3 Q( B截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。' B8 c, o% v9 {" o2 O
) V1 {' v+ B2 h) R& f- j2.核心函数及代码
, }, y+ n( s4 k6 a7 e2.1 数据预处理
2 E t: A( } i& @2 i+ S1 L对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:' [' q4 d( o+ C2 u& D7 z9 c+ G
# V& T$ k0 v6 o) b5 n& c% |
#1.将传入的数据转换为算法可接受的数据类型(布尔值)
e% J) f% S$ ~) M5 wfrom mlxtend.preprocessing import TransactionEncoder/ D- X: b; ^6 {
te = TransactionEncoder()
$ e: q: k- Q `) H; T! Vdf_tf = te.fit_transform(df_chg). [8 k H2 C7 l' o
#为方便进行查看,生成dataframe$ y J. _# O+ Q0 n
data = pd.DataFrame(df_tf,columns=te.columns_)" W4 z5 N- O1 Z6 k
1
3 q; p9 g+ S% l: I! l3 e2 t26 o( H4 D$ N u+ z/ [' `& T
3
" u& i* r' V# r4
' b! _4 } s! T& t6 h* J5
7 {& R( A1 T2 U, X8 d6
7 I/ ~6 k3 G+ n% F, Z1 t3 P运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
8 E" V0 M; }7 T; d' ]( K+ e8 H- _3 u+ S
, A7 M6 \6 |" _ I, e( }; B7 V2.2 两个关键函数* B$ M5 |$ x( A+ j1 t ^0 p% D
apriori函数
]& j8 O# S Y3 O8 w* ~. d语法:9 M8 P- ?9 P1 z0 W i7 Q& O
: C- D9 b/ b( D. R) z
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)+ z; O9 f9 y6 j1 k4 {5 D
1
3 [3 a- r8 k" q7 K" L% }0 T参数详解:
2 i5 v. D o8 S$ F% p1 p; Q6 G. n% r9 A9 U% n
df: pandas模块中的数据帧,DataFrame形式的数据;
q5 w5 f4 c1 @! f6 m2 U6 dmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。7 h$ J2 L3 N) l+ e% }+ f
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。% V( x9 b1 [4 y* z2 x. R: r
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
) B) r/ M8 _" A+ _+ {& mverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。1 ^' L" B2 v4 b5 S! i
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。& c* {/ t7 S+ K! o
association_rules函数# G. c3 {/ _3 M2 _
语法:* i" g4 }, m# a# b+ {" Y, s
! X5 v+ |7 D6 i: k9 `; nassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)
6 g/ W' o! U* d1 n6 P1
. X/ i2 I( N2 J# c6 [参数如下:) K9 p' I. B7 V9 k9 X3 J. H" U( C( E1 Z
p: ^0 `' f3 W) R( W4 edf: pandas模块中的数据帧,DataFrame形式的数据;- h4 F. i U9 v$ [$ X% Y" T( D
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’! C' `! a" p* @) Y4 f
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
( a* X' k( u& W% Vsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
# p0 \ Y* E2 A( F2 D0 l附带metric几种参数的计算方法:6 {8 D) n5 K6 V6 r' n
8 T8 P( [- z+ t8 t
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]; p# p7 v4 P: z$ }1 G8 `% `
& F! d7 w2 f( T( _& x; tconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
( i' [) a) R" L o3 }5 [) t! a
0 l6 u4 O- O j8 W) T* blift(A->C) = confidence(A->C) / support(C), range: [0, inf]: L0 U" \+ f0 T; ^- ~. n1 {. D( u
3 n# x" o/ i% w4 k0 ?! `4 wleverage(A->C) = support(A->C) - support(A)*support(C),
0 U! ?' T, O% |% erange: [-1, 1]
" Y4 I" ^+ q* X8 @6 f W0 U/ T1 |$ D, _& b* h7 Y: h- N
conviction = [1 - support(C)] / [1 - confidence(A->C)],
+ I; y: l9 i6 A9 ^: vrange: [0, inf]
. n8 m' H- |% ]2 v" Q, ^2 A h, D! {# R- ^ G, t
3.实际应用案例
$ Q9 ]# T" [, |) ~- g( ~以下为完整的调用实例:; A% n1 ~" I8 C0 Y
) M) m, [6 {! h- o; Simport pandas as pd
0 [" x$ ?* I2 Efrom mlxtend.preprocessing import TransactionEncoder( c! E/ C* T! N9 v8 A& e
from mlxtend.frequent_patterns import apriori' P) b. @2 p# w# D
from mlxtend.frequent_patterns import association_rules
$ K, |4 D- K2 N5 m8 h- ~9 ]#1.构建测试数据
& }% q+ P& o+ n7 D; g9 k! Q& zdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
. c/ H* s( t5 s5 z% {' z! P5 s3 Bdf_chg=df['product_list'].str.split("-")
2 b+ S z* V" ^6 H#2.数据预处理+ |, u4 S, a2 q8 U$ y
#将传入的数据转换为算法可接受的数据类型(布尔值)
K" y& l1 V1 ?$ f1 Pte = TransactionEncoder()
( m4 O$ S1 z Q: ]df_tf = te.fit_transform(df_chg)
5 T2 y' e6 H& j: P' e& l. [#为方便进行查看,生成dataframe/ D+ w* w+ V8 R
data = pd.DataFrame(df_tf,columns=te.columns_)
& Z9 L8 n, V& T* d G& n$ ?#3.建模
z8 q( r0 A8 z) o+ z( ?#利用 Apriori函数,设置最小支持度为0.2
/ j# S/ T5 d% `1 |# ^4 Zfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
* Y3 W6 q. N3 n7 x3 r#设置关联规则,设置最小置信度为0.15
' Q- b" P+ v) k" [temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)
2 e0 g& p9 T+ |$ B' o#4.剪枝并控制输出) Q- Y, l1 s& o2 y" R6 w$ e
#设置最小提升度,并剔除对应的数据% L& I/ x) N# ?
min_lift=1: ]# p( L: ^$ M0 y
rules = temp.drop(temp[temp['lift']<min_lift].index)3 a" @' E6 ^- c5 D2 ~
#筛选需要输出的列+ `, u7 E8 ?$ C# ~2 x
result = rules[['antecedents','consequents','support','confidence','lift']]
2 y) g) C/ F, E0 O7 H( _7 V; F' aresult=result.sort_values(['confidence','lift','support'],ascending=False)- l, w( [3 Z t
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
5 l" F5 c8 N' |/ B% j7 K3 S' @
; X, Y- p+ k; \9 P1 M( ^1
0 e7 L: i! r+ B+ l& b4 m2; q( r( M U; B( }) N1 S: {2 }6 Z+ B
3
, q0 J0 B: v( m( f v+ y W4
# f+ Z: C$ {4 P9 n2 i5
6 b8 W: Y" y$ ?2 ~ R8 i6
* f) G0 ?/ S9 K I0 K& O, D72 o" X5 U& u n% E$ l
8
- {4 G7 _( M+ n2 ~% A8 O$ }+ p9
) G5 h8 L8 D3 X3 ~( _10
, u! U2 n u4 h7 H. {& c7 r11
$ n. Q2 a) G4 E0 |12
4 o, x4 c3 j+ `2 T) Z134 I+ }# h) t# l, N6 B* ^
14+ b2 ~* T+ |8 i
15
+ H* m' {$ a, f3 Y16
+ c9 y, K J) o% [& F' ]& F- k171 \4 h7 h7 j1 L4 u' U
186 ?# e7 s- g3 [7 u
19$ }' c) f- L: h& ~4 [, m
20
+ b J' X4 }+ q. H, c' f. Q21
0 O1 b3 d3 F! o5 u22& ^# A+ o+ M; T& a @
231 s& @2 T/ t( C" y( k
240 W2 ]0 n$ ?9 L- ^' E' Y
25
* \7 E' \/ v ?% y26( {7 N# U- q X5 \+ _
输出结果见下图:
6 c2 N& z' M% f* B
/ e8 m4 u) j: e( c! f3 j5 q" o————————————————% A: X* T( i( _- B' Y
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。0 L2 W1 f" ?# h8 T; g3 H' {
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759# v8 t# ~$ r1 [/ Z, G' M v: b
; T7 u0 b1 R! q+ n1 Y, H3 K- U
# n: e7 L% R0 T |
zan
|