ML 支持向量机SVM

ML 支持向量机SVM

1.概述

给定训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D = \{ (x_1,y_1), (x_2,y_2),..., (x_m,y_m) \} D={(x1,y1),(x2,y2),...,(xm,ym)}, y i ∈ { − 1 , + 1 } y_i \in \{ -1, +1 \} yi{1,+1}, SVM的基本思想是在训练集 D D D 样本空间中找到一个划分超平面 (二维即一条分割线),将不同的样本分开,如下图

在这里插入图片描述

如图所示,存在多个超平面将训练样本分开,但直观从图上来看,加粗的那个超平面可能是这些超平面中最优的,因为这个超平面对于样本局部扰动的容忍性最好。

在样本空间中,划分超平面可通过如下线性方程描述
w T x + b = 0 w^{T}x + b = 0 wTx+b=0
于是,样本空间中任意点 x x x到超平面的距离可以表示为
r = ∣ w T + b ∣ ∣ ∣ w ∣ ∣ r = \frac{|w^{T} + b|}{||w||} r=wwT+b
若超平面能将样本正确分类,对于 ( x i , y i ) ∈ D (x_i, y_i) \in D (xi,yi)D, 若 y i = + 1 y_i = +1 yi=+1, 则有 w T x + b > 0 w^{T}x + b > 0 wTx+b>0; 若 y i = − 1 y_i = -1 yi=1, 则有 w T x + b < 0 w^{T}x + b < 0 wTx+b<0. 即
{ w T x + b ≥ + 1 , y i = + 1 w T x + b ≤ − 1 , y i = − 1 \begin{cases} w^{T}x+b \geq +1 , y_i = +1\\ w^{T}x+b \leq -1 , y_i = -1 \end{cases} {wTx+b+1,yi=+1wTx+b1,yi=1
距离超平面最近的几个训练样本是得式 ( 3 ) (3) (3) 等号成立,它们被称为支持向量。于是,两个异类支持向量到超平面的距离之和为
γ = 2 ∣ ∣ w ∣ ∣ \gamma = \frac{2}{||w||} γ=w2
在这里插入图片描述

SVM思想则是欲找到具有最大间隔的划分超平面,即
max ⁡ w , b 2 ∣ ∣ w ∣ ∣ s . t . y i ( w T x + b ) ≥ 1 , i = 1 , 2 , . . . , m \max_{w,b} \frac{2}{||w||} \\ s.t. y_i(w^{T}x + b) \geq 1, i=1,2,...,m w,bmaxw2s.t.yi(wTx+b)1,i=1,2,...,m
显然,为了最大化间隔,只需要最小化 ∣ ∣ w ∣ ∣ 2 ||w||^2 w2, 即
min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t . y i ( w T x + b ) ≥ 1 , i = 1 , 2 , . . . , m \min_{w,b} {\frac{1}{2} ||w||^2} \\ s.t. y_i(w^{T}x + b) \geq 1, i=1,2,...,m w,bmin21w2s.t.yi(wTx+b)1,i=1,2,...,m

2.对偶问题

2.1 转换对偶问题

( 6 ) (6) (6) 为原始问题,可应用拉格朗日法转换为求解对偶问题。转换为对偶问题求解的原因:

  • 对偶问题更易求解,此处对偶问题只需要优化一个变量 α \alpha α且约束条件更加简单
  • 能够更加自然的引入核函数,进而推广到非线性问题

首先,构造拉格朗日函数,为此需要引入拉格朗日乘子 α i ≥ 0 , i = 1 , 2 , . . . , m \alpha_i \geq 0, i = 1,2,..., m αi0,i=1,2,...,m, 得拉格朗日函数:
L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 m α i [ y i ( w T x + b ) − 1 ] L(w,b,\alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{m}\alpha_i [y_i (w^Tx + b) -1] L(w,b,α)=21w2i=1mαi[yi(wTx+b)1]
因此,给定一个 w w w b b b, 若不满足式 ( 6 ) (6) (6) 约束,那么有
max ⁡ α L ( w , b , α ) = + ∞ \max_{\alpha} L(w, b, \alpha) = + \infty αmaxL(w,b,α)=+
否则,若满足式 ( 6 ) (6) (6) 约束,有
max ⁡ α L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 \max_{\alpha} L(w, b, \alpha) = \frac{1}{2}||w||^2 αmaxL(w,b,α)=21w2
于是,优化问题
min ⁡ w , b max ⁡ α L ( w , b , α ) \min_{w,b}\max_{\alpha} L(w, b, \alpha) w,bminαmaxL(w,b,α)
与式 ( 6 ) (6) (6) 所述问题是完全等价的。

根据拉格朗日对偶性,式 ( 6 ) (6) (6) 问题的对偶问题是
max ⁡ α min ⁡ w , b L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 m α i [ y i ( w T x + b ) − 1 ] \max_{\alpha}\min_{w,b} L(w,b,\alpha) = \\ \frac{1}{2}||w||^2 - \sum_{i=1}^{m}\alpha_i [y_i (w^Tx + b) -1] αmaxw,bminL(w,b,α)=21w2i=1mαi[yi(wTx+b)1]

2.2 求解对偶问题

为了求得对偶问题的解,需要先求得 L ( w , b , α ) L(w,b,\alpha) L(w,b,α) w w w b b b 的极小在对 α \alpha α 的极大。

1) 求 min ⁡ w , b L ( w , b , α ) \min_{w,b} L(w,b,\alpha) minw,bL(w,b,α):对拉格朗日函数求导并令导数为0,有:
∇ w L ( w , b , α ) = w − ∑ i = 1 m a i y i x i = 0 \nabla_{w} L(w, b, \alpha) = w - \sum_{i=1}^{m} a_i y_i x_i = 0 wL(w,b,α)=wi=1maiyixi=0

∇ b L ( w , b , α ) = ∑ i = 1 m a i y i = 0 \nabla_{b} L(w, b, \alpha) = \sum_{i=1}^{m} a_i y_i = 0 bL(w,b,α)=i=1maiyi=0

解得:
w = ∑ i = 1 m a i y i x i w = \sum_{i=1}^{m} a_i y_i x_i w=i=1maiyixi

∑ i = 1 m a i y i = 0 \sum_{i=1}^{m} a_i y_i = 0 i=1maiyi=0

将所得式 ( 14 ) (14) (14) 和 式 ( 15 ) (15) (15) 代入 L ( w , b , α ) L(w, b, \alpha) L(w,b,α), 得:
L ( w , b , α ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 m α i [ y i ( w T x + b ) − 1 ] = 1 2 ∑ i = 1 m a i y i x i T ∑ i = j m a j y j x j − ∑ i = 1 m a i y i x i T ∑ i = j m a j y j x j − b ∑ i = 1 m a i y i + ∑ i = 1 m a i = ∑ i = 1 m a i − 1 2 ∑ i = 1 m a i y i x i T ∑ i = j m a j y j x j L(w, b, \alpha) = \frac{1}{2}||w||^2 - \sum_{i=1}^{m}\alpha_i [y_i (w^Tx + b) -1] \\ = \frac{1}{2}\sum_{i=1}^{m} a_iy_ix_i^T \sum_{i=j}^{m} a_jy_jx_j - \sum_{i=1}^{m}a_iy_ix_i^T\sum_{i=j}^{m}a_jy_jx_j - b\sum_{i=1}^{m}a_iy_i + \sum_{i=1}^{m}a_i \\ = \sum_{i=1}^{m}a_i - \frac{1}{2}\sum_{i=1}^{m} a_iy_ix_i^T \sum_{i=j}^{m} a_jy_jx_j L(w,b,α)=21w2i=1mαi[yi(wTx+b)1]=21i=1maiyixiTi=jmajyjxji=1maiyixiTi=jmajyjxjbi=1maiyi+i=1mai=i=1mai21i=1maiyixiTi=jmajyjxj
综上,
min ⁡ w , b L ( w , b , α ) = − 1 2 ∑ i = 1 m ∑ i = j m a i a j y i y j x i T x j + ∑ i = 1 m a i \min_{w,b} L(w,b,\alpha) = - \frac{1}{2}\sum_{i=1}^{m} \sum_{i=j}^{m}a_i a_j y_i y_j x_i^T x_j + \sum_{i=1}^{m}a_i w,bminL(w,b,α)=21i=1mi=jmaiajyiyjxiTxj+i=1mai
2)求 min ⁡ w , b L ( w , b , α ) \min_{w,b} L(w,b,\alpha) minw,bL(w,b,α) α \alpha α 的极大:

等价于式 ( 17 ) (17) (17) α \alpha α 求极大,等价于取负数后求极小,即
min ⁡ α 1 2 ∑ i = 1 m ∑ i = j m a i a j y i y j x i T x j − ∑ i = 1 m a i s . t . ∑ i = 1 m a i y i = 0 α i ≥ 0 , i = 1 , 2 , . . . , n \min_{\alpha} \frac{1}{2}\sum_{i=1}^{m} \sum_{i=j}^{m}a_i a_j y_i y_j x_i^T x_j - \sum_{i=1}^{m}a_i \\ s.t. \sum_{i=1}^{m} a_i y_i = 0 \\ \alpha_i \geq 0, i =1, 2, ..., n αmin21i=1mi=jmaiajyiyjxiTxji=1mais.t.i=1maiyi=0αi0,i=1,2,...,n
于是,得到了原始最优化问题 ( 6 ) (6) (6) 和对偶最优化问题 ( 18 ) (18) (18)


假设已经求得式 ( 18 ) (18) (18) 一个最优解 α ^ i \hat{\alpha}_i α^i,则根据式 ( 14 ) (14) (14) 可求得最优 w ^ \hat{w} w^
w ^ = ∑ i = 1 m a i ^ y i x i \hat{w} = \sum_{i=1}^{m} \hat{a_i}y_ix_i w^=i=1mai^yixi
因为至少存在以一个 α ^ i > 0 \hat{\alpha}_i > 0 α^i>0 (若 α ^ i \hat{\alpha}_i α^i 全为0,则 w ^ = 0 \hat{w} = 0 w^=0, 即 m a r g i n = 2 ∣ ∣ w ∣ ∣ = ∞ margin = \frac{2}{||w||} = \infty margin=w2=, 显然不行),再根据KKT条件,即
{ 乘 子 非 负 : a i ≥ 0 约 束 条 件 : y i ( w T x + b ) − 1 ≥ 0 互 补 条 件 : α i ( y i ( w T + b ) − 1 ) = 0 \begin{cases} 乘子非负:a_i \geq 0 \\ 约束条件:y_i(w^Tx + b) - 1 \geq 0 \\ 互补条件:\alpha_i (y_i (w^T + b) - 1) = 0 \end{cases} ai0yi(wTx+b)10αi(yi(wT+b)1)=0
所以至少存在以一个 j j j, 使得 y i ( w T x + b ) − 1 = 0 y_i(w^Tx + b) - 1 = 0 yi(wTx+b)1=0, 即可求得最优 b ^ \hat{b} b^:
b ^ = 1 y j − w ^ T x = y j − w ^ T x = y j − ∑ i = 1 m a ^ i y i x j T x i \hat{b} = \frac{1}{y_j} - \hat{w}^Tx \\ = y_j - \hat{w}^Tx \\ = y_j- \sum_{i=1}^{m} \hat{a}_iy_ix_j^Tx_i b^=yj1w^Tx=yjw^Tx=yji=1ma^iyixjTxi
综上,整个线性可分SVM的解可被求得,求得的分离超平面为:
∑ i = 1 m α ^ i y i x T x i + b ^ = 0 \sum_{i=1}^{m} \hat{\alpha}_i y_i x^T x_i + \hat{b} = 0 i=1mα^iyixTxi+b^=0
其分类的决策函数为:
f ( x ) = s i g n ( ∑ i = 1 m α ^ i y i x T x i + b ^ ) f(x) = sign(\sum_{i=1}^{m} \hat{\alpha}_i y_i x^T x_i + \hat{b}) f(x)=sign(i=1mα^iyixTxi+b^)

3.线性SVM–软间隔

若训练数据式严格线性可分的,即存在一个超平面能完全将两类数据分开,则为硬间隔。但现实中这种情况比较少,更多的是这样的情况:

在这里插入图片描述

3.1 软间隔最大化

为了解决该问题,允许SVM在少量样本上出错,即将之前的硬间隔最大化条件放松一点,引入“软间隔”。

为了是不满足约束条件的样本点尽可能少,在优化目标函数中增加一个对这些项的惩罚。最常用的是 h i n g e hinge hinge 损失:
l h i n g e ( z ) = m a x ( 0 , 1 − z ) l_{hinge}(z) = max(0,1-z) lhinge(z)=max(0,1z)
即若样本满足约束条件,损失为 0 0 0,若不满足约束条件,损失则为 1 − z 1-z 1z, 于是目标函数变为:
min ⁡ w , b 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m m a x ( 0 , 1 − y i ( w T x + b ) ) \min_{w,b} {\frac{1}{2} ||w||^2} + C\sum_{i=1}^{m} max(0,1-y_i(w^T x + b)) w,bmin21w2+Ci=1mmax(0,1yi(wTx+b))
其中 C > 0 C>0 C>0 称为惩罚参数, C C C越小时对误分类惩罚越小,越大时对误分类惩罚越大,当 C C C 趋向 ∞ \infty 时就变成了硬间隔。实际应用时需要合理取 C C C, C C C越小越容易欠拟合, C C C越大越容易过拟合。

引入松弛变量 ξ i ≥ 0 \xi_i \geq 0 ξi0, 式 ( 25 ) (25) (25) 可写为:
min ⁡ w , b , ξ 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i s . t . y i ( w T x + b ) ≥ 1 − ξ i ξ i ≥ 0 , i = 1 , 2 , . . . , m \min_{w,b,\xi} \frac{1}{2}||w||^2 + C\sum_{i=1}^{m}{\xi_i}\\ s.t. y_i(w^Tx + b) \geq 1 - \xi_i\\ \xi_i \geq 0, i = 1, 2,..., m w,b,ξmin21w2+Ci=1mξis.t.yi(wTx+b)1ξiξi0,i=1,2,...,m
上述即为软间隔SVM

3.2对偶问题

与硬间隔SVM相似,可通过拉格朗日乘子转换为对偶问题进行求解:
L ( w , b , α , β ) = 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 m ξ i − ∑ i = 1 m α i [ y i ( w T x + b ) − 1 + ξ i ] − ∑ i = 1 m β i ξ i L(w,b,\alpha,\beta) = \frac{1}{2}||w||^2 + C\sum_{i=1}^{m} \xi_i - \sum_{i=1}^{m}{\alpha_i[y_i(w^Tx + b) - 1 + \xi_i]} - \sum_{i=1}^{m} \beta_i \xi_i L(w,b,α,β)=21w2+Ci=1mξii=1mαi[yi(wTx+b)1+ξi]i=1mβiξi
同上,为了求得对偶问题的解,需要先得 L ( w , b , α , β ) L(w,b,\alpha,\beta) L(w,b,α,β) w w w b b b ξ \xi ξ 的极小再求对 α \alpha α β \beta β 的极大。

1)求 min ⁡ w , b , ξ L ( w , b , ξ , α , β ) \min_{w,b,\xi}L(w,b,\xi,\alpha,\beta) minw,b,ξL(w,b,ξ,α,β): 将 L ( w , b , ξ , α , β ) L(w,b,\xi,\alpha,\beta) L(w,b,ξ,α,β)分别对 w 、 b 和 ξ w、b和\xi wbξ 求偏导并为零可得:
w = ∑ i = 1 m α i y i x i w = \sum_{i=1}^{m}{\alpha_i y_i x_i} w=i=1mαiyixi

∑ i = 1 m α i y i = 0 \sum_{i=1}^{m}{\alpha_i y_i} = 0 i=1mαiyi=0

C = α i + β i C = \alpha_i + \beta_i C=αi+βi

将上面三式代入式 ( 27 ) (27) (27)得:
min ⁡ w , b , ξ L ( w , b , ξ , α , β ) = − 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j + ∑ i = 1 m α i \min_{w,b,\xi}L(w,b,\xi,\alpha,\beta) = -\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m} {\alpha_i \alpha_j y_i y_j x_i^T x_j} + \sum_{i=1}^{m} \alpha_i w,b,ξminL(w,b,ξ,α,β)=21i=1mj=1mαiαjyiyjxiTxj+i=1mαi
其中, β \beta β 被消去

  1. min ⁡ w , b , ξ L ( w , b , ξ , α , β ) \min_{w,b,\xi}L(w,b,\xi,\alpha,\beta) minw,b,ξL(w,b,ξ,α,β) α \alpha α 极大,等价于对式 ( 31 ) (31) (31) 取负后求极小,即
    min ⁡ α 1 2 ∑ i = 1 m ∑ j = 1 m α i α j y i y j x i T x j − ∑ i = 1 m α i s . t . ∑ i = 1 m α i y i = 0 0 ≤ α i ≤ C , i = 1 , 2 , . . . , m \min_{\alpha} \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m} {\alpha_i \alpha_j y_i y_j x_i^T x_j} - \sum_{i=1}^{m} \alpha_i \\ s.t. \sum_{i=1}^{m} \alpha_i y_i = 0\\ 0 \leq \alpha_i \leq C, i=1,2,...,m αmin21i=1mj=1mαiαjyiyjxiTxji=1mαis.t.i=1mαiyi=00αiC,i=1,2,...,m
    类似的,假设已经通过通用的二次规划求解方法或者SMO算法求得了式 ( 32 ) (32) (32) 的最优解 α ^ \hat{\alpha} α^, 则可根据式 ( 28 ) (28) (28) 求解最优 w ^ \hat{w} w^:
    w ^ = ∑ i = 1 m α ^ y i x i \hat{w} = \sum_{i=1}^{m} \hat{\alpha} y_i x i w^=i=1mα^yixi
    再根据KKT条件,即
    { 乘 子 非 负 : a i ≥ 0 , β i ≥ 0 约 束 条 件 : y i ( w T x + b ) − 1 ≥ ξ i 互 补 条 件 : α i ( y i ( w T + b ) − 1 + ξ i ) = 0 , β i ξ i = 0 \begin{cases} 乘子非负:a_i \geq 0, \beta_i \geq 0 \\ 约束条件:y_i(w^Tx + b) - 1 \geq \xi_i \\ 互补条件:\alpha_i (y_i (w^T + b) - 1 + \xi_i) = 0, \beta_i \xi_i = 0 \end{cases} ai0,βi0yi(wTx+b)1ξiαi(yi(wT+b)1+ξi)=0,βiξi=0
    于是可求得整个软间隔SVM的解,即:
    w ^ = ∑ i ∈ S V α ^ y i x i \hat{w} = \sum_{i \in SV} \hat{\alpha} y_i x_i w^=iSVα^yixi

β ^ = y j − ∑ i ∈ S V α ^ y i x i T x i \hat{\beta} = y_j - \sum_{i \in SV}\hat{\alpha} y_i x_i^T x_i β^=yjiSVα^yixiTxi

其中, j j j 满足 0 < α ^ j < C 0 < \hat{\alpha}_j < C 0<α^j<C

对于任意样本,若 α i = 0 \alpha_i = 0 αi=0, 则此样本点不是支持向量,若 α i = 0 \alpha_i = 0 αi=0, 则此样本点是一个支持向量。

4.非线性SVM–核技巧

在遇到非线性问题时,需要采用核技巧将线性SVM推广到非线性SVM。

核技巧基本思路:

  1. 使用一个变换将原空间的数据映射到新空间(例如更高维),
  2. 在新空间中采用线性方法从训练数据中学习得到模型

在这里插入图片描述

4.1 核函数

核函数定义:

χ \chi χ 是输入空间 (欧氏空间 R n R^n Rn 的子集或离散集合),又设 H \mathcal{H} H 是特征空间(希尔伯特空间),如果存在一个 χ \chi χ H \mathcal{H} H的映射 ϕ ( x ) : χ → H \phi(x): \chi \rightarrow \mathcal{H} ϕ(x):χH 使得对所有 x , z ∈ χ x,z \in \chi x,zχ,函数 K ( x , z ) \mathcal{K}(x,z) K(x,z) 满足条件 K ( x , z ) = ϕ ( x ) ⋅ ϕ ( z ) \mathcal{K}(x,z) = \phi(x) \cdot \phi(z) K(x,z)=ϕ(x)ϕ(z). 则称 K ( x , z ) \mathcal{K}(x,z) K(x,z) 为核函数, ϕ ( x ) \phi(x) ϕ(x) 为映射函数,式中 ϕ ( x ) ⋅ ϕ ( z ) \phi(x) \cdot \phi(z) ϕ(x)ϕ(z) 为 $\phi(x) $ 和 ϕ ( z ) \phi(z) ϕ(z) 的内积。

常用核函数
在这里插入图片描述

4.2 非线性SVM

在这里插入图片描述

5.总结

SVM优点:

  1. 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优。
  2. 不仅适用于线性线性问题还适用于非线性问题(用核技巧)。
  3. 拥有高维样本空间的数据也能用SVM,这是因为数据集的复杂度只取决于支持向量而不是数据集的维度,这在某种意义上避免了“维数灾难”。
  4. 理论基础比较完善(例如神经网络就更像一个黑盒子)。

SVM缺点:

  1. 二次规划问题求解将涉及m阶矩阵的计算(m为样本的个数), 因此SVM不适用于超大数据集。(SMO算法可以缓解这个问题)
  2. 只适用于二分类问题。(SVM的推广SVR也适用于回归问题;可以通过多个SVM的组合来解决多分类问题)
  3. 对缺失数据敏感,对参数和核函数的选择敏感

5.基于sklearn的SVM

5.1 线性SVM

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 实例化数据集
X,y = make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)

