数据分析 | SVM模型

一、模型介绍

01 超平面

在一维空间中,若需要将数据切分为两段,只需要一点即可;在二维空间中,对于线性可分的样本,将其切分为两类只需一条直线即可;在三维空间中,将样本切分开来,就需要一个平面。

img

02 距离计算

点到线的距离:
d = ∣ A x 0 + B y 0 + C ∣ A 2 + B 2 d=\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}} d=A2+B2 Ax0+By0+C
平行线间的距离:
d = ∣ C 1 − C 2 ∣ A 2 + B 2 d=\frac{|C_1-C_2|}{\sqrt{A^2+B^2}} d=A2+B2 C1C2

03 SVM模型思想

img

假设上图中间红线 l l l为分割面,为了使其达到最优,有以下三个步骤:

  1. 计算左右两个类别中的样本点到直线的距离
  2. 从两组距离中各挑选出一个最短的 d 1 d_1 d1 d 2 d_2 d2;继续比较 d 1 d_1 d1 d 2 d_2 d2,选出其中最短的,以该距离构造分隔带
  3. 利用无穷多个分割直线 l i l_i li,构造无穷多个“分隔带”,并从这些分隔带中挑选出宽最大的 l l l

分隔带:

“分隔带”代表了模型划分样本点的能力和可信度,“分隔带”越宽,说明模型能够将样本点划分得越清晰,进而保证模型的泛化能力越强。

目标函数:
J ( w , b , i ) = a r g w , b m a x m i n ( d i ) J(w,b,i)=arg_{w,b}maxmin(d_i) J(w,b,i)=argw,bmaxmin(di)
其中, d i d_i di表示样本点i到某条固定分割面的距离; m i n ( d i ) min(d_i) min(di)表示所有样本点与某个分割面之间距离的最小值; a r g w , b m a x m i n ( d i ) arg_{w,b}maxmin(d_i) argw,bmaxmin(di)表示从所有分割面中寻找“分割带”最宽的“超平面”;其中 w , b w,b w,b代表线性分割面的参数。

上图所示,将五角星和圆点分别表示负例样本和正例样本,两条虚线与分割面 w ′ x + b = 0 w'x+b=0 wx+b=0平行,虚线分别表示因变量y取值为-1和+1的情况。

那么,不管是五角星还是圆点,这些样本点均落在两条虚线之上或之外,则说明这些点带人方程 w ′ x + b w'x+b wx+b所得绝对值一定大于等于1.

