帶上R語言,學習支持向量機
1 R語言
長話短說,R語言是一款集統計分析和作圖於一體的自由、免費、可編程軟件(R3.6.1下載地址:https://mirrors.tuna.tsinghua.edu.cn/CRAN/ )。Rstudio是R語言的IDE,在編程過程中有自動擴寫、使用界面help、創建R-markdown、project、以及各種快捷方式的使用,所以大多都會用Rstudio進行工作。【tip:Rstuidio需要在安裝R語言后才能正常工作,下載地址:https://rstudio.com/products/rstudio/download/#download 】
在R語言里,你想要實現t檢驗,方差分析,模型建立等,都要使用相應函數。那么,函數在哪里?在各個不同的安裝包里:你需要使用的函數在哪個包,你就下載使用哪個包。在根據函數里的參數,設置相應條件即可。
那么,怎么知道需要使用安裝包:
1)R語言是有base包的,這個包你不需要下載,里面就有很多基礎函數供你選擇。當你需要實現某個功能時,百度一下,你就知道需要應該使用哪個函數;
2)如果你輸入的相應函數,R語言提示錯誤,那就說明,你需要安裝相應的包。
R語言需要知道的安裝包基礎:
1)安裝包:install.packages(“PackageName”)【有引號】
2)應用包:library(PackageName)【沒有引號】
3)可以使用包里的自帶函數了。
2 支持向量機
2.1 簡要說明
l SVM是一種有監督二分類機器學習模型,包括線性可分SVM和非線性可分SVM;
l 線性可分時,可用硬間隔和軟間隔最大化學習SVM。線性不可分時,通過核技巧和軟間隔最大化學習SVM;
l 當SVM訓練完成后,大部分樣本都不需要保留,最終模型只與支持向量有關;
https://zhuanlan.zhihu.com/p/77750026
2.2 解釋:什么是支持向量
支持向量機的原理,是想要在分類數據中,找到一個平面,把兩類數據分開。這樣的平面可能有很多,但要找到一面最優的:兩類數據中,距離分離平面最近的樣本點的距離最大,就是最優的分離超平面(使margin最大),樣本中距離超平面最近的一些點,就叫支持向量,如圖:
帶上R語言,學習支持向量機
1 R語言
長話短說,R語言是一款集統計分析和作圖於一體的自由、免費、可編程軟件(R3.6.1下載地址:https://mirrors.tuna.tsinghua.edu.cn/CRAN/ )。Rstudio是R語言的IDE,在編程過程中有自動擴寫、使用界面help、創建R-markdown、project、以及各種快捷方式的使用,所以大多都會用Rstudio進行工作。【tip:Rstuidio需要在安裝R語言后才能正常工作,下載地址:https://rstudio.com/products/rstudio/download/#download 】
在R語言里,你想要實現t檢驗,方差分析,模型建立等,都要使用相應函數。那么,函數在哪里?在各個不同的安裝包里:你需要使用的函數在哪個包,你就下載使用哪個包。在根據函數里的參數,設置相應條件即可。
那么,怎么知道需要使用安裝包:
1)R語言是有base包的,這個包你不需要下載,里面就有很多基礎函數供你選擇。當你需要實現某個功能時,百度一下,你就知道需要應該使用哪個函數;
2)如果你輸入的相應函數,R語言提示錯誤,那就說明,你需要安裝相應的包。
R語言需要知道的安裝包基礎:
1)安裝包:install.packages(“PackageName”)【有引號】
2)應用包:library(PackageName)【沒有引號】
3)可以使用包里的自帶函數了。
2 支持向量機
2.1 簡要說明
l SVM是一種有監督二分類機器學習模型,包括線性可分SVM和非線性可分SVM;
l 線性可分時,可用硬間隔和軟間隔最大化學習SVM。線性不可分時,通過核技巧和軟間隔最大化學習SVM;
l 當SVM訓練完成后,大部分樣本都不需要保留,最終模型只與支持向量有關;
2.2 解釋:什么是支持向量
支持向量機的原理,是想要在分類數據中,找到一個平面,把兩類數據分開。這樣的平面可能有很多,但要找到一面最優的:兩類數據中,距離分離平面最近的樣本點的距離最大,就是最優的分離超平面(使margin最大),樣本中距離超平面最近的一些點,就叫支持向量,如圖:
如果二維平面無法線性可分,則選用核函數將數據映射至三維層面,此時,也會找到一面最優的分離超平面,如圖:
距離超平面最近的樣本點,即為支持向量。
2.3 解釋:最大間隔-硬間隔-軟間隔
線性可分支持向量機對應着能將數據正確划分並且間隔最大的直線,間隔最大是為了讓離超平面較近的異類點之間能有更大的間隔,即不必考慮所有樣本點。以最小的成本保證最大的正確划分概率。那么,這個最大距離怎么算?
超平面划分可通過如下公式表示:
其中,為法向量,決定了超平面的方向,為位移量,決定了超平面與原點的距離。如果超平面能夠將訓練集數據()正確划分,應滿足以下公式:
上面左邊公式被稱為最大間隔假設, 表示樣本為正樣本, 表示樣本為負樣本。滿足以上右式的樣本,即為支持向量。而不同類支持向量之間的間隔,等於兩個異類支持向量的差在方向上的投影。所以,要想間隔最大化,就有了以下約束條件:
采用拉格朗日乘子法對其對偶問題求解(引入變量),對和進行偏導帶入拉格朗日函數,就可以將原問題轉為關於的問題。最終返回函數,即可得到進而求得。即得到最大間隔超平面。
硬間隔指:完全分類准確,其損失函數不存在;對數據質量和SVM要求很高;
軟間隔:允許一定量的樣本分類錯誤。在線性不可分的數據下,均使用軟間隔最大化學習支持向量機模型。
2.4 核函數
核函數是應對數據線性不可分情形產生的,如果原始空間維數是有限的,即屬性有限,那么一定存在一個高維特征空間使樣本可分。支持向量機包括5種核函數:線性核、多項式核、高斯核、拉普拉斯核及sigmoid核。其函數表達如下表所示:
令表示將映射后的特征向量,於是在特征空間中,划分超平面所對應的的模型可表示為:
與最大間隔算法步驟相同,得到約束函數:
其對偶問題運算涉及到特征空間之后的內積,而特征空間的維數可能很高,甚至是無窮維,所以此路不是一條好路,有可能會撞牆。因此,核函數就登場了。特征空間之后的內積此時可轉化為在原始樣本空間中通過函數 κ()計算的函數值。有了核函數,最終對超平面求解為:
實際操作中,樣本量不同,參數設置不同,所以大家的核函數也不同。
3 R語言實現支持向量機(以影像組數數據為例)
數據:使用工作中的影像數據為例,樣本量85,特征數28(T2序列的影像特征經數據預處理及Lasso回歸得到),預測變量五年生存率。
方法:支持向量機建立模型(svm)、Roc曲線表征模型(需要包:pRoc),采用70%樣本進行訓練,剩余30%樣本進行預測。
結果:模型AUC值為0.88。
具體代碼及結果如下:
3.1 需要包加載
library(e1071) # 支持向量機建模
library(pROC) # 用於計算ROC,前者用於plot畫法,后者用於ggplot畫法
library(magrittr) # 我主要使用它的管道函數,使代碼看起來更優雅,思路更清晰
3.2 數據讀入
setwd("I:\\9-SWH論文合作") # 設置工作路徑
files <- list.files() # 列出工作路徑所有文件
RadiomicsData <- read.csv(files[8]) # 讀取需要數據集
# str(RadiomicsData) # 查看數據集結構、指標類別
RadiomicsData <- RadiomicsData[,-1] # 我的第一列是行數,我不需要,因此刪掉它
3.3 建模,作圖
Rows <- nrow(RadiomicsData) # 樣本數【多少行即多少人】
TrainRows <- sample(1:Rows,0.7*Rows %>% round(0),replace = F) # 選定訓練集樣本
Trainsvm <- RadiomicsData[TrainRows,] # 訓練集確定
Testsvm <- RadiomicsData[-TrainRows,] # 測試集確定
Modelsvm1 <- svm(as.factor(Variable)~.,data = Trainsvm,scale = T,kernel="sigmoid") # 模型建立
Presvm2 <- predict(Modelsvm,Testsvm[,-ncol(Testsvm)]) # 以上訓練的模型對測試集進行驗證
解釋:1:e1071包的函數svm用於支持向量機模型構建,可使用模型參數如下表所示:
參數 |
解釋 |
formula |
你要做的模型表示【as.factor(Variable)~. 意思是Variable是相應變量,其余都是因變量】 |
data |
模型使用的數據框,這個數據框中包含了fomula里所有的變量 |
x |
可以是數據框類型,也可以是矩陣類型,也可以是向量類型(as.factor將數值型變量轉換成因子型變量了) |
y |
響應變量,如果是因子型就會做分類模型,如果是數值型就會做回歸模型 |
scale |
將使用的數據歸一化,默認情況下,函數會將使用數據轉變為均值為0,方差為1的標准數據集 |
type |
支持向量機可以用作分類機、回歸機或新穎性檢測。根據y是否是一個因子,type的默認設置分別是C-classification或epd -regression,但是可以根據需要設置成如下幾種:C-classification,nu-classification,one-classification (for novelty detection),eps-regression;nu-regression |
kernel |
用於訓練和預測的核函數。根據響應變量類型,可以選用的核函數為:linner,polynomial,radial basis,sigmoid |
degree |
如果kenel選擇了polynomial,則需要設置此參數,默認值為3 |
gamma |
除了kernel為linear外的核函數,都需要設置此參數,默認為: 1/(data dimension) |
coef0 |
核函數為polynomial何sigmoid,需要設置此參數,默認為0 |
cost |
懲罰系數,默認值為1-它是拉格朗日公式中正則化項的“C”常數 |
nu |
type為nu-classification, nu-regression, 和 one-classification時,需設置此函數 |
class.weights |
不同類別的權重向量,當數據類別分布不平衡時使用,默認為1 |
cachesize |
緩存內存(默認為40 MB) |
tolerance |
模型容忍度,默認是0.001 |
epsilon |
靈敏度損失函數中的epsilon,默認值:0.1 |
shrinking |
默認為T,通常不管這個參數 |
cross |
交叉驗證設置,數據量不大時忽略 |
fitted |
默認為T,通常不管這個參數 |
probability |
是否允許概率預測 |
... |
additional parameters for the low level fitting functionsvm.default |
subset |
指定在訓練樣本中使用的案例的索引向量。(注意:如果給定索引向量,這個參數必須准確命名。) |
na.action |
遇到數據集中有NA值的操作,默認是na.omit操作,即將有na的所有行直接刪掉 |
2:predict函數是base包函數,第一個參數是建立的模型,第二個參數是輸入的待預測數據集。因為模型是用全部因變量建立的,所以輸入的數據集要將測試集的響應變量刪去。Predict后的結果就是預測的響應變量值,將其與真實值作比較,就知道模型如何。
3.4 pRoc作圖
PicPRoc <- roc(Presvm,Testsvm[,ncol(Testsvm)]) #運用pRoc包的roc函數計算roc
PicPRoc
## Call:
## roc.default(response = Presvm, predictor = Testsvm[, ncol(Testsvm)])
##
## Data: Testsvm[, ncol(Testsvm)] in 25 controls (Presvm 0) < 1 cases (Presvm 1).
## Area under the curve: 0.82
plot(PicPRoc,xlim=c(1,0),ylim=c(0,1),main = "ROC Curve in Model SVM",xlab = "specitivity",ylab = "sensitivity") %>% print()