文章目录
- 4、Support Vector Machine (SVM)
- 4.1、理论部分
- 4.1.1、更优的决策边界
- 4.1.2、解决低维不可分问题
- 4.2、sklearn 实现
- 4.2.1、SVM 分类(SVC)
- 4.2.2、SVM回归(SVR)
- 4.2.3、网格调参
- 4.3、案例
4、Support Vector Machine (SVM)
4.1、理论部分
4.1.1、更优的决策边界
后者更优,决策边界距离数据点越远,越优。
1)距离计算
通过数学计算,表达这个距离最远。
d i s t a n c e ( x , b , w ) = ∣ w T ∣ ∣ w ∣ ∣ ( x − x ′ ) ∣ = 1 ∣ ∣ w ∣ ∣ ∣ w T x + b ∣ (1) distance(x,b,w) = |\frac{w^T}{||w||}(x-x')| = \frac{1}{||w||}|w^Tx+b| \tag{1} distance(x,b,w)=∣∣∣w∣∣wT(x−x′)∣=∣∣w∣∣1∣wTx+b∣(1)
上述公式的推导过程如下:
(w,b)确定一个超平面 wZ+b =0,(Z表示平面上的点)
超平面上有两点x‘,x‘’,则满足:
w T x ′ = − b , w T x ′ ’ = − b w^T x' = -b ,w^T x'’ = -b wTx′=−b,wTx′’=−b
由于:
w ⊥ h y p e r p l a n e w ⊥ hyperplane w⊥hyperplane
则:
w T ( x ′ − x ′ ′ ) = 0 w^T(x'-x'') =0 wT(x′−x′′)=0
点到超平面的距离, 即图中dist(x,h) :
d i s t a n c e = p r o j e c t ( x − x ′ ) t o ⊥ h y p e r p l a n e distance = project(x - x') to ⊥ hyperplane distance=project(x−x′)to⊥hyperplane
进一步整理:
d i s t a n c e ( x , b , w ) = ∣ w T ∣ ∣ w ∣ ∣ ( x − x ′ ) ∣ = 1 ∣ ∣ w ∣ ∣ ∣ w T x + b ∣ distance(x,b,w) = |\frac{w^T}{||w||}(x-x')| = \frac{1}{||w||}|w^Tx+b| distance(x,b,w)=∣∣∣w∣∣wT(x−x′)∣=∣∣w∣∣1∣wTx+b∣
2)数据标签定义
-
数据集: ( X 1 , y 1 ) ( X 2 , y 2 ) ( X 3 , y 3 ) . . . ( X n , y n ) (X_1,y_1)(X_2,y_2)(X_3,y_3)...(X_n,y_n) (X1,y1)(X2,y2)(X3,y3)...(Xn,yn)
-
y的说明:当X为正例时,y =1 , X为负例时,y = -1
-
决策方程: y ( x ) = w T Θ ( x ) + b y(x) = w^TΘ(x) +b y(x)=wTΘ(x)+b,
其中Θ(x) 指的是数据X进行了变换。
y ( X i ) > 0 < − − > y i = + 1 y(X_i)>0 <--> y_i = +1 y(Xi)>0<−−>yi=+1
y ( X i ) < 0 < − − > y i = − 1 y(X_i)<0 <--> y_i = -1 y(Xi)<0<−−>yi=−1
因此,得到这样一个条件:
y i ⋅ y ( x i ) > 0 y_i·y(x_i) > 0 yi⋅y(xi)>0
3)优化目标
①找到这样一条线(w,b)|超平面|决策边界,使得离该线最近的点最远。
再简洁一些,优化决策边界,目标就是找参数w,b。
②对 distance(x,b,w)公式进一步简化,去掉绝对值:
d i s t a n c e ( x , b , w ) = ∣ w T ∣ ∣ w ∣ ∣ ( x − x ′ ) ∣ = 1 ∣ ∣ w ∣ ∣ ∣ w T x + b ∣ distance(x,b,w) = |\frac{w^T}{||w||}(x-x')| = \frac{1}{||w||}|w^Tx+b| distance(x,b,w)=∣∣∣w∣∣wT(x−x′)∣=∣∣w∣∣1∣wTx+b∣
由于 y i ⋅ y ( x i ) > 0 , y ( x ) = w T Θ ( x ) + b y_i·y(x_i) > 0,y(x) = w^TΘ(x) +b yi⋅y(xi)>0,y(x)=wTΘ(x)+b,故distance 简化为:
d i s t a n c e ( x , b , w ) = y i y ( X i ) ∣ ∣ w ∣ ∣ (2) distance(x,b,w)=\frac{y_iy(X_i)}{||w||} \tag{2} distance(x,b,w)=∣∣w∣∣yiy(Xi)(2)
相比较原式多出一个yi,但是yi取值为 ±1,无影响。
4)目标函数
①放缩变换:对于决策方程 y ( x ) = w T Θ ( x ) + b y(x) = w^TΘ(x) +b y(x)=wTΘ(x)+b,通过缩放使得|y|≥1,
即:
y i ( w T Θ ( x ) + b ) ≥ 1 y_i(w^TΘ(x) +b) ≥1 yi(wTΘ(x)+b)≥1
②优化目标函数【最小距中找最远的】:
a r g m a x w , b { 1 ∣ ∣ w ∣ ∣ m i n [ y i ⋅ ( w T Θ ( x ) + b ) ] } (3) argmax_{w,b} \{\frac{1}{||w||}min[yi·(w^TΘ(x) +b)]\} \tag{3} argmaxw,b{∣∣w∣∣1min[yi⋅(wTΘ(x)+b)]}(3)
argmax :什么时候取最大
第①步的目的很明确 m i n [ y i ⋅ ( w T Θ ( x ) + b ) ] = 1 min[yi·(w^TΘ(x) +b)] = 1 min[yi⋅(wTΘ(x)+b)]=1
在保证 y i ( w T Θ ( x ) + b ) ≥ 1 y_i(w^TΘ(x) +b) ≥1 yi(wTΘ(x)+b)≥1条件下,目标函数为:
d i s t a n c e ( w , b ) = a r g m a x w , b 1 ∣ ∣ w ∣ ∣ (4) distance(w,b) =argmax_{w,b}\frac{1}{||w||} \tag{4} distance(w,b)=argmaxw,b∣∣w∣∣1(4)
5)目标函数求解
在4)目标函数中,
约束条件: y i ( w T Θ ( x ) + b ) ≥ 1 y_i(w^TΘ(x) +b) ≥1 yi(wTΘ(x)+b)≥1,
目标函数: d i s t a n c e ( w , b ) = m a x w , b 1 ∣ ∣ w ∣ ∣ distance(w,b) =max_{w,b}\frac{1}{||w||} distance(w,b)=maxw,b∣∣w∣∣1
常规做法:
①将求解极大值问题转换成极小值问题
d i s t a n c e ( w , b ) = m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 (5) distance(w,b) = min_{w,b} \frac{1}{2}||w||^2 \tag{5} distance(w,b)=minw,b21∣∣w∣∣2(5)
(4)->(5),尽管不是等价变换过来的,但都是在求解 w,b 目的上是一致的。
这个系数是随意的,1/2 1/3 都可以。
②带约束的优化问题,拉格朗日乘数法
构造拉格朗日函数,求对w,b偏导为0的解,舍去不合理的解。
带入w,b, wX+b =0 即为最优决策边界。
6)为什么叫支持向量机?
目标函数求解的详细过程中,可以发现w求解过程只受边缘向量(αi≠0)影响,其他向量对w求解毫无约束作用,这些边缘向量就是支持向量|支撑这个面的向量。
拉格朗日乘数法对w求偏导中, w = ∑ i = 1 n α i y i Θ ( x n ) w = \sum\limits_{i=1}^{n}α_iy_iΘ(x_n) w=i=1∑nαiyiΘ(xn)
7)软间隔(soft-margin)
提出软间隔是因为上文的SVM是建立在
y i y ( x i ) ≥ 0 y_iy(x_i)≥0 yiy(xi)≥0
这一条件下,也就是在分类完全正确的前提下去寻找最优决策边界的。这会导致SVM过于严格,在噪音点的影响下,决策边界比较差。显然虚线的更符合预期,现实是那条实线。
所以为了降低噪音点的影响,SVM要降低严格程度,引入松弛因子ξi。
y i y ( x i ) ≥ 1 − ξ i y_iy(x_i)≥1 - ξ_i yiy(xi)≥1−ξi
Tip:手打柯西可以打出ξ 。
新的目标函数:
m i n 1 2 ∣ ∣ w ∣ ∣ 2 + C ∑ i = 1 n ξ i (6) min\frac{1}{2}||w||^2+C\sum\limits_{i=1}^{n}ξ_i \tag{6} min21∣∣w∣∣2+Ci=1∑nξi(6)
C是需要人为指定的参数。
当limit C 很大:ξ 很小,分类严格
limit C很小:ξ 可以很大,分类容忍更大的错误 ,更好地防止过拟合。
指定C多大算大?
交叉验证选择合适的C。
4.1.2、解决低维不可分问题
数据本身难分类怎么办?
低维数据 通过函数【数据映射】到高维。
X i − > Θ ( X i ) X_i->Θ(X_i) Xi−>Θ(Xi)
高维数据的数据源是什么?
来自原来低维数据的组合。
计算多维数据,由于复杂度,实际应用的可行性?
高维数据求内积,维度越高,速度越慢,SVM借鉴了高维计算结果,却是在低维以较小的计算量实现的。
高维数据内积结果 = 原低维数据内积平方。
在低维空间使用核函数实现上述”巧合“。
高斯核函数
K ( X , Y ) = exp { − ∣ ∣ X − Y ∣ ∣ 2 2 σ 2 } K(X,Y) =\exp\{-\frac{||X-Y||^2}{2σ^2}\} K(X,Y)=exp{−2σ2∣∣X−Y∣∣2}
借助高斯核函数SVM具有优秀的非线性决策边界,因此,深度学习前,SVM成为了最热门模型。
4.2、sklearn 实现
#训练模型
from sklearn import svm
#线性Kermel & 较大的C
model = svm.SVC(kernel='linear',C=1E10).fit(X_train,y_train)
res =model.score(X_train,y_train)
print(f"训练数据上的准确率为:{res}")
res= model.score(X_test,y_test)
print(f"测试数据上的准确率为:{res}")
4.2.1、SVM 分类(SVC)
class sklearn.svm.SVC(C = 1.0, #错误样本的惩罚参数
kernel='rbf', #核函数,linear线性、poly多项式、rbf高斯、sigmoid、precomputed自定义
defree=3, #多项式核函数的阶数
gama='auto', #当kernel = rbf || poly || sigmoid, 默认为 1/n_features
coef0=0.0, #kernel 函数常数项
shrinking=True,
probability=False, #是否估计概率,会增加计算时间
tol=0.001 , #误差项达到指定时停止训练,默认为0.001
cache_size=200,
class_weight=None,
verbose-False,
max_iter=-1,
decision_function_shape="ovr",
random_state=None
)
以鸢尾花分类为例,
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
from sklearn.model_selection import train_test_split
#读数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
#鸢尾花属于三分类问题,这里想做SVM二分类,提取出两种花束。
setsoa_or_versicolor = (y==0)|(y==1)
X = X[setsoa_or_versicolor]#X中没有y,但一一对应,y[True]-->X[True],相应的X也就被保留下来了。
y = y[setsoa_or_versicolor]
#标准化
std = StandardScaler()
X_std = std.fit_transform(X)
#拆分训练集
X_train, X_test, y_train, y_test = train_test_split(X_std,y,test_size=0.3,random_state=50)
#SVM建模
clf = SVC()
clf.fit(X_train,y_train)
#模型效果
print(clf.score(X_test,y_test))
执行完 train_test_split() 后target 维数改变了,说明前面的返回序列顺序敲的不对,前两项都是X,后两项都是y。
4.2.2、SVM回归(SVR)
如果不进行标准化,效果会特别差。【下文例子中,标准化前:0.20455436946828742,标准化后:0.6413349923546707】
class sklearn.svm.SVR(C = 1.0, #错误样本的惩罚参数
kernel='rbf', #核函数,linear线性、poly多项式、rbf高斯、sigmoid、precomputed自定义
defree=3, #多项式核函数的阶数
gama='auto', #当kernel = rbf || poly || sigmoid, 默认为 1/n_features
coef0=0.0, #kernel 函数常数项
shrinking=True,
probability=False, #是否估计概率,会增加计算时间
tol=0.001 , #误差项达到指定时停止训练,默认为0.001
cache_size=200,
class_weight=None,
verbose-False,
max_iter=-1,
decision_function_shape="ovr",
random_state=None
)
以波士顿房价预测为例,
from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
from sklearn.model_selection import train_test_split
#读数据
boston = datasets.load_boston()
X = boston.data
y = boston.target
#标准化
std = StandardScaler()
X_std = std.fit_transform(X)
#拆分训练集
X_train, X_test, y_train, y_test = train_test_split(X_std,y,test_size=0.3,random_state=30)
#SVM建模
svr = SVR()
svr.fit(X_train,y_train)
#模型效果
print(svr.score(X_test,y_test))
4.2.3、网格调参
在参数排列组合中找到最好的参数。
1)续上文鸢尾花的案例,
from sklearn.model_selection import GridSearchCV
#定义 参数组合
params = {
'kernel':('linear','rbf','poly'),
'C':[0.01,0.1,0.5,1,2,10,100]
}
#用网格搜索方式拟合模型
model = GridSearchCV(clf,param_grid=params,cv=10)#Cross Validation,简称CV
model.fit(X_std,y)
#查看结果
print('最好的参数组合: ',model.best_params_)
print('最好的score: ',model.best_score_)
最好的参数组合: {‘C’: 0.01, ‘kernel’: ‘linear’}
最好的score: 1.0
2)续上文波士顿房价预测案例,
from sklearn.model_selection import GridSearchCV
#定义 参数组合
params = {
'kernel':('linear','rbf','poly'),
'C':[0.01,0.1,0.5,1,2,10,100]
}
#用网格搜索方式拟合模型
model = GridSearchCV(svr,param_grid=params,cv=10)#Cross Validation,简称CV
model.fit(X_std,y)
#查看结果
print('最好的参数组合: ',model.best_params_)
print('最好的score: ',model.best_score_)
最好的参数组合: {‘C’: 10, ‘kernel’: ‘rbf’}
最好的score: 0.5241088776988833
使用
svr = SVR(C=10,kernel='rbf')
再一次预测结果为 0.8277187266841405
综上,SVM参数、标准化对模型效果影响很大:
未标准化:0.20455436946828742
标准化后:0.6413349923546707
网格调参后:0.8277187266841405
为什么最好的score: 0.5241088776988833
是一个目前遇到的并不算最高的成绩,不因该是最高的成绩吗?
- 网格搜索的参数优化结果可能并不是全局最优的。网格搜索是一种穷举搜索的方法,它可以找到在当前参数范围内的最优解,但是这个最优解可能不是全局最优的,尤其是在参数空间比较大的情况下。因此实际上的搜索还可以缩范围,更加细分
- 十折交叉验证的随机性可能会导致结果的不稳定性。取平均值作为最终结果。
4.3、案例
(待补充)
我心中的TOP1编程语言:python ,为啥?因为我目前最需要它。