利用R語言實現支持向量機(SVM)數據挖掘案例

創建模型網絡

svm()函數在創建支持向量機模型的時候有兩種創建方式。簡單地說,一種是根據既定公式創建模型;而另一種方式則是根據所給的數據模型創建模型。ide

根據函數的第一種使用格式,針對上述數據建模時,應該先肯定所創建的模型所使用的數據,而後再肯定所創建模型的結果變量和特徵變來那個。代碼以下:函數

library(e1071)優化

data(iris)ci

#創建svm模型cmd

model <- svm(Species~.,data = iris)數據分析

在使用第一種格式創建模型時,若是使用數據中的所有特徵變量做爲模型特徵變量時,能夠簡要地使用「Species~.」中的「.」代替所有的特徵變量。it

根據函數的第二種使用格式,在針對iris數據創建模型時,首先應該將結果變量和特徵變量分別提取出來。結果變量用一個向量表示,而特徵向量用一個矩陣表示。在肯定好數據後還應根據數據分析所使用的核函數以及核函數所對應的參數值,一般默認使用高斯內積函數做爲核函數,具體分析代碼以下:數據挖掘

#提取iris數據中除第5列之外的數據做爲特徵變量io

x <- iris[,-5]

#提取iris數據中第5列數據做爲結果變量

y <- iris[,5]

#創建svm模型

model <- svm(x,y,kernel = "radial", gamma = if(is.vector(x)) 1 else 1/ncol(x))

在使用第二種格式創建模型時,不須要特別強調所創建模型的哪一個是,函數會自動將全部輸入的特徵變量數據做爲創建模型所須要的特徵變來那個。

在上述過程當中,肯定核函數的gamma係數時所使用的R語言所表明的意思爲:若是特徵向量是向量則gamma值取1,不然gamma值爲特徵向量個數的倒數。

結果分析

summary(model)

Call:

svm.default(x = x, y = y, kernel = "radial", gamma = if (is.vector(x)) 1 else 1/ncol(x))

Parameters:

SVM-Type: C-classification

SVM-Kernel: radial

cost: 1

gamma: 0.25

Number of Support Vectors: 51

( 8 22 21 )

Number of Classes: 3

Levels:

setosa versicolor virginica

經過summary()函數能夠獲得關於模型的相關信息。其中,SVM-Type項目說明本模型的誒別爲C分類器模型;SVM-Kernel項目說明本模型所使用的核函數爲高斯內積函數且核函數中參數gamma的取值爲0.25;cost項目說明本模型肯定的約束違反成本爲1。

在輸出結果中,咱們還能夠看到,對於該數據,模型找到了51個支持變量;第一類具備8個支持向量,第二類具備22個支持向量,第三類具備21個支持向量。最後說明了模型中的三個類別爲:setosa、versicolor和virginica。

預測判別

一般咱們利用樣本數據創建模型以後,主要目的都是利用模型來進行相應的預測和判別。在利用svm()函數創建的模型進行預測時,咱們將用到predict()函數對模型進行預測。在實用predict()函數時,應該首先確認將用於預測的樣本數據,並將樣本數據的特徵變量整合放入同一個矩陣,代碼以下:

#確認須要繼續預測的樣本特徵矩陣

x <- iris[,1:4]

#根據模型model對x數據進行預測

pred <- predict(model, x)

#隨機挑選8個預測結果進行展現

print(pred[sample(1:150, 8)])

1 131 133 41 79 49 47 93

setosa virginica virginica setosa versicolor setosa setosa versicolor

Levels: setosa versicolor virginica

在進行數據預測時,主要注意的問題就是必須保證用於預測的特徵向量的個數應同模型創建時使用的特徵向量個數一致,不然將沒法預測結果。在使用predict()函數進行預測時,不用刻意去調整預測結果類型。

經過對預測結果的展現,咱們能夠看到predict()函數在預測時自動識別預測結果的類型,並自動生成了相應的類別名稱。一般在進行預測以後,還須要檢查模型預測的精度,這便須要用到table()函數對預測結果和真實結果作出對比展現。代碼以下:

#模型預測精度展現

table(pred, y)

y

pred setosa versicolor virginica

setosa 50 0 0

versicolor 0 48 2

virginica 0 2 48

經過觀察table()函數對模型預測精度的展現結果,咱們能夠看到在模型預測時,模型將全部屬於setosa類型的花所有預測正確;模型將屬於versicolor類型的花中的48朵預測正確,但將另外良多預測爲virginica類型;同理,模型將屬於virginica類型的花中的48朵預測正確,但也將另外良多預測爲versicolor類型。

