- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564690 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174630
- 相册
- 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算法篇- N \/ s! u2 G) l
4 \4 O+ C% ^: K/ J
在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。8 d3 U! H/ ~, W0 X6 ^
$ P, O+ n) }' o. X2 F, s
1.准备工作* ^7 b6 O% Q5 q9 ^
如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:, G1 Q1 ^$ J5 y. b$ D- A) P
8 Z# l: [1 P$ U) |9 J: X( V
pip install mlxtend
" K2 k1 c# r; P ?1& h: Z6 o/ q% l
为方便进行过程的演示,在此构建测试数据:
' x: Y, W' [. Z: k1 W( h. b; q6 j% ~% |% Y
import pandas as pd
4 U) ~: o6 k6 l1 N( b1 w; q$ |df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})/ ]( D# Q8 E, {6 B6 E+ B {
1
. [( S& \$ }* q; j; U) z2 Y" c V) @) V. L) \% j# T0 h' f
测试数据截图如下:
. I% @: L- k, X" h, O% F) H Q9 P3 `4 X) B ~
" [# u* [: N: Y
对上述的数据进行以下处理:
. U+ R! m( ]5 w& L( e8 P( M; l9 O( J* S$ w
df_chg=df['product_list'].str.split("-")
& }, H4 R$ c' _- a. e1( B7 _& ?, d6 c X& H
数据处理后,结果截图如下:
6 u ]( D y# Y$ f9 C
/ i/ t6 f: P$ n1 N% Y0 c截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。
; r2 t6 f6 ?2 n: C7 B2 k+ |& H- n5 t t1 Y2 s+ A, H
2.核心函数及代码' }& S F( O% }, [
2.1 数据预处理
4 i% |1 n$ m4 U: F$ ?& d1 g对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
7 i# B9 ~& {2 B: F) Y
; N2 u2 G3 K0 m8 G+ R2 R5 p+ Z#1.将传入的数据转换为算法可接受的数据类型(布尔值)
% E m( M6 n3 R) _/ E: Hfrom mlxtend.preprocessing import TransactionEncoder! U0 `" J7 o3 [
te = TransactionEncoder()
# i$ k$ d0 A) b( U+ Z2 _/ rdf_tf = te.fit_transform(df_chg)
5 N/ ]( @$ u8 T! P#为方便进行查看,生成dataframe
- o: `6 z+ e: _. ]. w% @data = pd.DataFrame(df_tf,columns=te.columns_)% c+ P! [( e* n9 n- T
1, i, X* E$ c/ a5 q4 I( B. C9 C
2
' Z' Y" }& \1 L33 L0 T! z5 E) L2 _% ]1 F
4
* @. x) V" A2 Z6 m, P# G5
9 N0 d& `, o$ q; g4 L3 x+ L8 U6" L' [/ g2 Z0 o: {
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:
/ h6 ^( S9 i: p" [
{1 T& B3 B! |$ |& F# r( k
, ~0 {# w' J/ v: @0 t# |2.2 两个关键函数
9 L7 W3 B; z1 ]apriori函数. d$ R% l5 N. S. U2 L8 N4 S
语法:; t8 y( L- ?8 q/ u8 Q+ u0 k7 J
, q& m8 R! d3 i' d. ~apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)
. C( C' s0 F2 B% u. M1
8 ~% U: q7 o6 P参数详解:
- \, Z: `' g$ Z1 z. H( J! x, a) g2 N5 q0 d0 j6 C% h. D
df: pandas模块中的数据帧,DataFrame形式的数据;
3 L, x; V7 T- ~( tmin_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。 U5 `+ g6 @' L/ [' k& \
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。% c$ ?8 k- R6 e& O
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
- g( b1 j; L) C# {$ {: U$ ?) M5 zverbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。* L4 {7 ]& F- ]# B
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。' G- ?# g$ H; b7 H0 z1 E
association_rules函数
: _% a6 @' ?5 s8 A0 c语法:& M3 f+ N& g; h8 t3 D2 Y
{* k: K. f7 Xassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)6 j O" D5 W4 a! z
13 [6 ?* k( S; o4 A8 }7 j+ e5 U
参数如下:; W/ @% x# Q' G: C
; B! P) U8 B }$ A3 K( }
df: pandas模块中的数据帧,DataFrame形式的数据;- e9 {( ]" |% k/ p H$ K/ u
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
) T$ Y" G9 B3 U. V$ P2 z' J3 m. imin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。0 r+ y% \, g9 ~0 N9 S5 N3 j6 A
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。
( Y k/ |0 [* S' K, r/ ~附带metric几种参数的计算方法:; N" t& |$ j, Q
4 k( g, M( s+ _( a9 s& ?support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]8 C% E2 a& \& @& b) j, g' t
" r g( ~1 J* d+ ]2 L& A9 Qconfidence(A->C) = support(A∩C) / support(A), range: [0, 1]
& k5 o( I& M# l1 N
7 ~' T( V4 T. z/ Z0 }lift(A->C) = confidence(A->C) / support(C), range: [0, inf]' g4 F+ [2 E+ \& D l8 h' b! r
; P$ n( {- t, }1 Q3 L
leverage(A->C) = support(A->C) - support(A)*support(C),
0 {/ e; ^, Q5 G5 e4 Crange: [-1, 1]
7 N/ f" a: |3 @( E9 q2 V m5 B
" ]5 N! v; m6 l0 d) t, O. nconviction = [1 - support(C)] / [1 - confidence(A->C)],
" H. r, L U: W. Q) frange: [0, inf]
" L X" d8 o! z( X7 g7 [, e
, a' _+ Y: \0 }/ f. Q: B9 ]3.实际应用案例
& j2 f% Z6 _6 N" W以下为完整的调用实例:% z& N0 F1 `9 d/ _
7 Q* A! _# D1 |3 d7 A+ l# Dimport pandas as pd
% c1 C& |! g" ofrom mlxtend.preprocessing import TransactionEncoder+ w) J' T! W& `+ M% w
from mlxtend.frequent_patterns import apriori
$ u+ w9 L8 a/ Ufrom mlxtend.frequent_patterns import association_rules
5 D0 m# u* O. b9 U#1.构建测试数据
4 a4 @* k6 R1 I( n2 qdf=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})- I8 ^: X( B0 s0 V1 D
df_chg=df['product_list'].str.split("-")
! w0 i" Z. Z! I/ I8 }#2.数据预处理
; G: _! a$ r* e3 `0 d9 q#将传入的数据转换为算法可接受的数据类型(布尔值); f/ X! L, N0 l) [( P& j/ [
te = TransactionEncoder()
7 V$ I) q+ k/ W0 D( D: O* j, kdf_tf = te.fit_transform(df_chg)
3 |9 K7 c( Y Z! J, W6 @& R0 S#为方便进行查看,生成dataframe* {% ]# L3 g/ J& [
data = pd.DataFrame(df_tf,columns=te.columns_) f9 L: W3 u/ b' L0 k
#3.建模
# L* y* p U) e#利用 Apriori函数,设置最小支持度为0.2. `# m1 W, \! _7 {2 l5 R& p
frequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)" u2 v- c; ^: b
#设置关联规则,设置最小置信度为0.15
8 U( T/ P5 P k0 x& Itemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)0 c9 [# z7 ?) P% [6 U
#4.剪枝并控制输出. [% j: z4 w/ C6 C( G, ^$ v; d
#设置最小提升度,并剔除对应的数据
' W% e+ \; ?- Y4 J8 wmin_lift=1, n, q; ` W& v
rules = temp.drop(temp[temp['lift']<min_lift].index), [$ A# Z% H& N, A: h5 T) i% c. I
#筛选需要输出的列
! a N: O0 O3 m) K* Presult = rules[['antecedents','consequents','support','confidence','lift']]0 K5 p$ U2 s: _$ V0 q
result=result.sort_values(['confidence','lift','support'],ascending=False)
0 |! R% H/ u! Qresult.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')$ ], {9 E* a: ?; q5 Z
& j- q/ F7 q; V# w8 L0 ]# S" b
1
- S4 ^/ i6 s% P, E2
$ `3 h; ?* n; P$ F! f2 I( {& \- a. |3! U; o3 @4 V2 f; i9 s; a1 h
4) y& m1 E: V- P# k }
5+ t: H% d6 x1 ~+ n) h) z
6
5 P9 c) |8 J' E5 `) U( v2 M! ^7- x# f* A7 r" G( Y) A4 v
8! D( j" g; c' W2 O
98 ]9 o j8 K& a- a6 Q7 O% U
10
6 e5 A' ]- l4 J# `$ y1 w9 T& ]! l11
+ P; O) G' M( o+ d- Y- \128 q9 s: f+ ]# a& e1 P
13
8 B% {* {3 H3 ?" K+ y14
' D$ ?) P: n9 ^7 j5 j15
1 c+ a/ X6 W# V* s16% t h/ C' ]3 P5 r
176 P- H* \% N F- b
18
* [+ y N( f$ ?( V2 ^- r6 x+ x19& N1 c. ?# w7 B
20# T/ R2 ?' h, l, C- A" P6 B& `
21
J: [1 T4 b- r' Q7 D22
, y& W( f P: g23
$ I" y) H" S- \24, s8 H0 d0 l4 f4 S
25
" t# p$ {3 o: U- L8 o h26
* H1 r4 U/ ~) o输出结果见下图:
$ J' Q0 w' J5 i# e% I2 ?
r) @- [, i! b) m/ g0 `3 v* V" T————————————————) ~9 Y) _; E# M) L2 M) a
版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。1 s) O: D U0 l" e' f: i' \' ?
原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759* ^5 N$ H# A" A* @# B
/ s) f6 @8 z5 [% `2 O8 s# o5 ?4 V; E6 c; w
|
zan
|