进而说明若某一样本点取值越小于-1,则该样本为负例的可能性越高;点对应的取值越大于+1,样本为正例的可能性越高。
γ i ^ = y i × ( w ′ x i + b ) \hat{\gamma_i}=y_i\times(w'x_i+b) γi^=yi×(wxi+b)
其中, y i y_i yi表示样本的所属类别,用-1和+1表示。故利用上述公式即可得到线性可分的SVM所对应的函数间隔满足 γ ^ ≥ 1 \hat{\gamma}\geq1 γ^1的条件。

当分割面中的参数w和b同比例增加时,所对应的 γ i ^ \hat{\gamma_i} γi^值也会同比例增加,但这样的增加对分割面 w ′ x + b = 0 w'x+b=0 wx+b=0来说却丝毫没有影响。因此,为了避免上述问题,需要对函数间隔做约束,例如单位化处理:
γ i ^ = γ i ^ ∥ w ∥ = y i × ( w ′ x i + b ) ∥ w ∥ = ∣ w ′ x i + b ∣ ∥ w ∥ = d i \hat{\gamma_i}=\frac{\hat{\gamma_i}}{\|w\|}=\frac{y_i\times(w'x_i+b)}{\|w\|}=\frac{|w'x_i+b|}{\|w\|}=d_i γi^=wγi^=wyi×(wxi+b)=wwxi+b=di

二、线性可分SVM模型

01 目标函数

J ( w , b , i ) = a r g w , b m a x m i n ( d i ) = a r g w , b m a x 1 ∥ w ∥ m i n ( y i × ( w ′ x i + b ) ) = a r g w , b m a x 1 ∥ w ∥ m i n ( γ i ^ ) J(w,b,i)=arg_{w,b}maxmin(d_i)=arg_{w,b}max\frac{1}{\|w\|}min(y_i\times(w'x_i+b))=arg_{w,b}max\frac{1}{\|w\|}min(\hat{\gamma_i}) J(w,b,i)=argw,bmaxmin(di)=argw,bmaxw1min(yi×(wxi+b))=argw,bmaxw1min(γi^)

γ i ^ \hat{\gamma_i} γi^满足大于等于1,故可将目标函数等价为如下表达式:
{ m a x 1 ∥ w ∥ s . t .    y i × ( w ′ x i + b ) ≥ 1 \begin{cases}max\frac{1}{\|w\|}\\s.t.\ \ y_i\times(w'x_i+b)\geq1\end{cases} {maxw1s.t.  yi×(wxi+b)1
由于最大化 1 ∥ w ∥ \frac{1}{\|w\|} w1与最小化 1 2 ∥ w ∥ 2 \frac{1}{2}\|w\|^2 21w2等价,故可以将上面的表达式重新表示为:
{ m i n 1 2 ∥ w ∥ 2 s . t .    y i × ( w ′ x i + b ) ≥ 1 \begin{cases}min\frac{1}{2}\|w\|^2\\s.t.\ \ y_i\times(w'x_i+b)\geq1\end{cases} {min21w2s.t.  yi×(wxi+b)1

02 拉格朗日乘子法

假设存在一个需要最小化的目标函数f(x),并且该目标函数同时受到g(x)<=0的约束。如需要得到最优解,则需要利用拉格朗日对偶性将原始的最优化问题转换为对偶问题,即:
m i n ( f ( x ) ) = m i n x m a x λ ( L ( x , λ ) ) = m i n x m a x λ ( f ( x ) + ∑ i = 1 k λ i g i ( x ) ) = m a x λ m i n x ( f ( x ) + ∑ i = 1 k λ i g 1 ( x ) ) min(f(x))=min_xmax_\lambda(L(x,\lambda))=min_xmax_\lambda(f(x)+\sum_{i=1}^k\lambda_ig_i(x))=max_\lambda min_x(f(x)+\sum_{i=1}^k\lambda_ig_1(x)) min(f(x))=minxmaxλ(L(x,λ))=minxmaxλ(f(x)+i=1kλigi(x))=maxλminx(f(x)+i=1kλig1(x))
其中, f ( x ) + ∑ i = 1 k λ i g i ( x ) f(x)+\sum_{i=1}^k\lambda_ig_i(x) f(x)+i=1kλigi(x)为拉格朗日函数; λ i \lambda_i λi为拉格朗日乘子,且 λ i > 0 \lambda_i>0 λi>0

基于上述求解方法,目标函数:
m i n 1 2 ∥ w ∥ 2 = m a x α m i n w , b ( L ( w , b , α i ) ) = m a x α m i n w , b ( 1 2 ∥ w ∥ 2 + ∑ i = 1 n α i ( 1 − y i × ( w ′ x i + b ) ) ) min\frac{1}{2}\|w\|^2=max_\alpha min_{w,b}(L(w,b,\alpha_i))=max_\alpha min_{w,b}(\frac{1}{2}\|w\|^2+\sum_{i=1}^n\alpha_i(1-y_i\times(w'x_i+b))) min21w2=maxαminw,b(L(w,b,αi))=maxαminw,b(21w2+i=1nαi(1yi×(wxi+b)))
其中,
g ( x ) = 1 − y i × ( w ′ x i + b ) g(x)=1-y_i\times(w'x_i+b) g(x)=1yi×(wxi+b)
进一步化简得:
m i n 1 2 ∥ w ∥ 2 = m a x α m i n w , b ( 1 2 ∥ w ∥ 2 + ∑ i = 1 n α i − ∑ i = 1 n α i y i ( w ′ x i + b ) ) min\frac{1}{2}\|w\|^2=max_\alpha min_{w,b}(\frac{1}{2}\|w\|^2+\sum_{i=1}^n\alpha_i-\sum_{i=1}^n\alpha_iy_i(w'x_i+b)) min21w2=maxαminw,b(21w2+i=1nαii=1nαiyi(wxi+b))
求偏导:
{ ∂ L ( w , b , α ) ∂ w = w − ∑ i = 1 n a i y i x i = 0 ∂ L ( w , b , α ) ∂ b = ∑ i = 1 n α i y i = 0 \begin{cases}\frac{\partial L(w,b,\alpha)}{\partial w}=w-\sum_{i=1}^na_iy_ix_i=0\\\frac{\partial L(w,b,\alpha)}{\partial b}=\sum_{i=1}^n\alpha_iy_i=0\end{cases} {wL(w,b,α)=wi=1naiyixi=0bL(w,b,α)=i=1nαiyi=0
将导函数反待入目标函数:
m i n 1 2 ∥ w ∥ 2 = m a x α ( − 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ( x i . x j ) + ∑ i = 1 n α i − 0 ) min\frac{1}{2}\|w\|^2=max_\alpha(-\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j(x_i.x_j)+\sum_{i=1}^n\alpha_i-0) min21w2=maxα(21i=1nj=1nαiαjyiyj(xi.xj)+i=1nαi0)
其中, ( x i . x j ) (x_i.x_j) (xi.xj)表示两个样本点的内积,最终根据已知样本点 ( x i , y j ) (x_i,y_j) (xi,yj)计算 1 2 ∑ i = 1 n ∑ j = 1 n α i α j y i y j ( x i . x j ) + ∑ i = 1 n α i − 0 \frac{1}{2}\sum_{i=1}^n\sum_{j=1}^n\alpha_i\alpha_jy_iy_j(x_i.x_j)+\sum_{i=1}^n\alpha_i-0 21i=1nj=1nαiαjyiyj(xi.xj)+i=1nαi0的极小值,并用拉格朗日乘子 α i \alpha_i αi的值计算分割面 w ′ x + b = 0 w'x+b=0 wx+b=0的参数w和b:
{ w ^ = ∑ i = 1 n α i y i x i ^ b ^ = y j − ∑ i = 1 n α i ^ y i ( x i . y j ) \begin{cases}\hat{w}=\sum_{i=1}^n\hat{\alpha_iy_ix_i}\\\hat{b}=y_j-\sum_{i=1}^n\hat{\alpha_i}y_i(x_i.y_j)\end{cases} {w^=i=1nαiyixi^b^=yji=1nαi^yi(xi.yj)

03 代码函数

LinearSVC(tol=0.0001, fit_intercept=True, intercept_scaling=1, class_weight=None, max_iter=1000)

  • tol:指定SVM模型迭代的收敛条件
  • fit_intercept:是否拟合线性“超平面”的截距项,默认为True
  • intercept_scalling:当参数fit_intercept为True时,该参数有效,通过给参数传递一个浮点值,就相当于在自变量X矩阵中添加一2常量数列,默认为1
  • class_weight:用于指定因变量类别的权重,若为字典,则通过字典的形式{class_label:weight}传递每个类别的权重;若为字符串’balanced’,则每个分类的权重与实际样本中 比例成反比,当各分类存在严重不平衡时,设置为’balanced’,则会比较好。
  • max_iter:指定模型求解过程中迭代的最大次数

三、非线性可分SVM模型

01 目标函数

对于非线性SVM模型而言,需要经过两个步骤:首先将原始空间中的样本点映射到高维的新空间中,再在新空间中寻找一个用于识别各类别样本点线性“超平面”。

假设原始空间中的样本点为x,将样本通过某种转换 ϕ ( x ) \phi(x) ϕ(x)映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
{ m i n α ( 1 2 ∑ i = 1 n ) ∑ j = 1 n α i α j y i y j ( ϕ ( x i ) . ϕ ( x j ) − ∑ i = 1 n α i ) s . t .    ∑ i = 1 n α i y i = 0 0 ≤ α i ≤ C \begin{cases}min_\alpha(\frac{1}{2}\sum_{i=1}^n)\sum_{j=1}^n\alpha_i\alpha_jy_iy_j(\phi(x_i).\phi(x_j)-\sum_{i=1}^n\alpha_i)\\s.t.\ \ \sum_{i=1}^n\alpha_iy_i=0\\0\leq\alpha_i\leq C\end{cases} minα(21i=1n)j=1nαiαjyiyj(ϕ(xi).ϕ(xj)i=1nαi)s.t.  i=1nαiyi=00αiC
核函数:

假设原始空间中的两个样本点为 ( x i , x j ) (x_i,x_j) (xi,xj),在其扩展到高维空间后,其内积 ϕ ( x i ) . ϕ ( x j ) \phi(x_i).\phi(x_j) ϕ(xi).ϕ(xj)如果等于样本点在原始空间中某个函数的输出,则称该函数为核函数。常见的核函数有:线性核函数、多项式核函数、高斯核函数、Sigmoid核函数。

02 代码函数

SVC(C=1, kernel='rbf', degree=3, gamma='auto', coef0=0.0, tol=0.001, class_weight=None, verbose=False, max_iter=-1, random_state=None)

  • C:指定目标函数中松弛因子的惩罚系数值,默认为-1
  • kernel:用于指定SVM模型的核函数,'linear’为线性核函数,'poly’为多项式函数,'rbf’为径向基核函数,'sigmoid’为Sigmoid核函数,'precomputed’表示计算一个核矩阵
  • degree:用于指定多项式核函数中p的参数值
  • gamma:用于指定多项式核函数或径向基核函数、Sigmoid核函数中的r参数值
  • coef0:用于指定多项式核函数或Sigmoid核函数中的r参数值

四、代码实现

# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
# 读取外部数据
letters = pd.read_csv(r'letterdata.csv')
# 数据前5行
letters.head()
# 将数据拆分为训练集和测试集
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter, 
                                                                 test_size = 0.25, random_state = 1234)
# 选择线性可分SVM模型
linear_svc = svm.LinearSVC()
# 模型在训练数据集上的拟合
linear_svc.fit(X_train,y_train)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
          intercept_scaling=1, loss='squared_hinge', max_iter=1000,
          multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
          verbose=0)
# 模型在测试集上的预测
pred_linear_svc = linear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test, pred_linear_svc)

out: 0.5802

# 选择非线性SVM模型
nolinear_svc = svm.SVC(kernel='rbf')
# 模型在训练数据集上的拟合
nolinear_svc.fit(X_train,y_train)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
    decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
    kernel='rbf', max_iter=-1, probability=False, random_state=None,
    shrinking=True, tol=0.001, verbose=False)
# 模型在测试集上的预测
pred_svc = nolinear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test,pred_svc)

out: 0.9734

故此数据应采用非线性SVM模型进行拟合。

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ouroboroszzs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值