綜合建模

經過以前對支持向量機理論及支持向量機模型具體應用的介紹,現基於iris數據集 ,綜合介紹利用R語言創建模型的完整過程。

分析數據能夠看出,數據須要判別的是三個類別,且三個類別屬於字符類型,因此咱們能夠選擇的支持向量機分類機就有三類:C-classification、nu-classification、one-classification。同時,能夠選擇的核函數有四類:線性核函數(linear)、多項式核函數(polynomial)、徑向基核函數(radial basis,RBF)和神經網絡核函數(sigmoid)。因此在時間和精力容許的狀況下,應該儘量創建全部可能的模型,最後經過比較選出判別結果最優的模型。根據上述分析,利用R語言實現的具體程序代碼以下:

library(e1071)

#將數據集iris按列單獨確認爲向量

attach(iris)

#肯定特徵變量爲數據集iris中除去Species中的其餘項

x <- subset(iris, select = -Species)

#肯定結果變量爲數據集iris中的Species項

y <- Species

#肯定將要使用的分類方式

type <- c("C-classification","nu-classification","one-classification")

#肯定將要使用的核函數

kernel <- c("linear","polynomial","radial","sigmoid")

#初始化預測結果矩陣的三維長度分別爲150,3,4

pred <- array(0,dim = c(150,3,4))

#初始化模型精準度矩陣的二維分別爲3,4

accuracy <- matrix(0,3,4)

#爲方便模型精度計算,將結果變量數量化爲1,2,3

yy <- as.integer(y)

#確認i影響的維度表明分類方式

for(i in 1:3){

  • #確認j影響的維度表明核函數

  • for(j in 1:4){

  • #對每一模型進行預測

  • pred[,i,j] <- predict(svm(x,y.type=type[i],kernel=kernel[j]),x)

  • if (i>2) {

  • accuracy[i,j] <- sum(pred[,i,j]!=1)

  • } else {

  • accuracy[i,j] <- sum(pred[,i,j]!=yy)

  • }

  • }

  • }

#肯定模型精度變量的列名和行名

dimnames(accuracy)=list(type,kernel)

在運行程序中,if語句的使用是由於C-classification和nu-classification與one-classification的模型預測精度精算方式不一樣,因此應該分別進行計算。在運行程序以後,能夠獲得全部12個模型所對應的預測精度。程序中accuracy所表明的是模型預測錯誤的個數。

咱們將根據這個預測結果挑選出預測錯誤最少的一些 模型,而後再根據實際狀況進行詳細分析,最終決定得出最適合本次研究目的的模型。

相應的預測結果以下:

R語言數據挖掘實踐——支持向量機代碼實戰

從表中的模型預測結果能夠看出,利用one-classification方式不管採起何種核函數得出的結果錯誤都很是多,因此能夠看出該方式不適合這類數據類型的判別。使用one-classification方式進行建模時,數據一般狀況下爲一個類別的特徵,創建的模型主要用於判別其餘樣本是否屬於這類。

利用C-classification與高斯核函數結合的模型判別錯誤最少,若是咱們創建模型的目的主要是爲了整體誤判率最低,而且各類類型判錯的代價是相同的,那麼就能夠直接選擇這個模型做爲最有模型。那麼將利用C-classification與高斯核函數介個的模型的預測結果示例代碼以下:

table(pred, y)

y

pred setosa versicolor virginica

setosa 50 0 0

versicolor 0 48 2

virginica 0 2 48

在獲得這個較優模型以後,咱們將針對這一模型在進行具體的分析和討論,力圖進一步提升模型的預測精度。

可視化分析

在創建支持向量機模型以後,咱們來進一步分析模型。在分析過程當中將會使用模型可視化以便於對模型的分析。在對模型進行可視化的過程當中,咱們使用plot()函數對模型進行可視化繪製,代碼以下:

plot(cmdscale(dist(iris[,-5])),

  • col=c("lightgray","black","gray")[as.integer(iris[,5])],

  • pch=c("o","+")[1:150 %in% model$index + 1])

legend(2,-0.8,c("setosa","versicolor","virginica"),col = c("lightgray","black","gray"),lty=1)

R語言數據挖掘實踐——支持向量機代碼實戰

經過plot()函數對所創建的支持向量機模型進行可視化以後,所獲得的圖像是對模型數據類別的一個整體觀察。圖中"+"表示的是支持向量,「0」表示的是普通樣本點。

