- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558023 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172780
- 相册
- 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算法篇
) K5 {" I% z) l% j* u
1 @) z) f6 c# D4 I% C在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。' J7 f8 _: u4 F
- Z3 G% I; J3 ~; M. I1 y1 f: I
1.准备工作3 l3 u7 @+ y+ ?; Z* |3 A* d4 Q9 L
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:( W0 K, Z& }' ]! |% p" i0 K# v
& v/ Y4 X' u+ Bpip install mlxtend
! b0 z9 b9 I( q2 l8 Z D1/ [+ L; `0 J Z
为方便进行过程的演示,在此构建测试数据:
% H& f( J9 q7 k/ G! K7 p# K$ d8 |% L, P# ]6 ?) T: T
import pandas as pd
9 O5 j# D5 |& e4 G" jdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']}): B5 X: }7 E8 _% m
1
5 x" q/ I+ v. l; Q8 N2& {& w4 {% q _: [& E& F2 A
测试数据截图如下:6 M- e: r$ ?" d5 q+ t- F
7 P6 g9 n1 w$ D" B( r3 I
. M$ e; ?7 [ ]对上述的数据进行以下处理:$ S* G- r3 \: U: d
0 F P ?' S% C: e/ A1 \, i' k( Ldf_chg=df['product_list'].str.split("-")
7 F( C' J3 y) X4 K1
% q I8 U' t$ {. ?数据处理后,结果截图如下:
, ~) o+ F5 I' l' @6 }" k. r8 g% p- k. X
截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。# ^6 e$ b4 |8 a( j, l3 A! k
$ B* h- Y3 A% W9 n( F* R+ ]) v+ p
2.核心函数及代码
* f( n3 Z. e# ?( C+ k4 W: `9 c2.1 数据预处理/ R) j+ g, B- }# \! H
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
% M4 m5 c6 z, l8 U( @+ A/ F1 r3 f0 N; X3 S& o2 ^0 m
#1.将传入的数据转换为算法可接受的数据类型(布尔值)% h3 m0 Q- u6 ^/ c$ Z# l! }2 f
from mlxtend.preprocessing import TransactionEncoder9 h8 x8 J m3 ?
te = TransactionEncoder()
* @# B% F+ n3 o2 {, zdf_tf = te.fit_transform(df_chg)! c* X+ y! m9 w E( F1 Y( \
#为方便进行查看,生成dataframe
7 v3 l" Z- L: y3 ]( r; {: n3 `data = pd.DataFrame(df_tf,columns=te.columns_)
% T, l2 o! G" O5 ?1 t; _1
4 q/ U9 C+ ^% P" e5 ]28 A7 g9 C: s1 n5 _) Y& ?: l
3
% f$ v0 ?* Q7 c4$ A, ~& l0 x6 ]
5
3 I( ^( _$ m6 G6 P+ }4 X3 i4 \& r: W& |3 L
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:9 ?0 E$ z5 {2 l, O7 C+ i
. ^' ^. ?; U6 f" t# s- `
* c7 u. F$ V2 b7 f" ~- h' w: p
2.2 两个关键函数1 y7 M( k8 O9 l4 \4 A# ^- ~6 B
apriori函数4 r7 `2 Q" h1 p& a3 R4 G
语法:4 B( \6 n2 s0 ~, G7 O; X7 U" R4 X
/ N+ a4 ?, e* v9 [ S
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
3 g5 T, h; c- p& ~1
5 }- Z$ E9 O. S9 d/ a参数详解:
( {! {+ z' D1 D1 G1 {& O0 \8 O4 T E, f
df: pandas模块中的数据帧,DataFrame形式的数据;
: n5 c1 j5 ] Wmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。$ N) n' {- C* o/ \
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。
$ Q9 U6 T- [0 N7 e/ _# dmax_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。1 w3 z3 @ x& N, b
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。( Q, t( k1 |! `: p6 b
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。
6 ^: V) I3 l' H L/ u, s: w- o7 l( rassociation_rules函数
" e* ~- Q( Y* y! ]' _- O语法:: i2 ^* w) x9 @
# V; _3 v8 _" o' nassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)7 B/ C7 v3 h( i
1
" H$ _0 d# x( z- {参数如下:% @/ j U5 K4 L7 a# [6 r. D1 a
( p7 h% v6 y6 S5 }df: pandas模块中的数据帧,DataFrame形式的数据;8 T M4 n- j- _! l
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
) K4 Z8 u3 H p0 c9 t6 Mmin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。- \# G2 S5 a% q- r3 d
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。/ E: w% @) R# y6 a
附带metric几种参数的计算方法:
8 ?. X5 r8 I4 M6 |1 r T, Z3 ]4 Y
: f+ q7 Z% E& ^support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]8 S* J8 u8 J# r5 Y. M* O) m
. G. K6 Y. j+ z, \5 u* O' B
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
* p( y" M3 L! u L! R2 p! Z$ [( q1 c) w" `) P$ c$ J0 ?7 W9 J/ M( \
lift(A->C) = confidence(A->C) / support(C), range: [0, inf]( g) x' F5 v4 j3 y4 R
) T3 A; u- T' j% S- M6 s
leverage(A->C) = support(A->C) - support(A)*support(C),
# i/ b" |$ n7 jrange: [-1, 1]
, b, D6 @$ p( d8 I7 I' W& y8 j+ W- i% k, d- h
conviction = [1 - support(C)] / [1 - confidence(A->C)],
" R! E* z) c- O% B! k# S7 t1 r) z' k6 Lrange: [0, inf]2 B# y3 `5 I4 I! ~9 o& @
+ Q0 h5 ~/ ~! g# x" b3.实际应用案例$ C. O2 R2 e6 Z" J' g8 J4 x s
以下为完整的调用实例:
6 g f' T4 ~; x: k7 S! Q2 w
' S+ ]& e, g% T: H5 \+ Y' Himport pandas as pd$ q/ i6 h+ H0 {7 \1 U4 f
from mlxtend.preprocessing import TransactionEncoder
" J H" i0 q b4 ~5 {from mlxtend.frequent_patterns import apriori/ V( u9 @, I# G( P. M/ E
from mlxtend.frequent_patterns import association_rules
9 M$ N$ Z- E# @#1.构建测试数据7 L+ }% |7 y# d+ Q/ I& Y n, U( }
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
# d0 _' u2 L# O5 L) _' n8 {0 ]df_chg=df['product_list'].str.split("-")7 S0 q/ i! i. g9 l1 H+ F* E& K
#2.数据预处理
( r! B5 c+ s- j, i& N- `5 G#将传入的数据转换为算法可接受的数据类型(布尔值)
/ X3 J- ?" P" c" h6 q7 pte = TransactionEncoder()
[5 `6 c( g( i( Z Bdf_tf = te.fit_transform(df_chg)# B$ o8 I* a1 g/ `/ V
#为方便进行查看,生成dataframe9 w. [8 `! M, Y1 [8 F
data = pd.DataFrame(df_tf,columns=te.columns_)
# h: ?, v8 u& m$ e#3.建模
; N' N b" @' B( c5 f$ ~#利用 Apriori函数,设置最小支持度为0.2
( Z# O+ V% m/ C9 d. f( e; w% a) @) efrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)
3 ~& _7 a/ `# ` f* Q#设置关联规则,设置最小置信度为0.153 b- v4 I5 `: D [4 z# D/ S
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)9 i' ~4 i- |9 ]# P6 o; f- V' L# v" X
#4.剪枝并控制输出* D3 X3 Q9 {/ V
#设置最小提升度,并剔除对应的数据% j! P5 \/ J0 l9 W
min_lift=1% [4 b- V! I5 Y/ Z; f/ p# }$ n7 A
rules = temp.drop(temp[temp['lift']<min_lift].index)% L$ ^" X2 }8 T& B! b5 b$ j) {
#筛选需要输出的列
7 P3 p1 a. w: w; M' t$ gresult = rules[['antecedents','consequents','support','confidence','lift']]/ V, v7 m* U- X# L2 X+ ^" q E
result=result.sort_values(['confidence','lift','support'],ascending=False)0 U, b# G2 D7 o1 ]2 ?; ]: ]
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
3 z( O6 ~( C! y! n5 e9 Q
1 {6 f! N1 m9 p1 P6 Y D1
) I7 u: K$ t2 |% a$ O9 \, M9 J2
' V% Y; `8 k. ^$ B3
/ y- w- k7 a/ Q i1 B8 ~0 P4
/ [5 G- O. Q* T7 b5 h! ?5
8 Z: k5 l9 V' l7 s9 {( D6
3 B1 V, ]9 s$ w2 ?4 \' ]7
2 l4 \% I4 S( _# H8 t8
/ X ~ S; h) }9
1 ~) F2 ^) Y8 a8 ~; l& B104 C0 v+ @ S( h8 |) A$ k, |: ~1 H% W
11
2 u: \' ?: o$ S12# J1 H0 C* u# s# `
13
% V3 I0 ]$ Q" V# L" q9 S3 }149 X9 w+ B: T: |- w
15: |5 o( b- r2 w B, ^4 x$ ]
16
7 i/ l$ j) Z/ F# h! A2 Y$ W179 r( i; Q3 T! W1 d v
18
8 o4 P m! i6 y b6 A1 H- d4 c19- k F6 S1 A' ]2 p
20
6 v4 o9 e1 m2 ]; V# S21
& B! }+ G& n, X3 k2 V' v' I; m* F9 D22
+ l; V% X# W0 \( H& {23
5 u+ J" m* g3 L( A7 T24+ c9 ~+ s; q8 k" v
25) E8 ^0 A" J! J @ f; x
26
, {+ G) @) U$ g* S4 u: J* |$ P输出结果见下图:: U. t9 x& D1 k& Z" P% G
! P, |* m" v- i0 L
————————————————. Y! y. C+ K2 e, c& r/ T
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( Q6 n! H! }, {4 o Z$ q8 ^. s( J原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
5 n; O5 A5 Q, M/ C u1 A0 ?3 S' y" I
+ ?; N& \8 _2 n5 q, | |
zan
|