1. 程式人生 > 其它 >拓端tecdat|R語言進行支援向量機迴歸SVR和網格搜尋超引數優化

拓端tecdat|R語言進行支援向量機迴歸SVR和網格搜尋超引數優化

原文連結:http://tecdat.cn/?p=23305

原文出處:拓端資料部落公眾號

在這篇文章中,我將展示如何使用R語言來進行支援向量迴歸SVR。

我們將首先做一個簡單的線性迴歸,然後轉向支援向量迴歸,這樣你就可以看到兩者在相同資料下的表現。

一個簡單的資料集

首先,我們將使用這個簡單的資料集。

正如你所看到的,在我們的兩個變數X和Y之間似乎存在某種關係,看起來我們可以擬合出一條在每個點附近通過的直線。

我們用R語言來做吧!

第1步:在R中進行簡單的線性迴歸

下面是CSV格式的相同資料,我把它儲存在regression.csv檔案中。

我們現在可以用R來顯示資料並擬合直線。

  1. # 從csv檔案中載入資料
  2. dataDirectory <- "D:/" #把你自己的資料夾放在這裡
  3. data <- read.csv(paste(dataDirectory, 'data.csv', sep=""), header = TRUE)
  4. # 繪製資料
  5. plot(data, pch=16)
  6. # 建立一個線性迴歸模型
  7. model <- lm(Y ~ X, data)
  8. # 新增擬合線
  9. abline(model)

上面的程式碼顯示以下圖表:

第2步:我們的迴歸效果怎麼樣?

為了能夠比較線性迴歸和支援向量迴歸,我們首先需要一種方法來衡量它的效果。

為了做到這一點,我們改變一下程式碼,使模型做出每一個預測視覺化

  1. # 對每個X做一個預測
  2. pred <- predict(model, data)
  3. # 顯示預測結果
  4. points(X, pred)

產生了以下圖表。

對於每個資料點Xi,模型都會做出預測Y^i,在圖上顯示為一個紅色的十字。與之前的圖表唯一不同的是,這些點沒有相互連線。

為了衡量我們的模型效果,我們計算它的誤差有多大。

我們可以將每個Yi值與相關的預測值Y^i進行比較,看看它們之間有多大的差異。

請注意,表示式Y^i-Yi是誤差,如果我們做出一個完美的預測,Y^i將等於Yi,誤差為零。

如果我們對每個資料點都這樣做,並將誤差相加,我們將得到誤差之和,如果我們取平均值,我們將得到平均平方誤差(MSE)。

在機器學習中,衡量誤差的一個常見方法是使用均方根誤差(RMSE),所以我們將使用它來代替。

為了計算RMSE,我們取其平方根,我們得到RMSE

使用R,我們可以得到以下程式碼來計算RMSE

  1. rmse <- function(error)
  2. {
  3. sqrt(mean(error^2))
  4. }

我們現在知道,我們的線性迴歸模型的RMSE是5.70。讓我們嘗試用SVR來改善它吧!

第3步:支援向量迴歸

用R建立一個SVR模型。

下面是用支援向量迴歸進行預測的程式碼。

model <- svm(Y ~ X , data)

如你所見,它看起來很像線性迴歸的程式碼。請注意,我們呼叫了svm函式(而不是svr!),這是因為這個函式也可以用來用支援向量機進行分類。如果該函式檢測到資料是分類的(如果變數是R中的一個因子),它將自動選擇SVM。

程式碼畫出了下面的圖。

這一次的預測結果更接近於真實的數值 ! 讓我們計算一下支援向量迴歸模型的RMSE。

  1. # 這次svrModel$residuals與data$Y - predictedY不一樣。
  2. #所以我們這樣計算誤差
  3. svrPredictionRMSE

正如預期的那樣,RMSE更好了,現在是3.15,而之前是5.70。

但我們能做得更好嗎?

第四步:調整你的支援向量迴歸模型

為了提高支援向量迴歸的效能,我們將需要為模型選擇最佳引數。

在我們之前的例子中,我們進行了ε-迴歸,我們沒有為ε(ϵ)設定任何值,但它的預設值是0.1。 還有一個成本引數,我們可以改變它以避免過度擬合。

選擇這些引數的過程被稱為超引數優化,或模型選擇。

標準的方法是進行網格搜尋。這意味著我們將為ϵ和成本的不同組合訓練大量的模型,並選擇最好的一個。

  1. # 進行網格搜尋
  2. tuneResultranges = list(epsilon = seq(0,1,0.1), cost = 2^(2:9))
  3. # 繪製調參圖
  4. plot(Result)

在上面的程式碼中有兩個重要的點。

  • 我們使用tune方法訓練模型,ϵ=0,0.1,0.2,...,1和cost=22,23,24,...,29這意味著它將訓練88個模型(這可能需要很長一段時間
  • tuneResult返回MSE,別忘了在與我們之前的模型進行比較之前將其轉換為RMSE。

最後一行繪製了網格搜尋的結果。

在這張圖上,我們可以看到,區域顏色越深,我們的模型就越好(因為RMSE在深色區域更接近於零)。

這意味著我們可以在更窄的範圍內嘗試另一個網格搜尋,我們將嘗試在0和0.2之間的ϵ值。目前看來,成本值並沒有產生影響,所以我們將保持原樣,看看是否有變化。

  1. rangelist(epsilo = seq(0,0.2,0.01), cost = 2^(2:9))

我們用這一小段程式碼訓練了不同的168模型。

當我們放大暗區域時,我們可以看到有幾個較暗的斑塊。

從圖中可以看出,C在200到300之間,ϵ在0.08到0.09之間的模型誤差較小。

希望對我們來說,我們不必用眼睛去選擇最好的模型,R讓我們非常容易地得到它,並用來進行預測。

  1. # 這個值在你的電腦上可能是不同的
  2. # 因為調參方法會隨機調整資料
  3. tunedModelRMSE <- rmse(error)

我們再次提高了支援向量迴歸模型的RMSE !

我們可以把我們的兩個模型都視覺化。在下圖中,第一個SVR模型是紅色的,而調整後的SVR模型是藍色的。


我希望你喜歡這個關於用R支援向量迴歸的介紹。你可以檢視原文得到本教程的原始碼。


最受歡迎的見解

1.R語言多元Logistic邏輯迴歸 應用案例

2.面板平滑轉移回歸(PSTR)分析案例實現

3.matlab中的偏最小二乘迴歸(PLSR)和主成分迴歸(PCR)

4.R語言泊松Poisson迴歸模型分析案例

5.R語言混合效應邏輯迴歸Logistic模型分析肺癌

6.r語言中對LASSO迴歸,Ridge嶺迴歸和Elastic Net模型實現

7.R語言邏輯迴歸、Naive Bayes貝葉斯、決策樹、隨機森林演算法預測心臟病

8.python用線性迴歸預測股票價格

9.R語言用邏輯迴歸、決策樹和隨機森林對信貸資料集進行分類預測

▍關注我們 【大資料部落】第三方資料服務提供商,提供全面的統計分析與資料探勘諮詢服務,為客戶定製個性化的資料解決方案與行業報告等。 ▍諮詢連結:http://y0.cn/teradat ▍聯絡郵箱:[email protected]