[Scikit-learn] 1.4 Support Vector Regression

SVM算法html

  • 既可用於迴歸問題,好比SVR(Support Vector Regression,支持向量迴歸)
  • 也能夠用於分類問題,好比SVC(Support Vector Classification,支持向量分類)

這裏簡單介紹下SVR:https://scikit-learn.org/stable/modules/svm.html#svm-regression算法

 

 

SVM解決迴歸問題

1、原理示範

Ref: 支持向量機 svc svr svm網絡

感受不是很好的樣子,沒有 Bayesian Linear Regression的效果好;但其實也是取決於「核」的選取。dom

 

 

2、代碼示範

print(__doc__)

import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt

# #############################################################################
# Generate sample data
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel()

# #############################################################################
# Add noise to targets
y[::5] += 3 * (0.5 - np.random.rand(8))

# #############################################################################
# Fit regression model
svr_rbf  = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=.1)
svr_lin  = SVR(kernel='linear', C=100, gamma='auto')
svr_poly = SVR(kernel='poly', C=100, gamma='auto', degree=3, epsilon=.1,
               coef0=1)

# #############################################################################
# Look at the results
lw = 2

svrs = [svr_rbf, svr_lin, svr_poly]
kernel_label = ['RBF', 'Linear', 'Polynomial']
model_color = ['m', 'c', 'g']

fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 10), sharey=True)
for ix, svr in enumerate(svrs):
    axes[ix].plot(X, svr.fit(X, y).predict(X), color=model_color[ix], lw=lw,
                  label='{} model'.format(kernel_label[ix]))
    axes[ix].scatter(X[svr.support_], y[svr.support_], facecolor="none",
                     edgecolor=model_color[ix], s=50,
                     label='{} support vectors'.format(kernel_label[ix]))
    axes[ix].scatter(X[np.setdiff1d(np.arange(len(X)), svr.support_)],
                     y[np.setdiff1d(np.arange(len(X)), svr.support_)],
                     facecolor="none", edgecolor="k", s=50,
                     label='other training data')
    axes[ix].legend(loc='upper center', bbox_to_anchor=(0.5, 1.1),
                    ncol=1, fancybox=True, shadow=True)

fig.text(0.5, 0.04, 'data', ha='center', va='center')
fig.text(0.06, 0.5, 'target', ha='center', va='center', rotation='vertical')
fig.suptitle("Support Vector Regression", fontsize=14)
plt.show()

 

可見,RBF有了徑向基中「貝葉斯機率」的特性,跟容易找到數據趨勢的主體。機器學習

 

 

 

實踐出真知

Ref: SVM: 實際中使用SVM的一些問題函數

1、核的選擇

若是features的範圍差異不大。post

    • 一種選擇是不使用kernel(也稱爲linear kernel),直接使用x: 這種狀況是當咱們的n很大(即維度很高,features不少)可是訓練樣本卻不多的狀況下,咱們通常不但願畫出很複雜的邊界線 (由於樣本不多,畫出很複雜的邊界線就會過擬合),而是用線性的邊界線。
    • 一種選擇是使用Gaussian kernel: 這種狀況須要肯定σ2(平衡bias仍是variance)。這種狀況是當x的維度不高,可是樣本集不少的狀況下。如上圖中,n=2,可是m卻不少,須要一個相似於圓的邊界線。(即須要一個複雜的邊界)

 

 

2、默塞爾定理

若是features的範圍差異很大,在執行kernel以前要使用feature scaling。學習

咱們最經常使用的是 高斯kernel 和 linear kernel (即不使用kernel),可是須要注意的是否是任何類似度函數都是有效的核函數,它們(包括咱們常使用的高斯kernel)須要知足一個定理(默塞爾定理),這是由於SVM有不少數值優化技巧,爲了有效地求解參數Θ,須要類似度函數知足默塞爾定理,這樣才能確保SVM包可以使用優化的方法來求解參數Θ。優化

 

 

3、LR / SVM / DNN 比較

咱們將logistic regression的cost function進行了修改得出了SVM,那麼咱們在什麼狀況下應該使用什麼算法呢?url

【量少】若是咱們的features要比樣本數要大的話(如n=10000 (維度),m=10-1000 (樣本量)),咱們使用logistic regression或者linear kernel,由於在樣本較少的狀況下,咱們使用線性分類效果已經很好了,咱們沒有足夠多的樣原本支持咱們進行復雜的分類。

【適量】若是n(維度)較小,m(樣本量)大小適中的話,使用SVM with Gaussion kernel.如咱們以前講的有一個二維(n=2)的數據集,咱們可使用高斯核函數很好的將正負區分出來.

【量多】若是n(維度)較小,m(樣本量)很是龐大的話,會建立一些features,而後再使用logistic regeression 或者linear kernel。由於當m很是大的話,使用高斯核函數會較慢。

 

logistic regeression 與linear kernel是很是類似的算法,若是其中一個適合運行的話,那麼另外一個也頗有可能適合運行。

咱們使用高斯kernel的範圍很大,當m多達50000,n在1-1000(很常見的範圍),均可以使用SVM with 高斯kernel,能夠解決不少logistic regression不能解決的問題。

 

神經網絡在任何狀況下都適用,可是有一個缺點是它訓練起來比較慢,相對於SVM來講

SVM求的不是局部最優解,而是全局最優解

相對於使用哪一種算法來講,咱們更重要的是

    1. 掌握更多的數據,
    2. 如何調試算法(bias/variance),
    3. 如何設計新的特徵變量,

這些都比是使用SVM仍是logistic regression重要。

可是SVM是一種被普遍使用的算法,而且在某個範圍內,它的效率很是高,是一種有效地學習複雜的非線性問題的學習算法。

logistic regression,神經網絡,SVM這三個學習算法使得咱們能夠解決不少前沿的機器學習問題。

 

End.

相關文章
相關標籤/搜索