国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【機器學習】R語言實現(xiàn)隨機森林、支持向量機、決策樹多方法二分類模型

這篇具有很好參考價值的文章主要介紹了【機器學習】R語言實現(xiàn)隨機森林、支持向量機、決策樹多方法二分類模型。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

暑期簡單學習了機器學習理論知識,當時跟著B站咕泡老師學的,內容講得蠻詳細,實例代碼、資料都比較全面,但是學校Python課程開設在這學期,所以用Python進行數(shù)據(jù)分析、建模等不是很熟悉,所以決定用之前學過的R語言來實現(xiàn)機器學習。R語言的相關包也都比較完善,所以想分享一下近期使用R語言實現(xiàn)分類預測建模遇到的問題及解決方法,并且會系統(tǒng)地分享一下幾種常見ML二分類方法實現(xiàn)及代碼。

數(shù)據(jù)預處理

我使用的是GEO數(shù)據(jù)庫中的乳腺癌轉移相關的基因表達譜數(shù)據(jù)(GSE2034、GSE1456),前面一個數(shù)據(jù)集作為訓練集,后面一個數(shù)據(jù)集作為測試集。

我先使用MATLAB對mat數(shù)據(jù)文件進行讀入,接著進行t檢驗,篩選出有極顯著差異(P<0.01)的基因,對兩個數(shù)據(jù)集的基因作交集(并刪除重復基因)得到765個特征,以及一個類標簽(1表示預后好,2表示預后差)。

z-score標準化

z-score適用于數(shù)據(jù)分布過于凌亂、數(shù)據(jù)的最大值與最小值未知,或者數(shù)據(jù)中存在過多的離群值的情況。在進行聚類分析、因子分析、主成分分析等多元統(tǒng)計分析時,通常采用這種方法。

在R語言中,可以使用scale函數(shù)實現(xiàn)z-score標準化。

GSE_train <- read.csv("train_data.csv") #以GSE2034為訓練集,這里已為預處理后的差異表達數(shù)據(jù)以及預后label數(shù)據(jù)
GSE_train <- as.data.frame(GSE_train)
GSE_train[,2:766] <- scale(GSE_train[,2:766]) #z-score標準化,第一列為類標簽不需要標準化
View(GSE_train)

GSE_test <- read.csv("test_siggene.csv") #以GSE1456為測試集,這里已為預處理后的差異表達數(shù)據(jù)以及預后label數(shù)據(jù)
GSE_test <- as.data.frame(GSE_test)
GSE_test[,2:766] <- scale(GSE_test[,2:766]) #z-score標準化
View(GSE_test)

下圖展示的是GSE2034的標準化后的數(shù)據(jù)?

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹


SMOTE處理樣本不平衡問題

在這里我注意到,預后標簽1和2的數(shù)量分布不平衡。在機器學習中,訓練數(shù)據(jù)中不同類別的樣本數(shù)量分布不均衡可能會導致在訓練過程中過多關注數(shù)量較多的類別,忽略數(shù)量較少的類別,從而使得預測準確率降低。

重采樣方法主要有兩種,一種是欠采樣,即減少數(shù)量較多類別的樣本數(shù)量;另一種是過采樣,即增加數(shù)量較少類別的樣本數(shù)量。兩種方法各有優(yōu)劣,這里我使用過采樣方法。

GSE2034預后標簽分布
1(預后好) 2(預后差)
134 59

比較討厭的是,我在使用R語言DMwR包來加載SMOTE函數(shù)時,發(fā)現(xiàn)這個包已經不存在了。在我搜索后,發(fā)現(xiàn)它是在DMwR2包里面的smotefamily中,所以可以安裝DMwR2包來使用smote函數(shù)。需要注意的是,更新后的SMOTE算法與之前的使用方式不太相同(參數(shù)設置不同),可在安裝加載smotefamily后,使用help(SMOTE)來參看具體用法。

library(DMwR2) #加載相關包
library(smotefamily)

set.seed(123)
sub <- sample(nrow(GSE_train),nrow(GSE_train)*0.7) #這里不能將所有訓練集都進行過采樣,取70%或其它
train <- GSE_train[sub,]
smote_data <- SMOTE(train[,-1], train[,1]) #使用DMwR2包的SMOTE函數(shù)進行過采樣
newdata <- smote_data$data  #檢查經過SMOTE處理后的類別分布
table(newdata$class)

?進行SMOTE平衡后,樣本分布為:?

1(預后好) 2(預后差)
134 118

隨機森林(Random Forest)

模型訓練和預測

library(randomForest) #加載相關包
library(pROC)
#模型訓練
set.seed(123) #設置隨機種子數(shù),確保以后再執(zhí)行代碼時可以得到一樣的結果
newdata$class <- as.factor(newdata$class)  #因變量得為因子型

train.forest <- randomForest(class ~ ., data = newdata,ntree = 200) #用平衡后的數(shù)據(jù)訓練
train.forest

查看模型的結果:

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹

?生成樹時沒有用到的樣本點所對應的類別可由生成的樹估計,與其真實類別比較即可得到袋外預測(out-of-bag,OOB)誤差,即OOB estimate of error rate,可用于反映分類器的錯誤率。此處為為13.49%。

?Confusion matrix比較了預測分類與真實分類的情況,class.error代表了錯誤分類的樣本比例:1組(預后好)的134個樣本中125個正確分類,2組(預后差)的118個樣本中93個正確分類。