# 绘图函数
def plot_svc_decision_function(model,ax=None):
    if ax is None:
        ax = plt.gca()
    # 获取两坐标轴的最大值和最小值
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    
    x = np.linspace(xlim[0],xlim[1],30)
    y = np.linspace(ylim[0],ylim[1],30)
    Y,X = np.meshgrid(y,x)
    xy = np.vstack([X.ravel(), Y.ravel()]).T
    P = model.decision_function(xy).reshape(X.shape)
    
    ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

#线性SVM
clf = SVC(kernel = "linear").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
plot_svc_decision_function(clf)

clf.predict(X)
#根据决策边界,对X中的样本进⾏分类,返回的结构为n_samples
clf.score(X,y)
#返回给定测试数据和标签的平均准确度
clf.support_vectors_
#返回⽀持向量
clf.n_support_
#返回每个类中⽀持向量的个数

在这里插入图片描述

5.2 非线性SVM

from sklearn.datasets import make_circles
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 创建环形数据
X,y = make_circles(100,factor=0.1,noise=.1)

#线性SVM并不能很好处理非线性情况
clf = SVC(kernel='linear').fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
plot_svc_decision_function(clf)

# 改变核函数
clf = SVC(kernel='rbf',gamma='auto').fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
plot_svc_decision_function(clf)

