暑期簡單學習了機器學習理論知識,當時跟著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ù)?
SMOTE處理樣本不平衡問題
在這里我注意到,預后標簽1和2的數(shù)量分布不平衡。在機器學習中,訓練數(shù)據(jù)中不同類別的樣本數(shù)量分布不均衡可能會導致在訓練過程中過多關注數(shù)量較多的類別,忽略數(shù)量較少的類別,從而使得預測準確率降低。
重采樣方法主要有兩種,一種是欠采樣,即減少數(shù)量較多類別的樣本數(shù)量;另一種是過采樣,即增加數(shù)量較少類別的樣本數(shù)量。兩種方法各有優(yōu)劣,這里我使用過采樣方法。
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
查看模型的結果:
?生成樹時沒有用到的樣本點所對應的類別可由生成的樹估計,與其真實類別比較即可得到袋外預測(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曲線')
?
模型評估
常見的評估指標除了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
對于上述基因,可以做基因功能注釋或基因本體分析(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) #計算錯誤率
模型評估
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曲線')
?
模型評估
從上述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ù)的關系
可在此基礎上對決策樹進行剪枝,選出最優(yōu)決策樹,以期達到更好分類預測的效果。文章來源:http://www.zghlxwxcb.cn/news/detail-763124.html
總結
機器學習建模分析后,還要進行調參或交叉驗證以提高模型的預測率,就是所謂的“煉丹”。評估模型也應該用多種指標,包括F1 score,Accuracy(準確率),召回率,繪制ROC曲線等。此外,機器學習是一個“黑盒子”模型,在得到模型預測結果后,還應該深一步進行生物學解釋,由于目前我的生信分析能力還不足,后續(xù)學習到了再分享~文章來源地址http://www.zghlxwxcb.cn/news/detail-763124.html
到了這里,關于【機器學習】R語言實現(xiàn)隨機森林、支持向量機、決策樹多方法二分類模型的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!