首先補充分類問題
SVM不能用于多分類問題赏殃,但我們可以用The “One-vs-One” trick for Multi-Class SVMs
SVR(Support Vector Regression,支持向量回歸)
使用SVR作回歸分析饶氏,與SVM一樣需要找到一個超平面忽孽,不同的是:在SVM中要找出一個間隔(gap)最大的超平面叶洞,而在SVR中是定義一個ε芥牌,定義虛線內(nèi)區(qū)域的數(shù)據(jù)點的殘差為0,而虛線區(qū)域外的數(shù)據(jù)點(支持向量)到虛線的邊界的距離為殘差(ξ)苍凛。與線性模型類似,希望這些殘差(ξ)最斜尽(Minimize)醇蝴。所以大致上來說,SVR就是要找出一個最佳的條狀區(qū)域(2ε寬度)想罕,再對區(qū)域外的點進行回歸悠栓。
線性可分
非線性可分
內(nèi)核函數(shù)將數(shù)據(jù)轉(zhuǎn)換為更高維的特征空間,從而可以執(zhí)行線性分離按价。
隨著 epsilon 增加,該方程被允許遠離數(shù)據(jù)點, 支撐向量減少 惭适,擬合的更差。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.metrics import mean_squared_error,mean_absolute_error
N=50
np.random.seed(0)
x=np.sort(np.random.uniform(0,6,N),axis=0) #訓(xùn)練數(shù)據(jù)集
y=2*np.sin(x)+0.1*np.random.randn(N)
x=x.reshape(-1,1)
svr_rbf=svm.SVR(kernel='rbf',gamma=0.4,C=100) #高斯核函數(shù)
svr_rbf.fit(x,y)
svr_linear=svm.SVR(kernel='linear',C=100) #線性核函數(shù)
svr_linear.fit(x,y)
svr_poly=svm.SVR(kernel='poly',degree=3,C=100) #多項式核函數(shù)
svr_poly.fit(x,y)
x_test=np.sort(np.random.uniform(0,9,N),axis=0)#測試數(shù)據(jù)集
y_test=2*np.sin(x_test)+0.1*np.random.randn(N)
x_test=x_test.reshape(-1,1)
y_rbf=svr_rbf.predict(x_test) #進行預(yù)測
y_linear=svr_linear.predict(x_test)
y_poly=svr_poly.predict(x_test)
plt.figure(figsize=(9,8),facecolor='w')
plt.plot(x_test,y_rbf,'r-',linewidth=2,label='RBF Kernel')
plt.plot(x_test,y_linear,'g-',linewidth=2,label='Linear Kernel')
plt.plot(x_test,y_poly,'b-',linewidth=2,label='Polynomial Kernel')
plt.plot(x,y,'ks',markersize=5,label='train data')
plt.plot(x_test,y_test,'mo',markersize=6,label='test data')
plt.scatter(x[svr_rbf.support_],y[svr_rbf.support_],
s=200,c='r',marker='*',label='RBF Support Vectors',zorder=10)
plt.show()
print("RBF_mean_absolute_error",mean_absolute_error(y_test,y_rbf))
print("RBF_mean_squared_error",mean_squared_error(y_test,y_rbf))
#用網(wǎng)格搜索交叉檢驗來尋找最優(yōu)參數(shù)組合
from sklearn.model_selection import GridSearchCV
model=svm.SVR(kernel='rbf')
c_can=np.linspace(105,107,10)
gamma_can=np.linspace(0.4,0.5,10)
svr_rbf=GridSearchCV(model,param_grid={'C':c_can,'gamma':gamma_can},cv=5)
svr_rbf.fit(x,y)
print(svr_rbf.best_estimator_)
高斯核函數(shù)具有兩個參數(shù):C和gamma楼镐。
C是懲罰系數(shù)癞志,對誤差的寬容度。C值越高框产,說明越不能容忍出現(xiàn)誤差凄杯,容易過擬合。C值越小秉宿,容易欠擬合戒突。
gamma是選擇RBF函數(shù)作為kernel后,該函數(shù)自帶的一個參數(shù)蘸鲸,其隱含地決定了數(shù)據(jù)映射到新的特征空間后的分布,gamma值越大窿锉,支持向量越少酌摇,gamma值越小膝舅,支持向量越多。