- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563256 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174200
- 相册
- 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算法篇
, T4 m3 s% a/ q+ V# P* }
* E5 {( {, k& i0 f- v, }& Y; |在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。) [6 F, D, _' f& ^, X0 ^
' p" f& z5 x7 g) s! [1.准备工作
7 g3 Q( [, T5 @9 J如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:2 r% X9 ~2 Y2 q# o: V: R( D1 `
, m1 a0 D5 S% [pip install mlxtend9 @4 Y0 Z% }# B( p* }: R$ ]
1) F2 {9 [! c- U- q
为方便进行过程的演示,在此构建测试数据:
+ }) {3 g5 B# L. T2 v
' a. E0 i( W6 h6 @: wimport pandas as pd
. }8 \! Z, c- @3 \! R7 edf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
3 o* b& T4 {6 o- I' B6 B' q8 O1: O3 F# r, B- y# Y: F( S
2
/ J4 [ H1 X, }$ X) Z测试数据截图如下:! d+ {# V$ ~/ ]/ c2 K& `8 ]
5 R# O! u& U- e! [
. a1 U! v8 [4 e% `" x+ y对上述的数据进行以下处理:
1 A( p/ ]2 g6 H% o4 g3 B/ l5 `. x# c! g- r2 a5 b
df_chg=df['product_list'].str.split("-")
! _' S& f! d% y, a; |, W8 v+ ^1; [8 C" Z! Y' i0 R
数据处理后,结果截图如下:
9 Q+ p* U4 ~6 l4 Z# r8 ]$ E) t0 h
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
% u' L- Z4 V2 F9 w. [8 b4 k+ R4 }8 x+ ^1 D) q; v2 j
2.核心函数及代码4 g) A$ P! `5 y- t) q
2.1 数据预处理
" N3 p4 u6 c& i' ~, p5 v对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
6 u. l t2 G; b% i$ _* o/ W3 x$ J$ v
+ V4 }3 Y3 F8 F$ s#1.将传入的数据转换为算法可接受的数据类型(布尔值)
3 E- F& ?' F! y, sfrom mlxtend.preprocessing import TransactionEncoder- K2 z3 B) B, N
te = TransactionEncoder(): B* `& F8 i* M5 f% J& Z" A
df_tf = te.fit_transform(df_chg)% U( A0 M" h, U3 a( C$ I0 `
#为方便进行查看,生成dataframe9 p6 [. Z3 G0 @( B( W% A, h' z2 G
data = pd.DataFrame(df_tf,columns=te.columns_)
& \ K4 u2 f1 w6 p' d1
_( r9 X* ^! @, a24 e& r: S# h6 J r; t6 N) O) U
3
; i* G" o, M2 e2 d4' K$ _6 s t2 G% W( Y- ]
55 I Q& s8 \, T% X- Y
6& a+ ~+ P( |; z' o
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:' p) J6 _8 J9 t. C1 u
~( `0 t) `% V: ]6 E+ n, `( n, A& q! I! V4 H
2.2 两个关键函数4 V' W v( Q" [" H
apriori函数7 [3 C6 J/ Z" y$ ~- b
语法:4 F+ `6 r2 q2 t) h: y1 S4 C' S2 h
( \& g f# l8 {8 B uapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
6 W0 i" i! i$ `1 y, @ l) x1
! S; h% r3 v; B. e参数详解:- l6 A0 O0 u8 m2 W) o2 A
/ C+ [& P* L5 D1 v* J) bdf: pandas模块中的数据帧,DataFrame形式的数据;
5 R% g, y. L' F2 H$ b% I/ }min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。; _7 J8 B7 n2 P: r/ ]( P- E" Y
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。7 a+ J$ P4 j8 ?8 ?+ w
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
/ G" U, R1 J" @3 }. yverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。
$ ?! G/ s d) d9 A+ K4 S% xlow_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。4 u+ O9 |1 ~- B5 i& n
association_rules函数$ m) i$ `% J' b1 Y+ z/ i
语法:; [% H' z- i; \8 y: t2 K
* K, H, B# ~& B8 L- [; l6 G% Yassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)/ e) D% ?; `7 B& L4 R" [5 W
15 ?/ Y* m; d' @; |9 N
参数如下:
( N% ~( v' o, I0 g# @: w/ M: \6 P$ j5 y; ]8 k, k/ S4 r
df: pandas模块中的数据帧,DataFrame形式的数据;
0 T! a. w- j1 p5 `6 L! x# T) I5 H1 Qmetric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’: z3 ?4 s2 O. ~' k2 F# S
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
- e/ h, J6 w9 ~1 }' r; G6 }/ Wsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。8 l! I+ V; ]# ^$ y6 T5 F2 A
附带metric几种参数的计算方法:4 i' f+ s9 a$ D; Y' p j- ?
5 P1 m) ]! Q3 s% F- t' F
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
5 ~7 i$ T5 q7 q: M7 O+ J0 {# [. w7 d0 E% Q6 b1 {6 r) z4 H
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]6 O4 S/ V* ^0 t& J+ x
7 g/ P3 \6 H4 j, ?- U9 Glift(A->C) = confidence(A->C) / support(C), range: [0, inf]
: }( M3 [! T- B u3 i4 @, N) b# K; x, s0 A c
leverage(A->C) = support(A->C) - support(A)*support(C),
: Y2 |7 K6 B; ^% prange: [-1, 1]8 q' W% R1 A3 \
# w5 x" m* e. z* k, cconviction = [1 - support(C)] / [1 - confidence(A->C)],
7 E2 G7 @( ^/ }* Drange: [0, inf]
7 v. K; {- t4 S, B3 B5 C5 h3 G: A0 |4 v% U5 k+ t: [
3.实际应用案例
3 d' X- D J' z- f, Q! x, K以下为完整的调用实例:2 V6 M ?* ~5 N& ]9 X
% H& m5 [* t, ?
import pandas as pd
- ~. J6 g, c* [0 k o8 B! o& ~from mlxtend.preprocessing import TransactionEncoder! q9 f5 I5 j1 i0 v9 `% z
from mlxtend.frequent_patterns import apriori7 y: ~0 z) G* {; b% `
from mlxtend.frequent_patterns import association_rules# f: X6 w* j) G
#1.构建测试数据
: w0 d, }( z5 ^+ m: adf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})% P) _ y% J+ a$ G
df_chg=df['product_list'].str.split("-")
2 S! p# R0 U& g' [+ [$ w; @2 \; k#2.数据预处理
% P9 W8 }9 l1 J% j#将传入的数据转换为算法可接受的数据类型(布尔值)
0 O% P: Y3 p" i9 Bte = TransactionEncoder()( E' S+ q2 i4 M6 C' x
df_tf = te.fit_transform(df_chg)% \6 J7 U4 Q/ }) R! [% V: E4 M
#为方便进行查看,生成dataframe/ U$ ]( t0 A9 ?4 J% B
data = pd.DataFrame(df_tf,columns=te.columns_)1 ]# @$ T& c8 f
#3.建模
, O- h# ]9 x9 K#利用 Apriori函数,设置最小支持度为0.2- @3 G b$ D& P$ c
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)) q0 B/ v- c. F6 `4 O* i% z
#设置关联规则,设置最小置信度为0.15. [) B; t# x! ^4 G# M/ r, t: l
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)/ |3 o; A, y: }6 n' w+ P- V
#4.剪枝并控制输出$ q6 n& @8 U+ `2 i+ b& c0 R! z
#设置最小提升度,并剔除对应的数据
; q' W, l9 N; b4 t# Umin_lift=1" `, K2 I9 M( e3 s
rules = temp.drop(temp[temp['lift']<min_lift].index)6 i- ]9 c7 }7 I( p3 q, i
#筛选需要输出的列
1 d+ h$ J9 p1 Eresult = rules[['antecedents','consequents','support','confidence','lift']]
4 c1 g2 s3 R: N/ g9 Yresult=result.sort_values(['confidence','lift','support'],ascending=False)
. U) ?, n! T: |) {; E- O4 D" `result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')5 z, A( T" F& L' q5 z5 |, `1 d
& Z( X6 J5 J M( o) j
1% U, o a% u0 Y0 ]
2' X+ N+ Q! A1 k, j9 X2 z# s
3) o4 m0 _6 ^: y, K
49 \& F$ B% `, H2 _0 p( x
5
9 K( ^$ L5 M/ K+ L$ F, c6
0 _5 k* {. n! W" X! Z! B4 F7+ m- f, x& D. t& z8 m1 o! o
81 C5 x) e) {1 i; X
9
2 i- n0 J0 \ Q6 B$ E10
/ r. w4 |$ A) [/ {6 G7 G. E' G111 B) m; U) l" \) q. t
12
Z2 h$ f9 g+ {" s; K13
9 O8 G/ e U# V- ?3 f14
0 a& I9 o' r" t: L) Z15# @7 F- a( E( |7 }: p
163 S0 }" V# T/ W6 t( t
17# ]+ R7 J* \' R8 |* M/ G
187 ]# s& [' ~2 Z; i, ^% q K9 F! k& y: [
19- }! t3 W6 g6 D" s3 p$ @% b
20
& v, _: M6 T7 t$ \5 X21
4 Y0 g' E8 a/ l; }; c# d22
/ w- [0 c/ ^8 Z' }1 X- N" y( _23+ X9 u/ W( p1 y P
24
% i/ U; {9 i8 T) Q25. u1 e0 M* Y: B/ K& g
26
' f7 |4 n3 s" c( B* _# z6 u输出结果见下图:
+ A$ b+ W3 l* C( a& i# U5 X7 }* V9 O1 T/ @
————————————————
- y5 p. ~; O2 U( E4 S2 M6 Q7 O9 Y版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ F( T2 k/ D# D! X/ b' g
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
6 t: M; X! j f# U9 L( d9 ]# E6 [
8 t& }* G- P" [$ ~) \- t
3 x) `7 z+ Z9 U) A, v |
zan
|