R語言自學日記(20)-機器學習(一):支持向量迴歸(Support Vector Regression)

Edward Tung
Sep 7, 2018 · 9 min read

Introduction of Support Vector Regression of Machine Learning

前言:更多的迴歸問題

之前曾經提過的迴歸模型中我們有說過,經過兩百多年的發展人類在迴歸問題的處理上已經出現許多突破,尤其是隨著計算機技術的發展,許多問題可以靠著電腦強大的運算能力推演出來,使得以往只在學術論文上的理論可以走入實用,而當前解決迴歸問題比較常用的模型大致上有幾種:

  1. 一般線性/非線性迴歸:我們在第九篇提到的迴歸模型就是這個,作為最泛用也最常見的模型,該模型已經協助過非常多企業解決商業問題。
  2. 帶入懲罰項的迴歸:為了更精準地得到預測結果,我們針對資料本身的問題去做出一些調整,透過在模型中帶入懲罰項(Penalty Term),能夠更有效針對一些誤差樣本去作出精準預測,或是在高維度的資料處理時,減少高維度帶來的誤差等等,這類模型如嶺回歸(Ridge Regression)、Lasso Regression以及建立在兩者之間的ElasticNet。

3. 建立在機器學習上的迴歸模型:這類模型的概念通常比較反直覺,比方說決策樹迴歸(Decision Tree Regression)或是我們今天要介紹的支持向量機(Support Vector Machine)等等,在很多時候這些模型的表現都遠勝過前兩種迴歸模型,也成為今日許多資料科學家的鑽研對象之一。

甚麼是支持向量機(Support Vector Machine)

本篇基本上參照林軒田老師的機器學習技法思路來做學習:

首先我們先看一個概念,如果今天資料點有兩種,我們說小藍跟小紅好了,我們想要建立一個決策基準,讓新的資料點可以根據這個基準去判斷他是小藍還是小紅,我們應該怎麼做?

Source:林軒田 機器學習技法

很明顯,最右邊的決策基準是最好的,原因是每個點跟線之間的距離最大,因此,我們如果想要最大化這種分類問題,我們只要找到一個能夠最完美切割資料點的超平面(通常我們的資料不會只有二維),也就是說,我們需要計算機幫忙解決一個問題:

Source:林軒田 機器學習技法

希望大家可以理解到,如果我們有一個點 X,有一個平面叫做WX+b,點到平面的距離事實上會是點到平面上任意一個點的法向量的投影長度(projective length),這個在高中數學有提到過。這邊我們用大寫的W, X分別表示係數矩陣以及資料矩陣,以簡化運算符號,x ’代表平面上一個點,接下來,我們把上述式子進一步簡化,就會變成:

Source:林軒田 機器學習技法

跳的步驟有點多,但我這邊沒有要證明數學理論的意思,如果有興趣的朋友可以去Youtube上搜尋林軒田老師的機器學習技法,會有非常仔細的講解,當然這邊的重點是,我們以上的問題等同於在求解1/2矩陣相乘的最小值,加上一個限制條件,這個限制條件是怎麼來的,簡單來說就是對於每一個資料Xn他能夠因為法向量長度不同而有不同的縮放,但實際上這個長度不同表達的是同一條直線,比如WX+b跟2WX+2b實際上是一樣的。

接下來就是要找到這個問題的解,這個問題是一個QP問題(Quadratic Programming),也就是求解一個二次函數的最小值,我們可以用微積分的拉格朗日乘子方法去取得最佳解(當然也有其他方法),這邊不再贅述,但附上延伸閱讀有興趣的讀者可以研究:

如果講到這裡還是沒有概念的話,可以看以下這張圖:

Source:Simon Tong & Edward Chang

上面的圖片是經過Kernel Function做高維映射後的資料,但這邊先不用管這件事,只要明白的是SVM的重點在於找到一個超平面去盡可能地分割開不同的資料點就可以了。

支持向量迴歸(Support Vector Regression)

SVM有很多拓展,比方說Soft-Margin SVM或是Least-Square SVM,這邊我們用Tube-Regression來進行下去。這邊貼一下所有SVR家族,基本上是每一行來算的,這邊我們要談的是第二行 :