從圖中咱們能夠看到,鳶尾屬中的第一種setosa類別同其餘兩種區別較大,而剩下的versicolor和virginica類別卻相差很小,甚至存在交叉難以區分。這也在另外一個角度解釋了在模型預測過程當中出現的問題,這正是爲何模型將兩朵versicolor類別的話預測成了virginica類別,並將兩朵virginica類別的花預測成了versicolor類別的緣由。

在使用plot()函數對所創建的模型進行了整體的觀察後,咱們還能夠利用plot()函數對模型進行其餘角度的可視化分析。咱們能夠利用plot()函數對模型類別關於模型中任意兩個特徵向量的變更過程進行繪圖。繪圖過程以下:

data(iris)

model <- svm(Species~., data = iris)

plot(model, iris, Petal.Width~Petal.Length,fill = FALSE,

  • symbolPalette = c("lightgray","black","grey"),svSymbol = "+")

legend(1,2.5,c("setosa","versicolor","virginica"),col = c("lightgray","black","gray"),lty=1)

R語言數據挖掘實踐——支持向量機代碼實戰

經過對模型關於花瓣的寬度和長度對模型類別分類影響的可視化後,咱們仍然能夠獲得一致的結果:setosa類別的花瓣同另外兩個類別相差較大,而versicolor類別的花瓣同virginica類別的花瓣相差較小。

經過模型可視化能夠看出,virginica類別的花瓣在長度和寬度的整體水平上都高於其餘兩個類別,而versicolor類別的花瓣在長度和寬度的整體水平上處於居中的位置,而setosa類別的花瓣在長度和寬度上都比另外兩個類別小。

優化模型

在模型預測精度結果中咱們發現,儘管模型的預測錯誤已經不多,可是所創建的模型仍是出現了4個預測錯誤,那麼爲了尋找到一個最優的支持向量機模型,咱們是否能經過一些方式來進一步提升模型的預測精度,最理想的狀況就是將模型的預測錯誤率減小爲零。

經過對模型的可視化分析後,不管是從整體的整體的角度觀察,仍是從模型個別特徵的角度觀察,咱們均可以獲得一致的結論:類別setosa同其餘兩個類別的差別較大,而類別versicolor和類別virginica的差別很是小,並且直觀上能看到兩部分出現少量交叉,而且在預測結果中,模型出現判別錯誤的地方也是混淆了累唄versicolor和類別virginica。

所以,針對這種狀況,咱們能夠嚮導經過改變模型各個類別的比重來對數據進行調整。因爲類別setosa同其餘兩個類別相差很大,因此咱們能夠考慮下降類別setosa在模型中的額比重,而提升另外兩個類別的比重,即適當犧牲類別setosa的精度來提升其餘兩個類別的精度。這種方法在R語言中能夠經過svm()函數中的class.weights參數來進行調整。特別強調的是,class.weights參數所須要的數據必須爲向量,而且具備列名,具體過程以下:

#肯定模型各個類別的比重爲1:1:1

wts <- c(1,1,1)

#肯定各個比重對應的類別

names(wts) <- c("setosa","versicolor","virginica")

#創建模型

model1 <- svm(x,y,class.weights = wts)

當模型的各個類別的比重爲1:1:1時,則模型就是最原始的模型,預測結果即以前的預測模型。接下來咱們適當提升類別versicolor和類別virginica的比重,以觀察對模型的預測精度是否產生影響,是否爲正向影響。

首先,咱們先將這兩種類別的比重擴大100倍(具體倍數可根據自行調整修改):

wts <- c(1,100,100)

names(wts) <- c("setosa","versicolor","virginica")

model2 <- svm(x,y,class.weights = wts)

pred2 <- predict(model2,x)

table(pred2,y)

y

pred2 setosa versicolor virginica

setosa 50 0 0

versicolor 0 49 1

virginica 0 1 49

經過預測結果的展現發現,經過提升類別versicolor和virginica的比重卻能能對模型的預測精度產生影響,而且能產生正向影響。因此咱們能夠繼續經過改變權重的方法來視圖提升模型的預測精度。

接下來,咱們將這兩個類別的權重在擴大5倍,即相對於原始數據,這兩個類別的權重總共擴大了500倍:

wts <- c(1,500,500)

names(wts) <- c("setosa","versicolor","virginica")

model3 <- svm(x,y,class.weights = wts)

pred3 <- predict(model3,x)

table(pred3,y)

y

pred3 setosa versicolor virginica

setosa 50 0 0

versicolor 0 50 0

virginica 0 0 50

經過對權重的調整以後,咱們創建的支持向量機模型可以將全部樣本所有預測正確。因此在實際構建模型的過程當中,在必要的時候能夠經過改變各樣本之間的權重比例來提升模型的預測精度。

相關文章
相關標籤/搜索