第八篇:支援向量機 (Support Vector Machine)

穆晨發表於2017-05-20

前言

       本文講解如何使用R語言中e1071包中的SVM函式進行分類操作,並以一個關於鳶尾花分類的例項演示具體分類步驟。

分析總體流程

1. 載入並瞭解資料集;
2. 對資料集進行訓練並生成模型;
3. 在此模型之上呼叫測試資料集進行分類測試;
4. 檢視分類結果;
5. 進行各種引數的除錯並重復2-4直至分類的結果讓人滿意為止。

引數調整策略

       綜合來說,主要有以下四個方面需要調整:

1. 選擇合適的核函式;
2. 調整誤分點容忍度引數cost;
3. 調整各核函式的引數;
4. 調整各樣本的權重。

       其中,對於特徵比較多的情況一般用非線性核,比如高斯核。高斯核的特點是引數多,需要不斷除錯引數才能理想的效果。而線性核沒什麼引數可設定,一般適用於特徵比較少的情況。

       關於各核函式的引數,則一般是通過試探法來確定。最好可以將不同樣本權重模型,不同核函式引數下的分類準確率做成一張視覺化報表,以便於方案確定。

       關於3的選擇,一般可以通過MDS的視覺化圖,看有哪幾個分類是糾纏不清的,然後就加大這兩個分類的樣本權重。

鳶尾花分類分析 - 使用支援向量機(SVM)

       1. 安裝SVM分析所需包:e1071

       2. 載入並瞭解資料集:

       

       可以看出,這個資料集比較理想化,避免了繁瑣的資料預處理過程,非常適合作為案例講解。

       3. 建立SVM模型:

       

       這個模型變數相當於是訓練庫,下面檢視該模型的資訊:

       

       其中,SVM型別是C-classification,核函式是高斯核,cost是誤分點容忍度引數,gamma是核函式引數。他們的具體含義請參考函式手冊。

       4. 利用該模型進行預測

       

       5. 檢視預測效果:

       

       可見,有兩個型別似乎混淆了。那怎麼辦?還有,如果變數多,我如何觀察出哪幾個變數糾纏不清呢?下面先來解決這個問題。

       6. 使用MDS技術檢視各變數分類情況

       MDS技術可以根據所有樣本之間的距離,根據各個變數之間距離不變的設定,將維度降低到兩維。一般來說,它是用來分析整體分類的一個態勢的:

1 plot(cmdscale(dist(iris[,-5])), col = c("blue", "green", "orange")[as.integer(iris[,5])], pch = c("o", "+")[1:150 %in% model$index+1])
2 legend(2, -0.7, c("setosa", "versicolor", "virginica"), col = c("blue", "green", "orange"), lty = 1)

       顯示效果如下:

       

       顯然,後兩個分類有點混淆。

       7. 調整各樣本權重係數:

       

       由上圖可知,這樣的模型產生了更好的分類效果。

小結

       1. 本例中的場景比較簡單,故未做複雜的引數調整。在實際專案中往往需要對方方面面都進行調整。

       2. 雖然SVM在做了標準化後效果更好,但是不用手動標準化。因為SVM函式會自動進行標準化。

       3. 對於維度比較少的情況,直接用線性核就好了。

       4. SVM是綜合指標最好的分類器,但是有它的侷限之處,那就是容易過擬合。因此降維工作一定要做好。

相關文章