分類分析--支持向量機
支持向量機(SVM)是一類可用於分類和回歸的有監督機器學習模型。其流行歸功於兩個方面:一方面,他們可輸出較准確的預測結果;另一方面,模型基於較優雅的數學理論。
SVM旨在在多維空間中找到一個能將全部樣本單元分成兩類的最優平面,這一平面應使兩類中距離最近的點的間距(margin)盡可能大,在間距邊界上的點被稱為支持向量(support vector,它們決定間距),分割的超平面位於間距的中間。
SVM可以通過R中kernlab包的ksvm()函數和e1071包中的svm()函數實現。ksvm()功能更強大,但svm()相對更簡單。如下代碼給出了通過svm()函數對威斯康星州乳腺癌數據建立SVM模型的一個示例。
由於方差較大的預測變量通常對SVM的生成影響更大,svm()函數默認在生成模型前對每個變量標准化,使其均值為0、標准差為1。與隨機森林算法不同的是,SVM在預測新樣本單元時不允許有缺失值出現。
(1)支持向量機
library(e1071)
set.seed(1234)
fit.svm <- svm(class~., data=df.train)
fit.svm

svm.pred <- predict(fit.svm, na.omit(df.validate))
svm.perf1 <- table(na.omit(df.validate)$class,
svm.pred, dnn=c("Actual", "Predicted"))
svm.perf1

結果分析:整體來看,驗證集中的准確率達到了(126+70)/205=96%
選擇調和參數
svm()函數默認通過徑向基函數(Radial Basis Function,RBF)將樣本單元投射到高維空間。一般來說RBF核是一個比較好的選擇,因為它是一種非線性投影,可以應對類別標簽與預測變量間的非線性關系。
在用帶RBF核的SVM擬合樣本時,兩個參數可能影響最終結果:gamma和成本(cost)。gamma是核函數的參數,控制分割超平面的形狀。gamma越大,通常導致支持向量越多。我們也可將gamma看作控制訓練樣本“到達范圍”的參數,即gamma越大意味着訓練樣本到達范圍越廣,而越小則意味着到達范圍越窄。gamma必須大於0。
成本參數代表犯錯的成本。一個較大的成本意味着模型對誤差的懲罰更大,從而將生成一個更復雜的分類邊界,對應的訓練集中的誤差也會更小,但也意味着可能存在過擬合問題,即對新樣本單元的預測誤差可能很大。較小的成本意味着分類邊界更平滑,但可能會導致欠擬合。與gamma一樣,成本參數也恆為正。
svm()函數默認設置gamma為預測變量個數的倒數,成本參數為1。不過gamma與成本參數的不同組合可能生成更有效的模型。在建模時,我們可以嘗試變動參數值建立不同的模型,但利用格點搜索法可能更有效。可以通過tune.svm()對每個參數設置一個候選范圍,tune.svm()函數對每一個參數組合生成一個SVM模型,並輸出在每一個參數組合上的表現。如下代碼給出了一個示例。
(2)帶RBF核的SVM模型
set.seed(1234)
tuned <- tune.svm(class~., data=df.train, gamma=10^(-6:1),cost=10^(-10:10)) #變換參數
tuned #輸出最優模型

結果分析:我們一共將嘗試八個不同的gamma(從0.000 001到10)以及21個成本參數(從0.01到1010)。總體來說,我們共擬合了168(8×21)個模型,並比較了其結果。訓練集中10折交叉驗證誤差最小的模型所對應的參數為gamm=0.1,成本參數為1。
fit.svm <- svm(class~., data=df.train, gamma=.01, cost=1) #基於這一參數值組合,我們對全部訓練樣本擬合出新的SVM模型
svm.pred <- predict(fit.svm, na.omit(df.validate)) #用這一模型對驗證集中的樣本單元進行預測
svm.perf <- table(na.omit(df.validate)$class, svm.pred, dnn=c("Actual", "Predicted"))
svm.perf

結果分析:整體來看,驗證集中的准確率達到了(128+70)/205=97%