在这里插入图片描述

在这里插入图片描述

5.3 不同核函数在不同数据集表现

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import svm
from sklearn.datasets import make_circles, make_moons,make_blobs,make_classification

# 构造数据集
n_samples = 100
datasets = [
            make_moons(n_samples=n_samples, noise=0.2, random_state=0),
            make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
            make_blobs(n_samples=n_samples, centers=2, random_state=5),
            make_classification(n_samples=n_samples,n_features =2,
                                n_informative=2,n_redundant=0, random_state=5)
            ]

Kernel = ["linear","poly","rbf","sigmoid"]

#构建⼦图
nrows=len(datasets)
ncols=len(Kernel) + 1
fig, axes = plt.subplots(nrows, ncols,figsize=(20,16))

# 开始进⾏⼦图循环
#第⼀层循环:在不同的数据集中循环
for ds_cnt, (X,Y) in enumerate(datasets):
    #在图像中的第⼀列,放置原数据的分布
    ax = axes[ds_cnt, 0]
    if ds_cnt == 0:
        ax.set_title("Input data")
    ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10,
                cmap=plt.cm.Paired,edgecolors='k')
    ax.set_xticks(())
    ax.set_yticks(())
    
    #第⼆层循环:在不同的核函数中循环
    #从图像的第⼆列开始,⼀个个填充分类结果
    for est_idx, kernel in enumerate(Kernel):
        #定义⼦图位置
        ax = axes[ds_cnt, est_idx + 1]
        #建模
        clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y)
        score = clf.score(X, Y)
        #绘制图像本身分布的散点图
        ax.scatter(X[:, 0], X[:, 1], c=Y
                    ,zorder=10
                    ,cmap=plt.cm.Paired,edgecolors='k')
        #绘制⽀持向量
        ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],s=50,
                    facecolors='none', zorder=10, edgecolors='k')
        #绘制决策边界
        x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
        y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
        
        XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
        #np.c_,类似于np.vstack的功能
        Z = clf.decision_function(np.c_[XX.ravel(),
                                  YY.ravel()]).reshape(XX.shape)
        #填充等⾼线不同区域的颜⾊
        ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
        #绘制等⾼线
        ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-','--'],
                   levels=[-1, 0, 1])
        #设定坐标轴为不显示
        ax.set_xticks(())
        ax.set_yticks(())
        
        #将标题放在第⼀⾏的顶上
        if ds_cnt == 0:
            ax.set_title(kernel)
        #为每张图添加分类的分数
        ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0')
                , size=15
                , bbox=dict(boxstyle='round', alpha=0.8, facecolor='white')
                #为分数添加⼀个⽩⾊的格⼦作为底⾊
                , transform=ax.transAxes #确定⽂字所对应的坐标轴,就是ax⼦图的坐标轴本身
                , horizontalalignment='right' #位于坐标轴的什么⽅向
                )
