拓端tecdat|R語言進行支援向量機迴歸SVR和網格搜尋超引數優化
原文連結:http://tecdat.cn/?p=23305
原文出處:拓端資料部落公眾號
在這篇文章中,我將展示如何使用R語言來進行支援向量迴歸SVR。
我們將首先做一個簡單的線性迴歸,然後轉向支援向量迴歸,這樣你就可以看到兩者在相同資料下的表現。
一個簡單的資料集
首先,我們將使用這個簡單的資料集。
正如你所看到的,在我們的兩個變數X和Y之間似乎存在某種關係,看起來我們可以擬合出一條在每個點附近通過的直線。
我們用R語言來做吧!
第1步:在R中進行簡單的線性迴歸
下面是CSV格式的相同資料,我把它儲存在regression.csv檔案中。
我們現在可以用R來顯示資料並擬合直線。
- # 從csv檔案中載入資料
- dataDirectory <- "D:/" #把你自己的資料夾放在這裡
- data <- read.csv(paste(dataDirectory, 'data.csv', sep=""), header = TRUE)
- # 繪製資料
- plot(data, pch=16)
- # 建立一個線性迴歸模型
- model <- lm(Y ~ X, data)
- # 新增擬合線
- abline(model)
上面的程式碼顯示以下圖表:
第2步:我們的迴歸效果怎麼樣?
為了能夠比較線性迴歸和支援向量迴歸,我們首先需要一種方法來衡量它的效果。
為了做到這一點,我們改變一下程式碼,使模型做出每一個預測視覺化
- # 對每個X做一個預測
- pred <- predict(model, data)
- # 顯示預測結果
- points(X, pred)
產生了以下圖表。
對於每個資料點Xi,模型都會做出預測Y^i,在圖上顯示為一個紅色的十字。與之前的圖表唯一不同的是,這些點沒有相互連線。
為了衡量我們的模型效果,我們計算它的誤差有多大。
我們可以將每個Yi值與相關的預測值Y^i進行比較,看看它們之間有多大的差異。
請注意,表示式Y^i-Yi是誤差,如果我們做出一個完美的預測,Y^i將等於Yi,誤差為零。
如果我們對每個資料點都這樣做,並將誤差相加,我們將得到誤差之和,如果我們取平均值,我們將得到平均平方誤差(MSE)。
在機器學習中,衡量誤差的一個常見方法是使用均方根誤差(RMSE),所以我們將使用它來代替。
為了計算RMSE,我們取其平方根,我們得到RMSE
使用R,我們可以得到以下程式碼來計算RMSE
- rmse <- function(error)
- {
- sqrt(mean(error^2))
- }
我們現在知道,我們的線性迴歸模型的RMSE是5.70。讓我們嘗試用SVR來改善它吧!
第3步:支援向量迴歸
用R建立一個SVR模型。
下面是用支援向量迴歸進行預測的程式碼。
model <- svm(Y ~ X , data)
如你所見,它看起來很像線性迴歸的程式碼。請注意,我們呼叫了svm函式(而不是svr!),這是因為這個函式也可以用來用支援向量機進行分類。如果該函式檢測到資料是分類的(如果變數是R中的一個因子),它將自動選擇SVM。
程式碼畫出了下面的圖。
這一次的預測結果更接近於真實的數值 ! 讓我們計算一下支援向量迴歸模型的RMSE。
- # 這次svrModel$residuals與data$Y - predictedY不一樣。
- #所以我們這樣計算誤差
- svrPredictionRMSE
正如預期的那樣,RMSE更好了,現在是3.15,而之前是5.70。
但我們能做得更好嗎?
第四步:調整你的支援向量迴歸模型
為了提高支援向量迴歸的效能,我們將需要為模型選擇最佳引數。
在我們之前的例子中,我們進行了ε-迴歸,我們沒有為ε(ϵ)設定任何值,但它的預設值是0.1。 還有一個成本引數,我們可以改變它以避免過度擬合。
選擇這些引數的過程被稱為超引數優化,或模型選擇。
標準的方法是進行網格搜尋。這意味著我們將為ϵ和成本的不同組合訓練大量的模型,並選擇最好的一個。
- # 進行網格搜尋
- tuneResultranges = list(epsilon = seq(0,1,0.1), cost = 2^(2:9))
- # 繪製調參圖
- plot(Result)
在上面的程式碼中有兩個重要的點。
- 我們使用tune方法訓練模型,ϵ=0,0.1,0.2,...,1和cost=22,23,24,...,29這意味著它將訓練88個模型(這可能需要很長一段時間
- tuneResult返回MSE,別忘了在與我們之前的模型進行比較之前將其轉換為RMSE。
最後一行繪製了網格搜尋的結果。
在這張圖上,我們可以看到,區域顏色越深,我們的模型就越好(因為RMSE在深色區域更接近於零)。
這意味著我們可以在更窄的範圍內嘗試另一個網格搜尋,我們將嘗試在0和0.2之間的ϵ值。目前看來,成本值並沒有產生影響,所以我們將保持原樣,看看是否有變化。
- rangelist(epsilo = seq(0,0.2,0.01), cost = 2^(2:9))
我們用這一小段程式碼訓練了不同的168模型。
當我們放大暗區域時,我們可以看到有幾個較暗的斑塊。
從圖中可以看出,C在200到300之間,ϵ在0.08到0.09之間的模型誤差較小。
希望對我們來說,我們不必用眼睛去選擇最好的模型,R讓我們非常容易地得到它,並用來進行預測。
- # 這個值在你的電腦上可能是不同的
- # 因為調參方法會隨機調整資料
- tunedModelRMSE <- rmse(error)
我們再次提高了支援向量迴歸模型的RMSE !
我們可以把我們的兩個模型都視覺化。在下圖中,第一個SVR模型是紅色的,而調整後的SVR模型是藍色的。
我希望你喜歡這個關於用R支援向量迴歸的介紹。你可以檢視原文得到本教程的原始碼。
最受歡迎的見解
3.matlab中的偏最小二乘迴歸(PLSR)和主成分迴歸(PCR)
6.r語言中對LASSO迴歸,Ridge嶺迴歸和Elastic Net模型實現
7.R語言邏輯迴歸、Naive Bayes貝葉斯、決策樹、隨機森林演算法預測心臟病
9.R語言用邏輯迴歸、決策樹和隨機森林對信貸資料集進行分類預測
▍關注我們 【大資料部落】第三方資料服務提供商,提供全面的統計分析與資料探勘諮詢服務,為客戶定製個性化的資料解決方案與行業報告等。 ▍諮詢連結:http://y0.cn/teradat ▍聯絡郵箱:[email protected]