SVM分類,就是找到一個平面,讓兩個分類集合的支持向量或者所有的數據(LSSVM)離分類平面最遠;
SVR回歸,就是找到一個回歸平面,讓一個集合的所有數據到該平面的距離最近。
SVR是支持向量回歸(support vector regression)的英文縮寫,是支持向量機(SVM)的重要的應用分支。
傳統回歸方法當且僅當回歸f(x)完全等於y時才認為預測正確,如線性回歸中常用(f(x)−y)2來計算其損失。
而支持向量回歸則認為只要f(x)與y偏離程度不要太大,既可以認為預測正確,不用計算損失,具體的,就是設置閾值α,只計算|f(x)−y|>α的數據點的loss,如下圖所示,陰影部分的數據點我們都認為該模型預測准確了,只計算陰影外的數據點的loss:
數據處理
preprocessing.scale()作用:
scale()是用來對原始樣本進行縮放的,范圍可以自己定,一般是[0,1]或[-1,1]。
縮放的目的主要是
1)防止某個特征過大或過小,從而在訓練中起的作用不平衡;
2)為了計算速度。因為在核計算中,會用到內積運算或exp運算,不平衡的數據可能造成計算困難。
對於SVM算法,我們首先導入sklearn.svm中的SVR模塊。SVR()就是SVM算法來做回歸用的方法(即輸入標簽是連續值的時候要用的方法),通過以下語句來確定SVR的模式(選取比較重要的幾個參數進行測試。隨機選取一只股票開始相關參數選擇的測試)。
svr = SVR(kernel=’rbf’, C=1e3, gamma=0.01)
kernel:核函數的類型,一般常用的有’rbf’,’linear’,’poly’,等如圖4-1-2-1所示,發現使用rbf參數時函數模型的擬合效果最好。
C:懲罰因子
C表征你有多么重視離群點,C越大越重視,越不想丟掉它們。C值大時對誤差分類的懲罰增大,C值小時對誤差分類的懲罰減小。當C越大,趨近無窮的時候,表示不允許分類誤差的存在,margin越小,容易過擬合;當C趨於0時,表示我們不再關注分類是否正確,只要求margin越大,容易欠擬合。如圖所示發現當使用1e3時最為適宜。
gamma:
是’rbf’,’poly’和’sigmoid’的核系數且gamma的值必須大於0。隨着gamma的增大,存在對於測試集分類效果差而對訓練分類效果好的情況,並且容易泛化誤差出現過擬合。如圖發現gamma=0.01時准確度最高。
我們這次用的數據是公司內部不同的promotion level所對應的薪資
下面我們來看一下在Python中是如何實現的
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv('Position_Salaries.csv')
X = dataset.iloc[:, 1:2].values
# 這里注意:1:2其實只有第一列,與1 的區別是這表示的是一個matrix矩陣,而非單一向量。
y = dataset.iloc[:, 2].values
接下來,處理數據:
# Reshape your data either using array.reshape(-1, 1) if your data has a single feature
# array.reshape(1, -1) if it contains a single sample.
X = np.reshape(X, (-1, 1))
y = np.reshape(y, (-1, 1))
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_y = StandardScaler()
X = sc_X.fit_transform(X)
y = sc_y.fit_transform(y)
接下來,進入正題,開始SVR回歸:
# Fitting SVR to the dataset
from sklearn.svm import SVR
regressor = SVR(kernel = 'rbf')
regressor.fit(X, y)
# Predicting a new result
y_pred = regressor.predict(sc_X.transform(np.array([[6.5]])))
# 轉換回正常預測值
y_pred = sc_y.inverse_transform(y_pred)
# 圖像中顯示
plt.scatter(X, y, color = 'red')
plt.plot(X, regressor.predict(X), color = 'blue')
plt.title('Truth or Bluff (SVR)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()

# Visualising the SVR results (for higher resolution and smoother curve)
X_grid = np.arange(min(X), max(X), 0.01) # choice of 0.01 instead of 0.1 step because the data is feature scaled
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(X, y, color = 'red')
plt.plot(X_grid, regressor.predict(X_grid), color = 'blue')
plt.title('Truth or Bluff (SVR)')
plt.xlabel('Position level')
plt.ylabel('Salary')
plt.show()