分別查看在訓練集GSE2034和測試集GSE1456上的預測結果:

train_probs <- predict(train.forest, GSE_train, type = "prob")[, "1"]
test_probs <- predict(train.forest, GSE_test, type = "prob")[, "1"]

#計算訓練集和測試集的AUC并可視化
train_roc <- roc(GSE_train$Label, train_probs, levels = c("1", "2"))
test_roc <- roc(GSE_test$Label, test_probs, levels = c("1", "2"))
plot(train_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='RF訓練模型ROC曲線')
plot(test_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='RF預測模型ROC曲線')

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹?fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹

模型評估

常見的評估指標除了AUC(ROC曲線下面積),還有F1 score值,準確率,召回率等,在這里,我還計算了accuracy = 113/151 = 0.7483

預測1 預測2
實際1 112(TN) 6(FP)
實際2 32(FN) 1(TP)

?變量重要性

importance_gene <- train.forest$importance
head(importance_gene)

varImpPlot(train.forest, n.var = min(30, nrow(train.forest$importance)),
           main = 'Top 30 genes- variable importance') #作圖展示 top30 重要的Genes

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹

對于上述基因,可以做基因功能注釋或基因本體分析(GO),以分析這些基因與乳腺癌是否有關系。?

支持向量機(Support Vector Machines)

代碼編寫與上述類似,這里直接展示模型完整代碼。

模型訓練和預測

#安裝并加載相關包
library(e1071)
library(pROC)

svm_model <- svm(class~.,data = newdata,kernel = "radial")
summary(svm_model)

##訓練集和測試集預測及AUC曲線
train_pred <- predict(svm_model,GSE_train)
test_pred <- predict(svm_model,GSE_test)
train_roc <- roc(GSE_train$Label, as.numeric(train_pred), levels = c("1", "2"))
test_roc <- roc(GSE_test$Label, as.numeric(test_pred), levels = c("1", "2"))
plot(train_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曲線')
plot(test_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曲線')

SVM有四種核函數(shù),在這里,我分別使用四種核函數(shù)來建模以確定錯誤率最小的核函數(shù)。其中,線性核函數(shù)(linear)錯誤率為10.87%,徑向基核函數(shù)(radial)錯誤率為10.51%,多項式核函數(shù)(polynomial)錯誤率為12.32%,神經網絡核函數(shù)(sigmoid)錯誤率為19.20%,所以選擇徑向基核函數(shù)(radial)來建模。?(代碼如下)

svm_model <- svm(class~.,data = newdata,kernel = "radial") #通過改變kernel核函數(shù)來建模
summary(svm_model)

svm_pred <- predict(svm_model,GSE_train,decision.values = TRUE) #模型預測
tab <- table(Predicted = svm_pred,Actual = GSE_train$Label) #展示二聯(lián)表
tab
1-sum(diag(tab))/sum(tab) #計算錯誤率

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹

模型評估

SVM的AUC較隨機森林的降低,模型的預測準確性降低,此外,SVM的Accuracy = 110/151 =0.7285

預測1 預測2
實際1 110(TN) 8(FP)
實際2 33(FN) 0(TP)

決策樹(Decision Tree)

模型訓練和預測

#加載相關包
library(rpart)
library(tibble)
library(bitops)
library(rattle)
library(rpart.plot)
library(RColorBrewer)
library(ROCR)

#構建決策樹
set.seed(123)
newdata$class <- as.factor(newdata$class)
dt <- rpart(class ~.,data = newdata)
summary(dt)

#訓練集和測試集預測
train.pred <- predict(dt,newdata = GSE_train,type = "class")
test.pred <- predict(dt,newdata = GSE_test,type = "class")
train_roc <- roc(GSE_train$Label, as.numeric(train.pred), levels = c("1", "2"))
test_roc <- roc(GSE_test$Label, as.numeric(test.pred), levels = c("1", "2"))

plot(train_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='DT訓練模型ROC曲線')
plot(test_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='DT預測模型ROC曲線')

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹?

模型評估

從上述ROC曲線可以看出,決策樹的預測準確性最差。再計算一下準確度,Accuracy = 96/151 =0.6358,效果相較前兩種比較差。

預測1 預測2
實際1 83(TN) 35(FP)
實際2 20(FN) 13(TP)
fancyRpartPlot(dt) #看一下目前的決策樹
plotcp(dt)  #畫出xerror和cp值與樹的節(jié)點個數(shù)的關系

fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹fancyrpartplot畫決策樹有哪些參數(shù),機器學習,r語言,隨機森林,支持向量機,決策樹

可在此基礎上對決策樹進行剪枝,選出最優(yōu)決策樹,以期達到更好分類預測的效果。

總結

機器學習建模分析后,還要進行調參或交叉驗證以提高模型的預測率,就是所謂的“煉丹”。評估模型也應該用多種指標,包括F1 score,Accuracy(準確率),召回率,繪制ROC曲線等。此外,機器學習是一個“黑盒子”模型,在得到模型預測結果后,還應該深一步進行生物學解釋,由于目前我的生信分析能力還不足,后續(xù)學習到了再分享~文章來源地址http://www.zghlxwxcb.cn/news/detail-763124.html

到了這里,關于【機器學習】R語言實現(xiàn)隨機森林、支持向量機、決策樹多方法二分類模型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包