- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 562810 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174216
- 相册
- 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算法篇
- u1 K6 T6 g" a% C0 _& q% J9 f
) J8 t8 |6 R9 v/ D! v X1 b8 v: C在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。
3 x$ G" q/ E* }+ k$ q- S
8 d$ X$ U) }/ [$ c; E9 U/ D1.准备工作- G" [7 Y0 w0 g6 H# {
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:1 p+ n; n* U( g2 D9 w$ R% }8 T: V& I
# I+ @ D! q, b! C* c3 N) ^
pip install mlxtend
+ [9 M: u, \4 Z3 T4 }7 m1
" _. E& ?6 S& e& M- T2 c为方便进行过程的演示,在此构建测试数据:7 ?$ W9 y; R! T2 T. k9 p
; |3 h; b5 ~9 B3 I. Q( a
import pandas as pd( z7 b6 L( O& p) H# i( }. l
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
" Z, C5 f" G2 q9 o$ a: W1 f1, j0 n- K& F6 L+ d2 u! D A _
2
* E/ D( X& {( D* J& e7 O测试数据截图如下:5 G5 h: ?4 Y( F: Z. r
9 T0 F& c/ t' ]: U% J0 B g c, _. Z4 u
对上述的数据进行以下处理:- h6 x y/ y9 C. G1 X: Q2 r
- A. J, ^; Q; ]' W; b/ Gdf_chg=df['product_list'].str.split("-")' \# y- @: O7 W( p
14 @1 M7 O# g! n& e
数据处理后,结果截图如下:
* u m6 B& J. G2 E3 n' F: x ~
! u; s9 z8 N: s截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
& U; y- q, p0 t$ s
% M3 g% f$ n6 E2.核心函数及代码4 h( O- w+ a, o+ K" P; G, b
2.1 数据预处理) w6 Y8 Z' S5 g* K3 Z* E
对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
' U( R# D* C, C. e
) ?# p. L' ?) j% q" r9 M; F+ a# ?: e- r#1.将传入的数据转换为算法可接受的数据类型(布尔值)+ z2 e! ]7 x0 }# b0 \$ W
from mlxtend.preprocessing import TransactionEncoder! [/ {* G A2 L! M- b% L0 C
te = TransactionEncoder()
* r$ @1 B! e9 t }: U$ p. idf_tf = te.fit_transform(df_chg)8 h, ?: h1 q: W. l
#为方便进行查看,生成dataframe7 ]( Y7 H6 R8 `2 e1 Y
data = pd.DataFrame(df_tf,columns=te.columns_)& e- f* T" ~; d7 T5 Q* h: j4 W
1
! ?* f; L8 C2 C9 I& o/ ^* g) r25 | j4 ^5 X% u" m2 n% Y
3
. g1 w9 F' r2 D2 M% `5 ~( ]4) x, b0 K6 I* ^0 ^, `. e0 _
5" ^8 @0 n2 r% y
60 Z) o# n4 n$ a3 l& r& I
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:. \! D4 E. m7 ?; V+ J- {- x
! ~( e& q; D. @) A
5 B8 j, s6 c8 S6 r6 z* Y+ \
2.2 两个关键函数
9 T5 W8 G/ Z; M8 |apriori函数
4 P r) Q z$ D, Y: G语法:
' o0 O* f% U# s1 R0 g4 \! |
6 q2 }1 s7 b6 Y7 sapriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
+ W2 O$ S; u" l8 e) G' W1' L# R1 C1 D& P) i* w
参数详解:4 l9 a2 S' {5 y) m$ J
, K: @# u2 v$ B6 [" Ldf: pandas模块中的数据帧,DataFrame形式的数据;- [/ X: h f" M7 J2 l
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。
6 U( k4 A" m- w* U& d+ a5 @# K& W euse_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。" @0 T; G6 D/ Z% A7 ^9 l
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。 [. Q: [4 X; u! `3 z
verbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。# x( W$ q V9 T) c k( U6 @
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。9 l4 _" ~4 U- t6 g- W6 H
association_rules函数$ x! |& h) S, k) ?7 M9 g! K% Q
语法:
9 ]" X, V9 k' L Z/ ?0 |
2 b3 m$ n4 y7 z+ n+ y5 H% iassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)9 k3 v6 ]% T3 u! Y" T7 i
1
/ Y) F0 a3 n8 j& S- Z参数如下:
3 e u( N6 D5 Y$ J- }2 `2 c. d4 `% i# m8 I
df: pandas模块中的数据帧,DataFrame形式的数据;
' H- V: J9 N8 U9 q9 L- {3 \" h6 ametric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’* {( J- ^: J$ ]9 U/ T2 p9 e& Z
min_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。
4 n; Q q$ W& I4 t+ {& M# Gsupport_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
# M' B$ R& ]( ? a% p附带metric几种参数的计算方法:
8 A X9 x2 G3 x5 t/ U5 M9 n2 i
/ g- A# M* p6 q {1 g. w. \support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]! @1 {9 U l9 X! O$ _
) e0 e2 s5 H" N wconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]/ H% ^- K& c7 ?: L6 @ b8 X' K
, q7 [ I5 j! ?4 A, `9 Y6 m1 z4 Flift(A->C) = confidence(A->C) / support(C), range: [0, inf]! M9 F4 K& U C6 r [, W: A7 z
* r0 ]& B8 I, Mleverage(A->C) = support(A->C) - support(A)*support(C),
3 K7 s3 C r' q9 f) _. e8 Krange: [-1, 1]
/ j; @1 K6 a" w# u' ]& h, V% x8 f# _2 [
conviction = [1 - support(C)] / [1 - confidence(A->C)],) H; C& R7 J8 p. w+ H% c
range: [0, inf]( z! u! s4 K# t$ f9 ?! Z
?0 r* F: n0 t$ i0 ?# {3.实际应用案例% k* j/ n$ `2 O7 G! U1 z, B( N, W7 K
以下为完整的调用实例:
! f) u8 D; u4 P' g, C# G
M6 @8 h( n, [import pandas as pd
% E: q. Z' ~ J& E+ h" yfrom mlxtend.preprocessing import TransactionEncoder' U& L( t, Y7 ~: h
from mlxtend.frequent_patterns import apriori
3 B4 O4 p; V9 E$ A) o- {4 T+ qfrom mlxtend.frequent_patterns import association_rules
2 t+ h" r8 R# ^8 ^#1.构建测试数据4 c2 \, z1 r+ D: b
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})" f0 N) R% g2 N+ _
df_chg=df['product_list'].str.split("-")
+ q h# p4 U' ]4 n#2.数据预处理4 z( E+ X- B9 s% L
#将传入的数据转换为算法可接受的数据类型(布尔值)) q( q; [( \) _7 D8 A' s
te = TransactionEncoder() ^* N5 ?4 Z. S' q9 ~+ y
df_tf = te.fit_transform(df_chg)
9 O$ c7 c# v9 W' j#为方便进行查看,生成dataframe
" e( R" L' S+ }$ U1 rdata = pd.DataFrame(df_tf,columns=te.columns_)
( ^4 n9 B2 D0 y# G- r# U1 n#3.建模
! L7 k0 u* m" U, A/ E8 Z#利用 Apriori函数,设置最小支持度为0.23 J, T- S. p' F/ A
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)" I5 t) L6 v0 C
#设置关联规则,设置最小置信度为0.15+ c$ A5 ]( }' V$ q7 R
temp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)0 Y* n: o: M8 r" f
#4.剪枝并控制输出2 |' i7 w! a" B& w; Y
#设置最小提升度,并剔除对应的数据
/ I. n7 f( e9 L9 S; \& |min_lift=1
, j& H) l1 y3 c4 yrules = temp.drop(temp[temp['lift']<min_lift].index). y0 v/ i0 ?9 B _
#筛选需要输出的列6 o" V4 N6 C, L/ \( Q% x* F
result = rules[['antecedents','consequents','support','confidence','lift']]& ]1 `: i; C8 o% b0 c0 Z
result=result.sort_values(['confidence','lift','support'],ascending=False): _3 k4 r% I: n/ c7 R7 {+ m4 W% m
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')
+ [; ^* Q# u2 \* S) @6 x4 d: L; P# Y0 L6 R; J3 G# y
1
! E# |# ]; O- {5 Q# t% ]" V3 C0 `2$ p1 i2 k9 p% j3 _- q# o7 L3 ~2 a
3, B3 o/ Q; {: c5 x* L4 Y4 Z
41 e! N7 \7 e8 f! v6 N) N1 z0 z
54 _+ G# z1 ~, b1 K" y
6
- D$ N6 D; L' V! A7
0 F4 o8 G& ]# L- b* O8' n, q; z0 p) Z5 l) j4 J
9
6 F* }- n; a d5 }2 y10
5 P9 J3 R' F3 V8 \# P8 }11
2 K2 _* Q+ D+ b9 _" V7 h12: }. l7 @, P$ c1 ?4 P
13
4 f5 [. l& l9 R! o14
0 q( j0 T% y1 }15
5 f. c( c s1 {' a5 A16
8 O% O3 a0 A' f* V; ]) k" ?& R( b3 L17
3 P" f* [- ]9 H: I! w% y9 Y: H18
. @4 }# ?8 g9 p19* ]$ ^2 Z4 l1 X; @
20
* u) o6 b6 {3 m( }% N- k. R21
# w0 y% {5 C% S. R% I, p22) @3 J9 F# i8 s1 ^
23
+ |2 {5 I% P4 N! x6 V248 D4 V$ H0 _9 @4 g
25
/ m9 s; }+ l4 w* j+ \26
& u; ?* V/ R2 S8 X输出结果见下图:0 j9 r5 }; O" U; l) X4 o' |
) l2 B0 Q. T! h% |3 n" L
————————————————+ j0 t1 h' X% l
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
0 [* X! p" h" J原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759
3 B7 e' X5 W; P. N, @, y/ f" H' d9 @* o* t8 J g9 N5 i
+ w3 D! C5 D5 r0 ]9 W, ?
|
zan
|