目錄
- SVM相關(guān)知識(shí)點(diǎn)回顧
1.1. SVM與SVR
1.2. 核函數(shù)
- sklearn中SVM相關(guān)庫(kù)的簡(jiǎn)介
- 2.1. 分類庫(kù)與回歸庫(kù)
- 2.2. 高斯核調(diào)參
- 2.2.1. 需要調(diào)節(jié)的參數(shù)
- 2.2.2. 調(diào)參方法:網(wǎng)格搜索
- 編程實(shí)現(xiàn)
這是《西瓜書帶學(xué)訓(xùn)練營(yíng)·實(shí)戰(zhàn)任務(wù)》系列的第三篇筆記
1. SVM相關(guān)知識(shí)點(diǎn)回顧
1.1. SVM與SVR
-
SVM分類算法
其原始形式是:
其中m為樣本個(gè)數(shù),我們的樣本為(x1,y1),(x2,y2),...,(xm,ym)。w,b是我們的分離超平面的w??(xi)+b=0系數(shù), ξi為第i個(gè)樣本的松弛系數(shù), C為懲罰系數(shù)。?(xi)為低維到高維的映射函數(shù)
通過拉格朗日函數(shù)以及對(duì)偶化后的形式為:
-
SVR回歸算法
其中m為樣本個(gè)數(shù),我們的樣本為(x1,y1),(x2,y2),...,(xm,ym)。w,b是我們的回歸超平面的w?xi+b=0系數(shù), ξ∨i,ξ∧i為第i個(gè)樣本的松弛系數(shù), C為懲罰系數(shù),?為損失邊界,到超平面距離小于?的訓(xùn)練集的點(diǎn)沒有損失。?(xi)為低維到高維的映射函數(shù)。
1.2. 核函數(shù)
在scikit-learn中,內(nèi)置的核函數(shù)一共有4種:
線性核函數(shù)(Linear Kernel)表達(dá)式為:K(x,z)=x?z,就是普通的內(nèi)積
多項(xiàng)式核函數(shù)(Polynomial Kernel)是線性不可分SVM常用的核函數(shù)之一,表達(dá)式為:K(x,z)=(γx?z+r)d ,其中,γ,r,d都需要自己調(diào)參定義
高斯核函數(shù)(Gaussian Kernel),在SVM中也稱為徑向基核函數(shù)(Radial Basis Function,RBF),它是 libsvm 默認(rèn)的核函數(shù),當(dāng)然也是 scikit-learn 默認(rèn)的核函數(shù)。表達(dá)式為:K(x,z)=exp(?γ||x?z||2), 其中,γ大于0,需要自己調(diào)參定義
Sigmoid核函數(shù)(Sigmoid Kernel)也是線性不可分SVM常用的核函數(shù)之一,表達(dá)式為:K(x,z)=tanh(γx?z+r), 其中,γ,r都需要自己調(diào)參定義
一般情況下,對(duì)非線性數(shù)據(jù)使用默認(rèn)的高斯核函數(shù)會(huì)有比較好的效果,如果你不是SVM調(diào)參高手的話,建議使用高斯核來做數(shù)據(jù)分析。
2. sklearn中SVM相關(guān)庫(kù)的簡(jiǎn)介
scikit-learn SVM算法庫(kù)封裝了libsvm 和 liblinear 的實(shí)現(xiàn),僅僅重寫了算法了接口部分
2.1. 分類庫(kù)與回歸庫(kù)
-
分類算法庫(kù)
包括SVC, NuSVC,和LinearSVC 3個(gè)類
對(duì)于SVC, NuSVC,和LinearSVC 3個(gè)分類的類,SVC和 NuSVC差不多,區(qū)別僅僅在于對(duì)損失的度量方式不同,而LinearSVC從名字就可以看出,他是線性分類,也就是不支持各種低維到高維的核函數(shù),僅僅支持線性核函數(shù),對(duì)線性不可分的數(shù)據(jù)不能使用
-
回歸算法庫(kù)
包括SVR, NuSVR,和LinearSVR 3個(gè)類
同樣的,對(duì)于SVR, NuSVR,和LinearSVR 3個(gè)回歸的類, SVR和NuSVR差不多,區(qū)別也僅僅在于對(duì)損失的度量方式不同。LinearSVR是線性回歸,只能使用線性核函數(shù)
2.2. 高斯核調(diào)參
2.2.1. 需要調(diào)節(jié)的參數(shù)
-
SVM分類模型
如果是SVM分類模型,這兩個(gè)超參數(shù)分別是懲罰系數(shù)C和RBF核函數(shù)的系數(shù)γ
懲罰系數(shù)C
它在優(yōu)化函數(shù)里主要是平衡支持向量的復(fù)雜度和誤分類率這兩者之間的關(guān)系,可以理解為正則化系數(shù)
當(dāng)C比較大時(shí),我們的損失函數(shù)也會(huì)越大,這意味著我們不愿意放棄比較遠(yuǎn)的離群點(diǎn)。這樣我們會(huì)有更加多的支持向量,也就是說支持向量和超平面的模型也會(huì)變得越復(fù)雜,也容易過擬合
當(dāng)C比較小時(shí),意味我們不想理那些離群點(diǎn),會(huì)選擇較少的樣本來做支持向量,最終的支持向量和超平面的模型也會(huì)簡(jiǎn)單
scikit-learn中默認(rèn)值是1
C越大,泛化能力越差,易出現(xiàn)過擬合現(xiàn)象;C越小,泛化能力越好,易出現(xiàn)過欠擬合現(xiàn)象
BF核函數(shù)的參數(shù)γ
RBF 核函數(shù)K(x,z)=exp(?γ||x?z||2) γ>0
γ主要定義了單個(gè)樣本對(duì)整個(gè)分類超平面的影響
當(dāng)γ比較小時(shí),單個(gè)樣本對(duì)整個(gè)分類超平面的影響比較小,不容易被選擇為支持向量
當(dāng)γ比較大時(shí),單個(gè)樣本對(duì)整個(gè)分類超平面的影響比較大,更容易被選擇為支持向量,或者說整個(gè)模型的支持向量也會(huì)多
scikit-learn中默認(rèn)值是
1/樣本特征數(shù)
γ越大,訓(xùn)練集擬合越好,泛化能力越差,易出現(xiàn)過擬合現(xiàn)象
如果把懲罰系數(shù)C和RBF核函數(shù)的系數(shù)γ一起看,當(dāng)C比較大, γ比較大時(shí),我們會(huì)有更多的支持向量,我們的模型會(huì)比較復(fù)雜,容易過擬合一些。如果C比較小 , γ比較小時(shí),模型會(huì)變得簡(jiǎn)單,支持向量的個(gè)數(shù)會(huì)少
-
SVM回歸模型
SVM回歸模型的RBF核比分類模型要復(fù)雜一點(diǎn),因?yàn)榇藭r(shí)我們除了懲罰系數(shù)C和RBF核函數(shù)的系數(shù)γ之外,還多了一個(gè)損失距離度量?
對(duì)于損失距離度量?,它決定了樣本點(diǎn)到超平面的距離損失
當(dāng) ? 比較大時(shí),損失較小,更多的點(diǎn)在損失距離范圍之內(nèi),而沒有損失,模型較簡(jiǎn)單
當(dāng) ? 比較小時(shí),損失函數(shù)會(huì)較大,模型也會(huì)變得復(fù)雜
scikit-learn中默認(rèn)值是0.1
如果把懲罰系數(shù)C,RBF核函數(shù)的系數(shù)γ和損失距離度量?一起看,當(dāng)C比較大, γ比較大,?比較小時(shí),我們會(huì)有更多的支持向量,我們的模型會(huì)比較復(fù)雜,容易過擬合一些。如果C比較小 , γ比較小,?比較大時(shí),模型會(huì)變得簡(jiǎn)單,支持向量的個(gè)數(shù)會(huì)少
2.2.2. 調(diào)參方法:網(wǎng)格搜索
對(duì)于SVM的RBF核,我們主要的調(diào)參方法都是交叉驗(yàn)證。具體在scikit-learn中,主要是使用網(wǎng)格搜索,即GridSearchCV類
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(SVC(), param_grid={"C":[0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4)
grid.fit(X, y)
將GridSearchCV類用于SVM RBF調(diào)參時(shí)要注意的參數(shù)有:
estimator:即我們的模型,此處我們就是帶高斯核的SVC或者SVR
param_grid:即我們要調(diào)參的參數(shù)列表。 比如我們用SVC分類模型的話,那么param_grid可以定義為{"C":[0.1, 1, 10], "gamma": [0.1, 0.2, 0.3]},這樣我們就會(huì)有9種超參數(shù)的組合來進(jìn)行網(wǎng)格搜索,選擇一個(gè)擬合分?jǐn)?shù)最好的超平面系數(shù)
cv:S折交叉驗(yàn)證的折數(shù),即將訓(xùn)練集分成多少份來進(jìn)行交叉驗(yàn)證。默認(rèn)是3。如果樣本較多的話,可以適度增大cv的值
3. 編程實(shí)現(xiàn)
-
生成測(cè)試數(shù)據(jù)
from sklearn.datasets import make_circles from sklearn.preprocessing import StandardScaler # 生成一些隨機(jī)數(shù)據(jù)用于后續(xù)分類 X, y = make_circles(noise=0.2, factor=0.5, random_state=1) # 生成時(shí)加入了一些噪聲 X = StandardScaler().fit_transform(X) # 把數(shù)據(jù)歸一化
生成的隨機(jī)數(shù)據(jù)可視化結(jié)果如下:
-
調(diào)參
接著采用網(wǎng)格搜索的策略進(jìn)行RBF核函數(shù)參數(shù)搜索
from sklearn.model_selection import GridSearchCV grid = GridSearchCV(SVC(), param_grid={"C":[0.1, 1, 10], "gamma": [1, 0.1, 0.01]}, cv=4) # 總共有9種參數(shù)組合的搜索空間 grid.fit(X, y) print("The best parameters are %s with a score of %0.2f" % (grid.best_params_, grid.best_score_)) 輸出為: The best parameters are {'C': 10, 'gamma': 0.1} with a score of 0.91
可以對(duì)9種參數(shù)組合訓(xùn)練的結(jié)果進(jìn)行可視化,觀察分類的效果:
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max,0.02), np.arange(y_min, y_max, 0.02)) for i, C in enumerate((0.1, 1, 10)): for j, gamma in enumerate((1, 0.1, 0.01)): plt.subplot() clf = SVC(C=C, gamma=gamma) clf.fit(X,y) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) # Put the result into a color plot Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8) # Plot also the training points plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm) plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.xticks(()) plt.yticks(()) plt.xlabel(" gamma=" + str(gamma) + " C=" + str(C)) plt.show()
|
1.000 | 0.100 | 0.001 |
---|---|---|---|
0.1 | |||
1 | |||
10 |
參考資料:
(1) 劉建平Pinard《scikit-learn 支持向量機(jī)算法庫(kù)使用小結(jié)》