机器学习算法-随机森林初探(1)
機器學習算法-隨機森林之理論概述
表達數據集來源于 https://file.biolab.si/biolab/supp/bi-cancer/projections/。
為了展示隨機森林的能力,我們用一套早期的淋巴瘤基因表達芯片數據集,包含77個樣品,2個分組和7070個變量。
讀入數據
expr_file <- "DLBCL.expr.txt" metadata_file <- "DLBCL.metadata.txt"# 每個基因表達值是內部比較,只要是樣品之間標準化的數據即可,其它什么轉換都關系不大 expr_mat <- read.table(expr_file, row.names = 1, header = T, sep="\t")metadata <- read.table(metadata_file, row.names=1, header=T, sep="\t")dim(expr_mat)## [1] 7070 77基因表達表
expr_mat[1:4,1:5]## DLBCL_1 DLBCL_2 DLBCL_3 DLBCL_4 DLBCL_5 ## A28102 -1 25 73 267 16 ## AB000114_at -45 -17 91 41 24 ## AB000115_at 176 531 257 202 187 ## AB000220_at 97 353 80 138 39Metadata表
head(metadata)## class ## DLBCL_1 DLBCL ## DLBCL_2 DLBCL ## DLBCL_3 DLBCL ## DLBCL_4 DLBCL ## DLBCL_5 DLBCL ## DLBCL_6 DLBCL樣品篩選和排序
對讀入的表達數據進行轉置。通常我們是一行一個基因,一列一個樣品。在構建模型時,數據通常是反過來的,一列一個基因,一行一個樣品。每一列代表一個變量 (variable),每一行代表一個案例 (case)。這樣更方便提取每個變量,且易于把模型中的x,y放到一個矩陣中。
樣本表和表達表中的樣本順序對齊一致也是需要確保的一個操作。
# 表達數據轉置 # 習慣上我們是一行一個基因,一列一個樣品 # 做機器學習時,大部分數據都是反過來的,一列一個基因,一行一個樣品 # 每一列代表一個變量 expr_mat <- t(expr_mat) expr_mat_sampleL <- rownames(expr_mat) metadata_sampleL <- rownames(metadata)common_sampleL <- intersect(expr_mat_sampleL, metadata_sampleL)# 保證表達表樣品與METAdata樣品順序和數目完全一致 expr_mat <- expr_mat[common_sampleL,,drop=F] metadata <- metadata[common_sampleL,,drop=F]判斷是分類還是回歸
如果group對應的列為數字,轉換為數值型 - 做回歸
如果group對應的列為分組,轉換為因子型 - 做分類
隨機森林初步分析
library(randomForest)# 查看參數是個好習慣 # 有了前面的基礎概述,再看每個參數的含義就明確了很多 # 也知道該怎么調了 # 每個人要解決的問題不同,通常不是別人用什么參數,自己就跟著用什么參數 # 尤其是到下游分析時 # ?randomForest加載包之后,直接分析一下,看到結果再調參。(竟然被awk生成的隨機數給整蒙了,也談隨機數生成種子)
# 設置隨機數種子,具體含義見 https://mp.weixin.qq.com/s/6plxo-E8qCdlzCgN8E90zg set.seed(304)# 直接使用默認參數 rf <- randomForest(expr_mat, metadata$class)查看下初步結果, 隨機森林類型判斷為分類,構建了500棵樹,每次決策時使用了84個基因,OOB估計的錯誤率是12.99%,挺高的。
分類效果評估矩陣Confusion matrix,顯示DLBCL組的分類錯誤率為0.034,FL組的分類錯誤率為0.42。這是隨機森林的默認操作,樣本量多的分類錯誤率會低 (后面我們再調整)。
rf## ## Call: ## randomForest(x = expr_mat, y = metadata$class) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 84 ## ## OOB estimate of error rate: 12.99% ## Confusion matrix: ## DLBCL FL class.error ## DLBCL 56 2 0.03448276 ## FL 8 11 0.42105263隨機森林參數調試 - 決策樹的數目
增加決策樹的數目到1000測試下分類率是否會降低。OOB估計的錯誤率是11.69%,還是不低。
分類效果評估矩陣Confusion matrix,顯示DLBCL組的分類錯誤率為0.017,FL組的分類錯誤率為0.42。也都略有降低。
set.seed(304) rf1000 <- randomForest(expr_mat, metadata$class, ntree=1000) rf1000## ## Call: ## randomForest(x = expr_mat, y = metadata$class, ntree = 1000) ## Type of random forest: classification ## Number of trees: 1000 ## No. of variables tried at each split: 84 ## ## OOB estimate of error rate: 11.69% ## Confusion matrix: ## DLBCL FL class.error ## DLBCL 57 1 0.01724138 ## FL 8 11 0.42105263增加決策樹的數目到2000測試下分類率是否會降低。OOB估計的錯誤率是11.69%沒有變化。
分類效果評估矩陣Confusion matrix,顯示DLBCL組的分類錯誤率為0.017,FL組的分類錯誤率為0.42。FL組樣品量少,分類效果還是不好。
set.seed(304) rf2000 <- randomForest(expr_mat, metadata$class, ntree=2000) rf2000## ## Call: ## randomForest(x = expr_mat, y = metadata$class, ntree = 2000) ## Type of random forest: classification ## Number of trees: 2000 ## No. of variables tried at each split: 84 ## ## OOB estimate of error rate: 11.69% ## Confusion matrix: ## DLBCL FL class.error ## DLBCL 57 1 0.01724138 ## FL 8 11 0.42105263繪制下從第1到2000棵樹時,OOB的變化趨勢是怎樣的?從這張圖可以看到,600棵樹之后,基本沒有影響了。
library(ggplot2)YSX::sp_lines(as.data.frame(rf2000$err.rate), manual_color_vector="Set2", x_label="Number of trees", y_label="Error rate",line_size=0.6,width=6, height=4)隨機森林參數調試 - 用于決策的變量的數目 (m)
影響隨機森林的第二個參數(m): 構建每棵決策樹時隨機抽取的變量的數目。(假設你已閱讀過了機器學習算法-隨機森林之理論概述)。在randomForest函數中有一個參數mtry即是做這個的。在處理分類問題時,其默認值為sqrt(p);處理回歸問題時,其默認值為p/3;p是總的變量數目。
我們先人工測試幾個不同的mtry看下效果。mtry=20時錯誤率為15.58%。
# 增加樹的數目沒有給出好的結果,這里還是用的默認的500棵樹以便獲得較快的運行速度 set.seed(304) rf_mtry20 <- randomForest(expr_mat, metadata$class, mtry=20) rf_mtry20## ## Call: ## randomForest(x = expr_mat, y = metadata$class, mtry = 20) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 20 ## ## OOB estimate of error rate: 15.58% ## Confusion matrix: ## DLBCL FL class.error ## DLBCL 57 1 0.01724138 ## FL 11 8 0.57894737我們先人工測試幾個不同的mtry看下效果。mtry=50時錯誤率為11.69%(默認使用了84個變量,準確率為12.99)。
# 增加樹的數目沒有給出好的結果,這里還是用的默認的500棵樹以便獲得較快的運行速度 set.seed(304) rf_mtry50 <- randomForest(expr_mat, metadata$class, mtry=50) rf_mtry50## ## Call: ## randomForest(x = expr_mat, y = metadata$class, mtry = 50) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 50 ## ## OOB estimate of error rate: 11.69% ## Confusion matrix: ## DLBCL FL class.error ## DLBCL 57 1 0.01724138 ## FL 8 11 0.42105263我們先人工測試幾個不同的mtry看下效果。mtry=100時錯誤率為11.69%。
# 增加樹的數目沒有給出好的結果,這里還是用的默認的500棵樹以便獲得較快的運行速度 set.seed(304) rf_mtry100 <- randomForest(expr_mat, metadata$class, mtry=100) rf_mtry100## ## Call: ## randomForest(x = expr_mat, y = metadata$class, mtry = 100) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 100 ## ## OOB estimate of error rate: 11.69% ## Confusion matrix: ## DLBCL FL class.error ## DLBCL 57 1 0.01724138 ## FL 8 11 0.42105263一個個測試也不是辦法,tuneRF給我們提供了一個根據OOB值迭代鑒定最合適的mtry值的函數。(測試幾次,不太好用,改一個stepfactor,結果變化很大)
# mtryStart: 從多少個變量開始嘗試,可用默認值。程序會自動向更多變量或更少變量迭代。 # ntreeTry: 迭代時構建多少棵樹,這里設置為500,與我們上面獲得的效果比較好的樹一致。 # stepFactor: 迭代步長,mtryStart向更多變量迭代時乘以此值;mtryStart向更少變量迭代時除以此值。 # improve:如果迭代不能給OOB帶來給定值的改善,則停止迭代。 set.seed(304) tuneRF(expr_mat, metadata$class, ntreeTry=500, stepFactor=1.1, improve=1e-5)## mtry = 84 OOB error = 12.99% ## Searching left ... ## mtry = 77 OOB error = 10.39% ## 0.2 1e-05 ## mtry = 70 OOB error = 11.69% ## -0.125 1e-05 ## Searching right ... ## mtry = 92 OOB error = 11.69% ## -0.125 1e-05## mtry OOBError ## 70.OOB 70 0.1168831 ## 77.OOB 77 0.1038961 ## 84.OOB 84 0.1298701 ## 92.OOB 92 0.1168831randomForest自帶了另一個函數rfcv,通過嵌套交叉驗證方式評估了根據變量重要性降低預測變量后的模型的性能。
result = rfcv(expr_mat, metadata$class, cv.fold=10) result$error.cv## 7070 3535 1768 884 442 221 110 55 28 14 7 ## 0.10389610 0.11688312 0.10389610 0.09090909 0.09090909 0.09090909 0.09090909 0.10389610 0.10389610 0.12987013 0.14285714 ## 3 1 ## 0.15584416 0.15584416后面我們詳細講下交叉驗證這個最常用的評估模型的方法。
往期精品(點擊圖片直達文字對應教程)
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
?
(請備注姓名-學校/企業-職務等)
總結
以上是生活随笔為你收集整理的机器学习算法-随机森林初探(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整合基因组学和蛋白质结构的致病机制分析
- 下一篇: ggplot2之配对数据差异比较及结果可