【R】支持向量機模型實現

jopen 8年前發布 | 14K 次閱讀 支持向量機 機器學習

許多機器學習文章中都提到支持向量機算法的神奇之處。然而,當我用它來處理真實數據以獲得較高精度的分類模型時,我偶然發現了幾個問題。

本文所提到的模型是基于 R 語言中的包 e1071 所實現的。 首先,你需要安裝該軟件包并加載之:

 install.packages("e1071")
library("e1071")

當你處理二分類問題時,SVM 算法的表現非常優異。該方法通過尋找最佳分割線從而將數據分成兩個不同的數據集。SVM既可以處理線性分類問題,也可以處理非線性分類問題。其分類器被稱為超平面。

變量標準化

在你開始建模前,你需要做的第一件事是:標準化變量數據。SVM 利用這些變量構建分類器從而將數據進行分類,需要注意的是:這些變量越好地刻畫你的數據集,你所得到的分類結果將越精確。如果這些變量沒有預先被標準化處理,那么絕對值較大的變量將會具有更大的影響力,這意味著某些參數將起主導作用。如果這不是你想要的結果,那么請務必做好數據標準化處理。

參數調整

調整 SVM 算法中的參數也是非常重要的一個步驟,我們需要調整 SVM 算法的參數以獲得更優的擬合結果。我們必須明確一點:SVM 算法的表現取決于如何選擇最佳參數,即使相當接近的參數值也有可能產生差異巨大的分類結果。因此,為了更好地解決問題,我們需要檢驗不同參數值下模型的表現情況。R 中有一個非常好的工具—— tune.svm() 。該工具可以利用十折交叉驗證法計算不同參數值情況下的分類誤差,并返回具有最小分類誤差的參數值。

 # Example of tune.svm() output:
parameters = tune.svm(class~., data = train_set, gamma = 10^(-5:-1), cost = 10^(-3:1))
summary(parameters)
Parameter tuning of ‘svm’:

  • sampling method: 10-fold cross validation

  • best parameters: gamma cost 0.1 1

  • best performance: 0.1409453

  • Detailed performance results: gamma cost error dispersion 1 1e-05 0.1 0.2549098 0.010693238 2 1e-04 0.1 0.2548908 0.010689828 3 1e-03 0.1 0.2546062 0.010685683 4 1e-02 0.1 0.2397427 0.010388229 5 1e-01 0.1 0.1776163 0.014591070 6 1e-05 1.0 0.2549043 0.010691266 7 1e-03 1.0 0.2524830 0.010660262 8 1e-02 1.0 0.2262167 0.010391502 9 1e-01 1.0 0.1409453 0.009898745 10 1e-05 10.0 0.2548687 0.010690819 11 1e-04 10.0 0.2545997 0.010686525 12 1e-03 10.0 0.2403118 0.010394169 13 1e-02 10.0 0.1932509 0.009984875

14 1e-01 10.0 0.1529182 0.013780632</pre>

參數 gamma 表示超平面的線性平滑度,因此當你使用線性核函數構建 SVM 時,模型中不存在 gamma 參數。我們知道:gamma 越小,超平面越接近于直線,但是如果 gamma 選取過大,超平面將會變得非常彎曲,這會導致過度擬合問題。

同時,我們還可以調整參數 C 來提高模型精度。參數 C 代表 SVM 模型 soft margin 的規模, soft margin 表示超平面周圍的灰色區域面積。這意味著位于 soft margin 區域中的點將沒有被分類。其中 C 越小,soft margin 的面積越大。

如何預處理數據

R語言中的 svm() 函數需要輸入一個矩陣或者數據框格式的數據,如下表所示:其中包含一個分類變量和其他解釋變量。

   class    f1    f2    f3
1     0 0.100 0.500 0.900
2     0 0.101 0.490 0.901
3     0 0.110 0.540 0.890
4     0 0.100 0.501 0.809
5     1 0.780 0.730 0.090
6     1 0.820 0.790 0.100
7     1 0.870 0.750 0.099
8     1 0.890 0.720 0.089

svm()的輸入格式如下所示:

svm(class~., data = my_data, kernel = "radial", gamma = 0.1, cost = 1)

其中class表示分類變量,my_data表示數據集。后續的參數值采用上述方法選擇最優值。

<img class="cke_anchor" data-cke-realelement="%3Ca%20data-cke-saved-name%3D%22%E6%A3%80%E9%AA%8C%E7%BB%93%E6%9E%9C%22%20name%3D%22%E6%A3%80%E9%AA%8C%E7%BB%93%E6%9E%9C%22%3E%3C%2Fa%3E" data-cke-real-node-type="1" alt="錨點" title="錨點" align="" src="

常見做法是將數據集分成訓練集和測試集,其比例為2:1。利用測試集來計算擬合誤差。

切分數據

data_index = 1:nrow(my_data) testindex = sample(data_index, trunc(length(data_index)*30/100)) test_set = my_data[testindex,] train_set = my_data[-testindex,]

擬合模型

my_model = svm(class~., data = train_set, kernel = "radial", gamma = 0.1, cost = 1)

預測結果

test[,-1] 表示剔除class變量

my_prediction = predict(my_model, test_set[,-1])</pre>

注意事項

  1. tune.svm() 需要運行一定的時間,具體取決于數據集的大小。但是不管怎么說,這個過程是非常有意義的。

    </li>

  2. SVM 模型的參數優化過程中,我們通常取對數間隔值,從10^-6到10^6。 注釋

    </li> </ol>

    3.如果你的標識變量是數值型變量(如本文中的 0-1 變量),那么你的預測結果將會是一個數值,該數值反映了測試集輸出結果和某個類別之間相近程度。如果你想要得到原始的分類結果,你需要在 svm() 中設置 type = C-classification。

    4.如果你的數據集的樣本個數小于 10,此時你運行 tune.svm() 會出錯:

      Error in tune("svm", train.x = x, data = data, ranges = ranges, ...) :
         ‘cross’ must not exceed sampling size!

    因此,利用 SVM 建模分析時要確保你的數據集足夠大。

    原文作者:Renata Ghisloti Duarte de Souza

    原文鏈接: http://girlincomputerscience.blogspot.com/2015/02/svm-in-practice.html

    譯者:Fibears

    </div>

    來自: http://datartisan.com/article/detail/75.html

    </code></code></code></code>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!