PCA結(jié)合SVM如何實(shí)現(xiàn)分類預(yù)測(cè)分析?看這篇就夠了!

? ? ? ?很多小伙伴最近都問小云,能不能推薦一下不同算法結(jié)合展開的分析?收到!今天小云就特地準(zhǔn)備了一個(gè)PCA結(jié)合SVM的臨床樣本分類預(yù)測(cè)分析案例,通過這個(gè)案例分析希望可以讓小伙伴們有所收獲!
? ? ? ?在之前我們已經(jīng)介紹過PCA算法和SVM算法的理論概念,那么在這里便不再一一介紹,整體分析的目的就是使用PCA對(duì)數(shù)據(jù)進(jìn)行降維,然后利用降維后的數(shù)據(jù)來構(gòu)建并訓(xùn)練SVM模型,最后使得模型具備預(yù)測(cè)臨床分析結(jié)果的功能。
? ? ? ?首先我們介紹一下接下來的分析用到的數(shù)據(jù)集,我們用的是一種疾病患者的臨床數(shù)據(jù),共包含392個(gè)樣本,先來看一下數(shù)據(jù)樣例

這個(gè)數(shù)據(jù)每行對(duì)應(yīng)一個(gè)樣本,包含10個(gè)特征,最后一個(gè)特征group為目標(biāo)特征,也就是樣本的類別,包含control和case兩種。
#收費(fèi)區(qū)域
介紹完數(shù)據(jù),開始期待的代碼部分吧!
代碼部分
#導(dǎo)入相關(guān)R包和數(shù)據(jù)
library(e1071)
library(“pROC”)
library(tidyverse)
library(ggplot2)
data<-read.csv("data.csv")
head(data)
#數(shù)據(jù)預(yù)處理
#由于部分特征為非數(shù)值數(shù)據(jù),所以需要進(jìn)行轉(zhuǎn)換
data$sex[data$sex=="male"]<-1
data$sex[data$sex=="female"]<-0
data$dishistory[data$dishistory=="yes"]<-1
data$dishistory[data$dishistory=="no"]<-0
data$sex=as.numeric(data$sex)
data$dishistory=as.numeric(data$dishistory)
#數(shù)據(jù)標(biāo)準(zhǔn)化
data2=scale(data[,1:9])
#使用prcomp計(jì)算PCA
pca1<-prcomp(data2[,-ncol(data2)],center=TRUE,scale=TRUE)
#輸出PCA結(jié)果
pca1$rotation
#查看PCA特征方差
summary(pca1)
pca2 <- predict(pca1)[,1:2] # 計(jì)算出PCA對(duì)應(yīng)的值
pca2 <- data.frame(pca2) # 轉(zhuǎn)化成data.frame
#添加種類特征
pca2$type=data$group
#PCA關(guān)鍵特征散點(diǎn)圖
pca2%>%
ggplot(aes(x = PC1, y = PC2, color = type)) +
geom_point() +stat_ellipse()

由上圖可以看出PCA降維結(jié)果較好,其中PCA1和PCA2軸可以較好的區(qū)分臨床樣本的兩種種類。于是我們使用這兩個(gè)新特征來訓(xùn)練SVM模型,進(jìn)行進(jìn)一步的分析。
#數(shù)據(jù)集劃分
pca2$type<-factor(pca2$type)
sub<-sample(1:392,260)#260個(gè)樣例作為訓(xùn)練集,其余作為測(cè)試集
train<-pca2[sub,]
test<-pca2[-sub,]
#構(gòu)建SVM模型
svm_model = svm(type~.,data=train,knernel = "radial")
#查看模型信息
summary(svm_model)

#測(cè)試集分類預(yù)測(cè)
svm_pred=predict(svm_model,test,decision.values = TRUE)
test$svm_pred = svm_pred
head(test)
table(test$type,test$svm_pred,dnn=c("真實(shí)值","預(yù)測(cè)值"))

#繪制ROC曲線
ran_roc <- roc(test$type,as.numeric(svm_pred))
plot(ran_roc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE,main='SVM模型ROC曲線')

? ? ? 我們把數(shù)據(jù)分成了case和control兩組,其中包含34個(gè)case和98個(gè)control,SVM模型預(yù)測(cè)case分組有5個(gè)錯(cuò)誤,預(yù)測(cè)control分組有1個(gè)錯(cuò)誤,預(yù)測(cè)錯(cuò)誤的樣本非常少,這即說明利用PCA技術(shù)對(duì)數(shù)據(jù)進(jìn)行降維后的特征可以很好地區(qū)分樣本種類,同時(shí)說明降維后的數(shù)據(jù)來訓(xùn)練SVM模型具有很高的預(yù)測(cè)準(zhǔn)確率。于此同時(shí),為了更加直觀展示其預(yù)測(cè)準(zhǔn)確率,我們繪制了ROC曲線圖,如上圖所示,其顯示最后利用SVM來預(yù)測(cè)樣本分類準(zhǔn)確率達(dá)到了92.1%!開放思維來想,這個(gè)方法能不能用來分析我們生信方向存在的一些多特征多分類問題呢?答案當(dāng)然是可以的。怎么樣,簡(jiǎn)單吧!縱觀全文,整個(gè)分析思想非常直觀,但細(xì)節(jié)仍然要注意哦!
? ? ? 分析到這里就結(jié)束啦!小伙伴們是不是感覺眼前一亮?當(dāng)時(shí)小云在完成分析后也是開心了很久,想著可以要是可以給小伙伴們帶來啟發(fā)那真是太好了!大家也不要偷懶哦!快去動(dòng)手自己嘗試一下!
(推薦一下小云新開發(fā)的零代碼云生信分析工具平臺(tái)包含超多零代碼小工具,上傳數(shù)據(jù)一鍵出圖,感興趣的小伙伴歡迎來參觀喲,網(wǎng)址:http://www.biocloudservice.com/home.html)