plt.tight_layout()
plt.show()

在这里插入图片描述

5.4 使用网格搜索法调参

from sklearn import svm
from sklearn.model_selection import GridSearchCV
from tensorflow.keras.datasets import mnist #手写数字
from sklearn.metrics import classification_report

# 导入手写数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()
#reshape 转成一维向量 28*28=784
x_train = x_train.reshape(60000,784).astype('float32')
x_test = x_test.reshape(10000,784).astype('float32')
# 归一化
x_train = x_train / 255
x_test = x_test / 255

# 设置参数
C = [0.1,0.2,0.5,0.8,1]
kernel = 'rbf'
gamma = [0.001,0.01,0.03,0.1,0.5,1]

# 构建参数字典
param_dict = {
    'C':C,
    'gamma':gamma
}

# 创建SVC实例
svc = svm.SVC(kernel=kernel)

# 网格搜索
gsCV = GridSearchCV(svc,
                    param_grid=param_dict,
                    n_jobs=-1,
                    scoring='r2',
                    cv=6)

gsCV.fit(x_train[:5000],y_train[:5000])

# 输出参数信息
# 最佳得分
gsCV.best_score_ # 0.9154796676634541
# 最优参数
gsCV.best_params_ # {'C': 1, 'gamma': 0.03}


# 用最佳参数实例化模型
svc = svm.SVC(C=gsCV.best_params_['C'],
              kernel= kernel,
              gamma= gsCV.best_params_['gamma'])
svc.fit(x_train[:1000],y_train[:1000])
svc_predict = svc.predict(x_test)
svc_metric = classification_report(y_test,svc_predict)
print(svc_metric)


# 				precision    recall  f1-score   support
#
#           0       0.94      0.97      0.95       980
#           1       0.98      0.98      0.98      1135
#           2       0.86      0.93      0.89      1032
#           3       0.95      0.85      0.90      1010
#           4       0.88      0.92      0.90       982
#           5       0.84      0.92      0.88       892
#           6       0.95      0.89      0.92       958
#           7       0.93      0.91      0.92      1028
#           8       0.93      0.84      0.88       974
#           9       0.87      0.89      0.88      1009
#
#    accuracy                           0.91     10000
#   macro avg       0.91      0.91      0.91     10000
#weighted avg       0.91      0.91      0.91     10000

6.参考

1.《机器学习》

2.https://mp.weixin.qq.com/s/dYWYdnGN9YDzzvbNyKG9pA


仅作学习笔记使用,侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值