- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 81
- 收听数
- 1
- 能力
- 120 分
- 体力
- 541590 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 167855
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5324
- 主题
- 5250
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
数据挖掘——如何利用Python实现产品关联性分析apriori算法篇* i; ~4 n: u& Y& Z- ~1 P
9 `( d6 \3 w9 f在实际业务场景中,我们常常会探讨到产品的关联性分析,本篇文章将会介绍一下如何在Python环境下如何利用apriori算法进行数据分析。. {: Y# b# T8 ^) @ b, @
* ^* @5 o8 Z2 w: ~2 M$ P! _7 s
1.准备工作
+ q d! G% t g( o( r6 J如果需要在Python环境下实现apriori算法,就离不开一个关键的机器学习库mlxtend,运行以下代码进行安装:0 _% @7 j# B5 n1 a9 Q
6 E3 z# e: j' j M8 |* r" Dpip install mlxtend
5 N; m2 L/ U* {( g1
5 c( _$ Q* u! P1 y) Y, G* b为方便进行过程的演示,在此构建测试数据:) O# [& m+ X4 x
) \/ n1 b0 Q9 D" T- l7 X) g
import pandas as pd- w! j5 ~0 E2 o- {9 Y3 @
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
- E0 G( M8 z9 A1
/ y; }5 M9 t* s0 _; _2. g+ v& c! f& O h, x
测试数据截图如下:/ C6 C- R- x' k& w
$ k5 a( `# X! n- X" I4 z/ v
& E; Z& ^$ O7 _) L: x* T l! Z对上述的数据进行以下处理:) o6 C! ~9 K4 p1 M
) R% R5 O. Q8 ~df_chg=df['product_list'].str.split("-")
: r! h- u `+ w+ u. U1
( l7 H8 t% {6 Y2 \" }8 O数据处理后,结果截图如下:
6 h7 ?/ `, i; w$ z8 w5 u' I' l
3 ^) L# V o# R8 S; w; o截止到此,准备工作已经完成,下面个将会以df_chg作为参数进行建模。! e6 F! ?8 W' Z1 e1 a
0 z, m* T4 M6 l3 x$ l
2.核心函数及代码
# U2 f" v* ~4 e( z2.1 数据预处理
+ V# H+ k- x. w! J# n对传入的数据进行预处理,使其成为符合要求的数据。mlxtend模块中有专门用于数据预处理的方法,在这里直接进行调用即可:
$ Q7 A- C3 ~: m: N/ v" Q- u$ X A. s& z& b
#1.将传入的数据转换为算法可接受的数据类型(布尔值)0 |) b; j/ u# J- q w- R7 G9 Y
from mlxtend.preprocessing import TransactionEncoder
" C" ~% H5 m5 y, q3 K' rte = TransactionEncoder()
3 r' ^1 I# J8 ^/ V9 L8 k# bdf_tf = te.fit_transform(df_chg)
& s$ D! O) W- `0 o/ ]9 K8 B#为方便进行查看,生成dataframe
, k$ @' k9 [2 C; {/ v3 qdata = pd.DataFrame(df_tf,columns=te.columns_)
s5 [, D- b: ^) F1* a! ^: g0 t& ~7 h) y
2' d% j: ^* d, q1 l2 f
3
. @$ {8 F0 E; ~8 U% s, r \42 @' z" I+ O+ o' o# ~
5
% s: b) ]% @* j6% ~( t( r$ L7 k; x$ K
运行以上代码后,传入的df_chg数据会被转换成符合要求的数据data,截图如下:- j6 S8 e. I, {" i) G* Q2 d
) z- v# ^% v: U' g8 u! W! F& e! J
9 M+ b$ \! F0 t2 c9 P" F
2.2 两个关键函数
8 W) T7 Z/ g7 x" M+ uapriori函数 }! E: D0 B0 c" V* _4 X; ~' h
语法:3 \2 s2 V( ~8 |% W2 [
3 ]1 V* Z7 P, j, Y% b- e: {
apriori(df, min_support=0.5, use_colnames=False, max_len=None, verbose=0, low_memory=False)/ Z2 H# I. R4 y8 a# V7 X) h _1 k
1
( N% U* w- ]8 v7 l$ ^& W: F8 z参数详解:
4 Q: l9 l I1 l9 i8 ]# a$ |# g/ C7 W4 }5 Q. ?7 P* ~' Z- H f
df: pandas模块中的数据帧,DataFrame形式的数据;+ Q/ C" H8 ~9 p
min_support:一个介于0和1之间的浮点数,表示对返回的项集的最小支持度。/ d$ d) H+ J7 |" r3 n
use_colnames: 如果为 True,则在返回的 DataFrame 中使用 DataFrame 的列名;如果为False,则返回为列索引。通常情况下我们设置为True。5 `% ~ i! K5 t* F9 v7 d
max_len: 生成的项目集的最大长度。如果无(默认),则计算所有可能的项集长度。
2 K3 W3 R0 R! I7 U9 Averbose: 如果 > = 1且 low_memory 为 True 时,显示迭代次数。如果 = 1且low_memory 为 False,则显示组合的数目。$ Q# V, G6 G& B8 n
low_memory:如果为 True,则使用迭代器搜索 min_support 之上的组合。low _ memory = True 通常只在内存资源有限的情况下用于大型数据集,因为这个实现比默认设置大约慢3-6倍。# S" L' B; X3 V7 b5 J- ]
association_rules函数& e' m4 j0 p& L! j6 D/ |
语法:2 H" d6 y- G( k% y6 v
, [0 I& s1 R- X9 C5 w! i3 Fassociation_rules(df, metric='confidence', min_threshold=0.8, support_only=False)7 [* e7 }/ u. W8 k* U
1" i' p% K2 S3 C( n
参数如下:$ C) ]/ N5 u0 W: E6 E0 C
0 _4 _7 ^# |6 Kdf: pandas模块中的数据帧,DataFrame形式的数据;7 k# g7 V$ p+ P- T; ?' B. S8 [% r
metric: 用于评估规则是否有意义的度量。可选参数有以下几种:‘support’, ‘confidence’, ‘lift’, 'leverage’和 ‘conviction’
" ^4 p1 U) L' Z4 }6 ~# ymin_threshold: 评估度量的最小阈值,通过度量参数确定候选规则是否有意义。: }1 Q# _1 ]% ~$ {5 V
support_only : 只计算规则支持并用 NaN 填充其他度量列。如果: a)输入 DataFrame 是不完整的,例如,不包含所有规则前因和后果的支持值 b)你只是想加快计算速度,因为你不需要其他度量。# \8 L: e0 k8 {- _, C/ \) R
附带metric几种参数的计算方法:
- o q* X) \# E4 u5 Z% t- G/ E. v; h8 N) y2 {
support(A->C) = support(A∩C) [aka ‘support’], range: [0, 1]
/ f; w [2 l; c# B5 S! |/ `! v- [: f4 }! e
confidence(A->C) = support(A∩C) / support(A), range: [0, 1]
2 |8 m8 W) p+ k
- K: h; R7 e. P l Alift(A->C) = confidence(A->C) / support(C), range: [0, inf]# T4 }& K, a$ U2 o/ @
7 @9 _" F- {5 @" K5 ~) H: X, |
leverage(A->C) = support(A->C) - support(A)*support(C),
7 X' D" p. E% V Rrange: [-1, 1]3 h3 Z g) ]1 P
. i! S5 B6 Z F$ w
conviction = [1 - support(C)] / [1 - confidence(A->C)],
& I3 D* U" }$ ~1 n: lrange: [0, inf]
, {. A+ L& x' L7 Z+ [# N9 K1 E" p# y9 R L' J6 m' ?! M
3.实际应用案例, c8 k! r2 Q3 |
以下为完整的调用实例:
. U& c: q. X$ A) m
: X. ^9 F: y- F) X2 |import pandas as pd
0 p3 |! b1 k( D+ i1 ~from mlxtend.preprocessing import TransactionEncoder* j" {0 f8 l9 |
from mlxtend.frequent_patterns import apriori
: D3 a4 z. X& j: }from mlxtend.frequent_patterns import association_rules# G0 M4 c! n: E1 y. \/ \$ W
#1.构建测试数据1 I& f+ z7 u1 |! K
df=pd.DataFrame({'product_list':['A-C', 'D', 'A-B-C-D','A-C','A-C-D','A-C-B']})
5 s/ B9 E2 Z) I9 b+ vdf_chg=df['product_list'].str.split("-")
# o% l. r, ]9 B$ F$ `: L#2.数据预处理" }' D; _% F! I/ o# k1 M
#将传入的数据转换为算法可接受的数据类型(布尔值)
$ |: H9 M. g6 ]/ s1 n* vte = TransactionEncoder()5 S( t1 q$ k. b5 N
df_tf = te.fit_transform(df_chg)/ {) P* P5 e( e9 E1 [
#为方便进行查看,生成dataframe9 r# Y* H" q; i) F& f
data = pd.DataFrame(df_tf,columns=te.columns_)
$ a k( \2 a8 D! ?# |. I#3.建模( q8 ]$ H- a2 u
#利用 Apriori函数,设置最小支持度为0.2
$ f& ]( H4 ~8 R4 gfrequent_itemsets = apriori(data,min_support=0.2,use_colnames= True)' F! q' f& D! V/ j+ u u
#设置关联规则,设置最小置信度为0.15
' p* O+ D- c, t$ G: B3 P9 }' \. r! Z& rtemp= association_rules(frequent_itemsets,metric = 'confidence',min_threshold = 0.15)$ ]# v* P( V* O5 u. A1 {$ M" b
#4.剪枝并控制输出0 b5 k8 S, b9 i/ j, j4 A& E' Y
#设置最小提升度,并剔除对应的数据+ O5 b; Q3 V) Y% P6 H8 z# w
min_lift=1
; x- [3 \3 G8 [. @ grules = temp.drop(temp[temp['lift']<min_lift].index)
% I$ A% @" ~( h2 X) U) [" ]#筛选需要输出的列
, W# r/ V. B8 I+ jresult = rules[['antecedents','consequents','support','confidence','lift']]
5 v# O( W) w6 n4 V" \' u$ r2 ~result=result.sort_values(['confidence','lift','support'],ascending=False)* v, Z) ]" p. X1 b& y
result.to_csv('apriori_result.csv',index=False,encoding='utf-8-sig')2 d+ Z) r. t) r4 K- G! l
" C! z: g) E& H17 f. ^' N% e* K& n, _- T3 n
2: |- [, I/ N& h8 b+ f
3
9 r" _8 G- m3 n# P# y4
# J' K) V- F: B9 X% E2 d& O5
% m+ t8 A8 a) I+ i3 Q4 b6
7 I7 V6 F; w. X7( r& @% S& H' [6 S4 J- V. o
8
8 i2 h1 q& h: G/ k1 {5 V# W" z9$ t1 [8 O3 f( K1 k
10/ h" M5 m3 h o# S! Z+ o( x
11/ V9 I4 V4 N A, c1 [1 Y! `# T
126 Z: I( m8 h) y! b- h, @
13
% j% y$ s- |% g: l# c$ ?141 V8 r' o. K# O8 C1 g
158 O, Y/ v( L. V) R7 |
16
3 {9 s9 G+ q! Q# M2 y17
1 e& R& F \' s& f& c/ B18
: r0 [) s& r! K: r19 x: F; E* _: t# T6 T$ Z, k- N
20
2 D9 q6 f) t/ N; l9 z0 L7 M- p. Y21
8 M# p& |( A) f5 F7 _22( s9 }) Y" W- R9 U
238 |- S+ w9 f& R: n2 ^' y* {7 U, y, V
24- K! }7 d$ O+ O/ Y
25$ T5 m, ] d' P! r" Y
26" I$ q; n- [- }) z# o, d
输出结果见下图:
4 @* I+ e' ?- j- R S# c0 ]
8 J& A1 J; ?8 e8 J' n* Z————————————————
1 T; D9 X3 N( q' U% s+ B& s: @版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" P# M7 `# M) Z原文链接:https://blog.csdn.net/qq_41780234/article/details/121920759" w; g! C6 w. z# z$ e# ^
/ k c3 N d; r* u( x6 O0 j! Q5 q
, M+ Q" M% [/ U; `; D: Q, F2 n |
zan
|