机器学习实战(SVM)

目录

SVM原理概述

Sklearn实现SVM

 线性SVM分类

非线性SVM分类

使用多项式特征来增加特征

内核的使用


SVM原理概述

这里不对SVM原理进行详细推导,只对SVM进行简单介绍

SVM要解决的就是最优化问题,最优化基本型为:

\bg_white \fn_jvn \large \min_{w,b} \frac{1}{2}||w||^{2}

s.t. y_{i}(w^{T}x_{i}+b)\geq 1, i=1,2,...m

软间隔就是允许支持向量机在一些样本上出错。软间隔的基本为:

\bg_white \fn_jvn \large \min_{w,b} \frac{1}{2}||w||^{2}+loss

三种常用的替代损失函数:

hinge损失l_{hinge}(z)=max(0,1-z)
指数损失(exponential loss)l_{exp}(z)=exp(-z)
对率损失(logistic loss)l_{log}(z)=log(1+exp(-z))

对偶问题的引入是为了能够更加高效的求解这个最优化问题。

核函数的引入:低维上的数据难以区分,所以上升到高维上进行分解。如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使得样本可分。

核函数要干的事情就是将低维上的数据映射到高维上。

常见的核函数有:

名称表达式参数
线性核k(x_{i},x_{j})=x_{i}^{T}x_{j}
多项式核k(x_{i},x_{j})=(x_{i}^{T}x_{j})^{d}d>=1为多项式的次数
高斯核k(x_{i},x_{j})=exp(-\frac{||x_{i}-x_{j}||^{2}}{2\delta ^{2}})\delta>0为高斯核的带宽(width)
拉普拉斯核k(x_{i},x_{j})=exp(-\frac{||x_{i}-x_{j}||}{\delta})\delta >0
Sigmoid核k(x_{i},x{j})=tanh(\beta x_{i}^{T}x_{j}+\theta )tanh为双曲正切函数,\beta >0,\theta <0

这里没对SVM具体原理进行说明,详细可以了解B站大神:机器学习SVM

Sklearn实现SVM

 线性SVM分类

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris = datasets.load_iris()
x=iris['data'][:,(2,3)]
y=(iris['target']==2).astype(np.float64)
svm_clf=Pipeline([('scaler',StandardScaler()),('linear_svc',LinearSVC(C=1,loss='hinge'))])
svm_clf.fit(x,y)

非线性SVM分类

虽然在很多情况下,线性SVM分类器是有效的,并且通常出人意料的好,但是有时候数据集不是线性可分的。处理非线性数据集的方法之一就是添加更多特征,比如多项式特征。

使用多项式特征来增加特征

from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
x,y=make_moons(n_samples=100,noise=0.15)
polynomial_svm_clf=Pipeline([('poly_features',PolynomialFeatures(degree=3)),('scaler',StandardScaler()),('svm_clf',LinearSVC(C=10,loss='hinge'))])
polynomial_svm_clf.fit(x,y)

内核的使用

添加多项式特征实现起来很简单,并且对于所有的机器学习算法(不只是SVM)都非常有效。但问题是,如果多项式太低阶,则处理不了非常复杂的数据集。而高阶则会创造出大量的特征,导致模型变得太慢
幸运的是在使用SVM时,有一个魔术般的数学技巧可以应用,这就是核技巧。它产生的结果跟添加了很多多项式特征一样,但实际上并不需要真正的添加。因为实际上并没有添加任何特征,所以不存在数量爆炸的组合特征。这个技巧由SVC类来实现。

#多项式内核
from sklearn.svm import SVC
#coef0用来控制模型收到高阶多项式还是低阶多项式影响的程度
poly_kernel_svm_clf=Pipeline([('scaler',StandardScaler()),('svm_clf',SVC(kernel='poly',coef0=1,C=5))])
poly_kernel_svm_clf.fit(x,y)
#高斯RBF内核
#gamma参数就像是一个正则化超参数:模型过拟合,就降低它的值,如果欠拟合则提升它的值
rbf_kernel_svm_clf=Pipeline([('scaler',StandardScaler()),('svm_clf',SVC(kernel='rbf',gamma=5,C=0.001))])
rbf_kernel_svm_clf.fit(x,y)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值