朴素贝叶斯分类器_以python为工具【Python机器学习系列(十三)】+ h. L( W5 I% L9 Y7 G8 v& R6 B
3 P2 k0 `& z; k/ w0 n z- ^
文章目录+ d0 O: [3 J7 ?6 K+ {" U9 v4 u
1. 朴素贝叶斯算法原理5 w0 K. }1 H# f. Q0 L
2. sklearn提供的朴素贝叶斯算法7 o& U( _& w9 d5 h" v! k- t. J
3. 伯努利朴素贝叶斯 BernoulliNB() 6 j1 L. O! C- O% l4. 多项式朴素贝叶斯 MultinomialNB() + ]1 H+ t4 B S7 A6 E5. 高斯朴素贝叶斯 GaussianNB()3 P. s- q* K; m2 _: i2 r; G, E5 S
ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ5 G) y+ N, A. Q4 B# X
, Y0 v9 C, F/ s4 b ʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔɞ4 I' b# B5 V |) J2 F
0 Q! j/ \9 @+ b: f" g大家好,我是侯小啾! ( x8 J g" b; p5 a, V3 j) W4 x# u* B+ l4 o# B' R0 d
今天分享的话题是朴素贝叶斯分类器算法。 6 o: V+ l; ]0 C1 v , u1 j4 |4 K5 {. D+ ^🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ 3 P' A0 T! t3 B' E L7 n, i/ T ' W4 }, t( K, A' m) i A1. 朴素贝叶斯算法原理 d+ x3 d, p$ {) Y* t6 }! D
使用贝叶斯算法,首先需要理解的是以下两个公式:9 S7 g# `; A9 l: m2 Q0 y
7 q* c) i @0 u; t' R/ R全概率公式7 M6 N/ m8 t) u8 j
) E5 k. t% `1 s1 n; G9 y. f ( B ) = P ( A 1 ) × P ( B ∣ A 1 ) + P ( A 2 ) × P ( B ∣ A 2 ) + . . . + P ( A n ) × P ( B ∣ A n ) P(B)=P(A_1)×P(B|A_1)+P(A_2)×P(B|A_2)+...+P(A_n)×P(B|A_n)P(B)=P(A 4 r7 K: @# x, \) B8 d* Z' X
1, S+ D. f2 v/ X. ^) a$ e
/ @$ |6 d. Z) E+ Y. p, F
)×P(B∣A 7 B8 U# S( m) h6 f2 a3 v3 j9 k
1 ; j, Q0 ^' f" ~$ Q0 j5 s+ |$ l; O" @" q7 P
)+P(A 5 n( T8 g( t: E! j) n6 V) g P
2 & Q# J( i" W& M8 i0 @+ W. R/ v8 n* \# C {: t0 m
)×P(B∣A + Z2 h0 \: s% h4 G: @28 z7 l$ m6 Y9 ]
1 |$ l2 w4 L, b, h& } o )+...+P(A " W. H, I& C x/ ]n4 q; D1 u9 n" H* r
* n Z3 K8 G6 v1 I& k- ?# E" c
)×P(B∣A f4 z( W0 f& `# D
n $ V, B7 Z# @& `# F- o; w 4 t4 ?5 O m9 r& | ) $ P# W( [% }8 ~+ I, N) G6 [ 0 D. X6 s" F, n1 b贝叶斯公式 6 v6 G" s P' l! |& `/ W& k; h! A* Q& w ( A ∣ B ) = P(A|B)=P(A∣B)=P ( A ) × P ( B ∣ A ) P ( B ) \frac{P(A)×P(B|A)}{P(B)} 9 y P/ H* ] R0 a
P(B)% z" q0 v$ ?9 E7 }: }
P(A)×P(B∣A) + |- F& ?8 M' f( I. ]3 N/ S8 W1 C# `2 T0 f1 G% e' Z9 G
! |" H9 a; h% x. l; ~* ` ) S2 h6 m$ {% Y. H1 O 或+ l# u0 i' s* d
, d/ b! M' S) @( o! ~1 _3 } ( A n ∣ B ) = P(A_n|B)=P(A 1 T* h* q) M, m8 r9 r0 p2 Z- M a& Z
n 5 w/ O! a* T5 m& ^2 | $ R1 u9 L) Y/ d* X ∣B)=P ( A n ) × P ( B ∣ A n ) P ( B ) \frac{P(A_n)×P(B|A_n)}{P(B)} 6 T! X S0 d1 E: d2 q" `
P(B) & u3 X: S1 F! CP(A + r4 m9 I/ Q* I0 v( o7 R+ s
n2 z v7 X1 z, ^# {/ ~! C0 E. m* r
+ }" Z9 X0 O0 T, v' v* E. I; E )×P(B∣A # G$ D2 N8 v% J( U+ r0 f6 w
n & J; |) U% x; y" F8 ~! G$ J7 @+ Q3 D4 c+ c4 T% M5 K! }8 \
) 2 P$ U) k1 \. z P: t* ^" }6 N6 n( j( S+ S+ R0 g
3 n# \, H1 F( w+ z1 u3 j' _- M - f0 _$ i/ l6 c5 r O通俗地讲,假设需要将对某样本分为为0和1二类,其有A,B,C三个特征且值分别为a、b、c, / P( }5 V/ V4 G/ D2 F5 U则只需要求出,在类别为0前提下特证A、B、C分别为a、b、c的概率:6 ^8 V4 O% }3 S. _
# K; P5 u4 K$ K5 b* T
即P ( A = a , B = b , C = c ∣ 类别为 0 ) P(A=a,B=b,C=c|类别为0)P(A=a,B=b,C=c∣类别为0)8 G2 ~2 K+ {) V/ p( D" b4 K
. n) w' E7 L2 |binarize : float or None, default=0.0# E, E, t2 Z- W4 h& c7 Q
Threshold for binarizing (mapping to booleans) of sample features.$ O9 S& X" N1 ^9 l3 C1 g
If None, input is presumed to already consist of binary vectors., o( }5 A: _& @: `, T+ A w
! h; O5 T# }- L" a! I& ybinarize:浮点类型或None,默认值为0.0: X( ^; R3 w. [
样本特征二值化(映射到布尔值)的阈值。% l O& W5 w, e
如果为None,则假定输入的特征数据已经是二值化的向量了。% a9 Q* \. R# w
+ m0 Q6 {7 ^: k" M, g. Q! D5 H训练模型,并使用测试集数据检验模型得分: , d9 \9 t6 Z0 Z8 X$ I; U x: [& w/ F* W3 }" C
X_train,X_test,y_train,y_test=train_test_split(X, y, random_state=10)( p9 c+ a0 O# w6 k6 f: c
nb = BernoulliNB()* @ h, `. w7 K/ ^# M- Y; y
nb.fit(X_train, y_train) % Z0 q6 n5 R! c- ~( b( j8 O ~print('模型得分:{:.3f}'.format(nb.score(X_test, y_test)))3 C! B* u3 R, J/ U8 a6 Y0 Y; w
1; C% l! B( x) N
2, ^9 Q8 K% j0 X7 `' ~6 b8 A2 a, _
3) X7 O3 |) R! f; \) l$ K. t2 w9 S
4) Z5 o8 ^. T- w7 Z( W
于是模型得到了一个“离谱”的得分1.0(简直不能更好): 6 {8 c" m/ Q6 M & h$ E5 T% `" u/ n3 V: S) U! | 1 k' \+ E) A: p5 k输出预测结果:7 u6 U) M. k* r k0 ^8 I
8 G4 Y0 h7 h2 d: D9 k% c0 |2 P. gpred = nb.predict(X_test) & E3 U. d0 ^; Eprint(pred) . s* O1 u1 |: D; F+ G: _$ ~; T* L1; G8 k" Y' b y7 `3 V5 x
2 $ g( `3 A& z# s" t7 O 3 I* x& W$ x( u+ M# g; y. h+ p2 p4 ~5 s$ K2 d. O3 ?, l* v
4. 多项式朴素贝叶斯 MultinomialNB()* Y) s$ D2 k* v. k% m9 j; l
MultinomialNB()实现了服从多项分布数据的朴素贝叶斯算法。; W! |/ F' Q2 T% y1 I- B
也是用于文本分类的两大经典朴素贝叶斯算法之一(文本分类领域中数据往往以词向量表示,尽管在实践中 tf-idf 向量在预测时表现良好)。 ) Y0 Q0 W+ a; L5 j" W) [/ }8 A% i; J% o( E
生成两组随机数,用于示例展示。一组特征值,一组标签。 2 ~# h+ z# p$ Y( B$ }7 R6 _' }$ p0 F, J& |; _* U
import numpy as np " f) {% g' R5 `, q2 _. |from sklearn.naive_bayes import MultinomialNB$ {5 f V( m* ~) V
from sklearn.model_selection import train_test_split # ~+ v9 Q# R* j: L8 t4 S( m6 s! T% G8 @
4 \0 V* N. s* r% i9 R" {! j
# 设置随机数种子' x0 R) m. L5 b6 R
np.random.seed(10)- _/ [/ X( B! o4 x" F
# 1000个样本,5个特征,每个样本的取值是[0,9]的整数 ' v$ k$ m0 ^* GX = np.random.randint(10, size=(1000, 5)) , M i% g) ~, b8 P# 标签可以有的取值为0,1,2 % ]& P/ j; ^6 u/ F8 by = np.random.randint(3, size=[1000])2 t9 G, b2 q. [* A- ^& Q4 O( c2 n
print(X)4 h% N4 Q" C7 L5 U$ {
print(y)# y: L/ Q9 f: }+ P8 U3 e6 a3 q
1 2 c1 X" Q8 e; f. K. @) z2" c m' G# n5 Q* r
3 7 Y- y# ?$ g" D/ T5 o4' {7 ?6 Y4 e' u
5 : C @- e/ r9 N61 j8 s, Y, B- d+ F1 `; i
7 0 E# G- J c1 I; K8' \. f" S" d- L! s. f" ^" b
97 e! L( y& q7 {% G0 F9 y; E
103 P6 _4 D- n$ v* c# R4 K3 I
11 7 I) H, c; s$ K8 d4 x/ [128 l/ H4 p5 q& U4 t. q1 D9 V# m; `
13 2 _' [; R! S7 `3 f部分数据展示如下: / |; q5 d% W' n4 W: ? 6 `7 ~. B+ M+ U& z. T) [9 @ ^$ _- U: b. M- l
# 分割数据6 [, `: [7 V4 {
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=10)2 l0 N9 a: [$ k$ V
# 训练多项式朴素贝叶斯模型 0 W; s9 n. j2 X! J. Snb = MultinomialNB() $ h0 U/ ?+ s5 y* w- y' d! @9 Jnb.fit(X_train, y_train)( _! b: W8 m7 N: n
5 E9 E5 n& l- |! q. Z
print('模型得分:{:.3f}'.format(nb.score(X_test, y_test)))( h/ V' I2 L9 w! w( |
pred = nb.predict(X_test)2 b. a, D0 D) x. `5 H9 Q, J6 c
print(pred) . u$ d# `3 ^3 U" [+ l9 g# z# }8 n% Z15 j& G0 I% J% @5 g6 [; I
2 a# g/ G: {3 {: o) @- `33 p$ x8 d; z1 ^
4 % L# z- k7 N. |+ {5( f0 u# v3 n' y8 B8 S" x' v$ L3 I
6! D1 T5 M8 f+ U5 {
7 1 Z! [1 g5 n3 N' f( ]8 ' d% \' C! }: d+ U) n; D% ?- W9' Y; |" t3 @( ~7 j
模型得分及预测结果如下图所示:0 }* I3 S, M7 u* K1 U