目录
SVM原理概述
这里不对SVM原理进行详细推导,只对SVM进行简单介绍
SVM要解决的就是最优化问题,最优化基本型为:
软间隔就是允许支持向量机在一些样本上出错。软间隔的基本为:
三种常用的替代损失函数:
hinge损失 | |
指数损失(exponential loss) | |
对率损失(logistic loss) |
对偶问题的引入是为了能够更加高效的求解这个最优化问题。
核函数的引入:低维上的数据难以区分,所以上升到高维上进行分解。如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使得样本可分。
核函数要干的事情就是将低维上的数据映射到高维上。
常见的核函数有:
名称 | 表达式 | 参数 |
---|---|---|
线性核 | ||
多项式核 | d>=1为多项式的次数 | |
高斯核 | >0为高斯核的带宽(width) | |
拉普拉斯核 | ||
Sigmoid核 | tanh为双曲正切函数, |
这里没对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)