Source:林軒田 機器學習技法

我們把上一段的思路拓展到迴歸問題,我們知道,之前說過的迴歸問題實際上就是最小化點到迴歸線的距離,那SVR的思路也是一樣,我們拓展出一條超平面之後,去計算其他點到超平面的總距離,唯一不同的是,在平面涵蓋到的點距離我們就不考慮,圖示如下:

Source:林軒田 機器學習技法

這邊僅介紹 L2-Regularized Tube Regression,概念承襲自Kernel Ridge Regression,有興趣的朋友也可以在林軒田老師的機器學習技法找到Kernel Regression的模型教學,這邊就不再多說,但我們用一張圖片迅速看一下Kernel Function的目的:

Source:WikiDoc.Net

某些在低維度很難以用平面分隔的資料,透過映射到高維度以後,就可以產生一組超平面來分割資料了。

而模仿SVM,同樣的道理,我們要最佳化的函數會變成:

Source:林軒田 機器學習技法

這實際上是一個L2-Regularization的問題,後面比較長的部分就如同我們上面提到的,是加總之後所有點到該平面的距離,前面的部分則是根據SVM推導過後得來的結論,接下來我們透過拆解絕對值讓這個問題變成一個QP問題,就可以用我們剛才的方式去求解了。最後,我們透過Dual去移除掉當前SVM必須建立在Z維度上的問題,這個部分是SVM的Duality性質,但這邊也就不再多說僅附連結,否則篇幅會真的超長。

延伸閱讀:

執行SVR模型

我們從e1071這個package來調用SVM函數,並且將type調整成eps-regression(預設的迴歸模型),分別去對TSMC的股價以及其滯後一階的價格來做擬合,最後視覺化如下:

這樣的模擬看上去有點奇怪,但我們可以去修正一下圖表來看更精確的結果,我們將X軸設定為落後一期的價格,並將Y軸設定為TSMC價格就會得到這樣的結果:

很明顯可以看到這樣的圖表更加賞心悅目一些,黑色線是真實價格的變化,而藍色線則是我們擬合出來的結果,當然黑色線的震盪實際上是因為前後期價格變化的波動,而藍色線則給出了一個合理的預估值,也因此我們就可以拿之後的價格去提前猜測下一期的價格應該會落在多少。

比較模型績效

所以機器學習擬合出來的模型效果真的比較好嗎? 我們拿一般的落後一期線性迴歸來比較看看,作圖如下:

我們可以看到SVR(藍色線)跟Linear Regression(紅色線)有些微的偏移差異,這個偏移差異能不能表示更好的模型績效,其實要看情況而定,舉例來說我們用RMSE來檢驗看看模型績效的話:

很顯然地,我們並沒有打敗一個簡單的線性迴歸模型(2.25>1.7),因此我們就必須對模型參數修正或是換一個模型,而後續的選擇與調整就見仁見智,使用者切記要多嘗試幾種不同的模型看看。

事實上,支持向量機在十多年前在機器學習的表現上一直非常漂亮,這很大一部分得力於它可以進行維度映射並進行非線性的預測,如果資料分布的更加散亂,有可能SVR模型就能夠相對Linear Regression取得更亮眼的成績。如果讀者還記得剛才我們提到的Tube Regression的概念,SVR的宗旨在於找出一條管狀區域並且對區域外的點做預測,如果管內的資料太多,反而SVR沒有辦法取得很好的績效,這一點就值得注意。

結尾

雖然我並不打算在這個系列中深談ML/DL,畢竟這篇的宗旨還是自學R語言,但是下一篇我們還會繼續機器學習,會談到在過去兩三年資料科學競賽中非常熱門的一個模型:XGBoost,作為熟悉R語言操作機器學習與深度學習技術的一個熱身,如果大家喜歡我的文章,還請幫忙按Clap喔!

R 語言自學系列

About a self-taught diary on R Language programming and practical Time Series Analysis, made by a python user and BBA student. Hope you like it:)

Edward Tung

Written by

NTU Undergrad || Data Science Enthusiast || Business Consultant

R 語言自學系列

About a self-taught diary on R Language programming and practical Time Series Analysis, made by a python user and BBA student. Hope you like it:)

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade