R語言隨機(jī)森林分析全流程

R語言隨機(jī)森林全流程分析

引言

再2023年6月,如果你以Random Forest為關(guān)鍵詞在Google Scholar檢索唯鸭,時間降序须蜗。

image-20230626173703705

你會發(fā)現(xiàn)這些方法用于各個領(lǐng)域的研究:GIS、環(huán)境、遙感(只要有大數(shù)據(jù))

發(fā)表的期刊水平也參差不齊明肮,有Frontiers菱农、Remote Sensing(MDPI)、總環(huán)晤愧。

除了很少有頂尖期刊大莫,但也不乏還不錯的期刊蛉腌,從一區(qū)到四區(qū)官份。為何這個方法一直在使用?這就引出了隨機(jī)森林的幾個優(yōu)點烙丛。

隨機(jī)森林是集成學(xué)習(xí)(Ensemble Learning)舅巷,集成學(xué)習(xí)的基本思想就是將多個分類器組合,從而實現(xiàn)一個預(yù)測效果更好的集成分類器河咽。

隨機(jī)森林既可以勝任分類任務(wù)又可以勝任回歸任務(wù)钠右。機(jī)器學(xué)習(xí)中有兩種任務(wù),回歸和分類忘蟹,而隨機(jī)森林可以同時勝任這兩種任務(wù)飒房。其中分類任務(wù)是對離散值進(jìn)行預(yù)測(比如將一景圖像中的植被,建筑媚值,水體等地物類型分類)狠毯;回歸任務(wù)是對連續(xù)值進(jìn)行預(yù)測(比如根據(jù)已有的數(shù)據(jù)預(yù)測明天的氣溫是多少度,預(yù)測明天某基金的價格)褥芒。

隨機(jī)森林能評估特征的相對重要性嚼松。集成學(xué)習(xí)模型的一大特點是可以輸出特征重要性,特征重要性能夠在一定程度上輔助我們對特征進(jìn)行篩選锰扶,從而使得模型的魯棒性更好献酗。在實際研究中,也能提供一定的物理意義坷牛。

代碼實現(xiàn)

借助于R語言的高效數(shù)據(jù)分析罕偎,我們使用R的randomForest包實現(xiàn)這一效果

數(shù)據(jù)集載入

首先加載數(shù)據(jù)集:

library(tidyverse)
data(airquality)
airquality <- airquality %>% na.omit()
airquality
image-20230626174902091

airquality數(shù)據(jù)集中,Ozone是臭氧變量京闰,其它太陽輻射Solar.R锨亏、風(fēng)速Wind和溫度Temp等等對臭氧的影響。

數(shù)據(jù)訓(xùn)練

這里首先把數(shù)據(jù)集劃分訓(xùn)練集(70%)測試集(30%)

使用randomForest開始訓(xùn)練忙干,其中Ozone~代表臭氧Ozone為因變量器予,其它數(shù)據(jù)為自變量。

# To evaluate the performance of RF
# split traning data (70%) and validation data (30%)
set.seed(123)
train <- sample(nrow(airquality), nrow(airquality)*0.7)
ozo_train <- airquality[train, ]
ozo_test <- airquality[-train, ]
 
# randomForest
library(randomForest)
 
# Random forest calculation(default 500 tress)捐迫,please see ?randomForest
set.seed(123)
ozo_train.forest <- randomForest(Ozone~., data = ozo_train, importance = TRUE)
ozo_train.forest

結(jié)果如圖:

  • 結(jié)果中乾翔,% Var explained體現(xiàn)了預(yù)測變量(太陽輻射,溫度,降水和時間變量)對響應(yīng)變量(臭氧)有關(guān)方差的整體解釋率反浓。

  • 解釋了約70.44%的總方差萌丈,可以理解為該回歸的R2=70.44,相當(dāng)可觀的一個數(shù)值雷则,表明臭氧與這些變量密切相關(guān)

可視化結(jié)果

接下來可視化隨機(jī)森林的回歸效果:

# Scatterplot
library(ggplot2)
library(ggExtra)
library(ggpmisc)
library(ggpubr)

g <- ggplot(train_test, aes(obs, pre)) + 
  geom_point() + 
  geom_smooth(method="lm", se=F) +
  geom_abline(slope = 1,intercept = 0,lty="dashed") +
  stat_poly_eq(
    aes(label =paste( ..adj.rr.label.., sep = '~~')),
    formula = y ~ x,  parse = TRUE,
      family="serif",
      size = 6.4,
      color="black",
      label.x = 0.1,  #0-1之間的比例確定位置
      label.y = 1)

g1 <- ggMarginal(g, type = "histogram", fill="transparent")
g <- ggplot(predict_test, aes(obs, pre)) + 
  geom_point() + 
  geom_smooth(method="lm", se=F) +
  geom_abline(slope = 1,intercept = 0,lty="dashed") +
  stat_poly_eq(
    aes(label =paste( ..adj.rr.label.., sep = '~~')),
    formula = y ~ x,  parse = TRUE,
      family="serif",
      size = 6.4,
      color="black",
      label.x = 0.1,  #0-1之間的比例確定位置
      label.y = 1)

g2 <- ggMarginal(g, type = "histogram", fill="transparent")
ggarrange(g1, g2, ncol = 2)
# ggMarginal(g, type = "boxplot", fill="transparent")
# ggMarginal(g, type = "density", fill="transparent")

如圖所示辆雾,在訓(xùn)練集的擬合效果很好,R2可達(dá)0.94

在測試集上表現(xiàn)也較好月劈,R2可達(dá)0.71

重要性評估

接下來查看變量重要性

##Ozo 的重要性評估
importance_ozo <- ozo_train.forest$importance
importance_ozo
importance_plot <- tibble(var = rownames(importance_ozo), 
                          IncMSE = importance_ozo[,1],
                          IncNodePurity = importance_ozo[,2])

%IncMSE即increase in mean squared error度迂,通過對每一個預(yù)測變量隨機(jī)賦值,如果該預(yù)測變量更為重要猜揪,那么其值被隨機(jī)替換后模型預(yù)測的誤差會增大惭墓。因此,該值越大表示該變量的重要性越大而姐;

IncNodePurity即increase in node purity腊凶,通過殘差平方和來度量,代表了每個變量對分類樹每個節(jié)點上觀測值的異質(zhì)性的影響拴念,從而比較變量的重要性钧萍。該值越大表示該變量的重要性越大。

對于%IncMSEIncNodePurity政鼠,二選一作為判斷預(yù)測變量重要性的指標(biāo)风瘦。需注意的是,二者的排名存在一定的差異缔俄。

image-20230626175657726

對重要性排序進(jìn)行可視化:

p1 <- ggplot(importance_plot, aes(x=var, y=IncMSE)) +
  geom_segment( aes(x=var, xend=var, y=0, yend=IncMSE), color="skyblue") +
  geom_point( color="blue", size=4, alpha=0.6) +
  theme_light() +
  coord_flip() +
  theme(
    panel.grid.major.y = element_blank(),
    panel.border = element_blank(),
    axis.ticks.y = element_blank()
  )
  p2 <- ggplot(importance_plot, aes(x=var, y=IncNodePurity)) +
  geom_segment( aes(x=var, xend=var, y=0, yend=IncNodePurity), color="skyblue") +
  geom_point( color="blue", size=4, alpha=0.6) +
  theme_light() +
  coord_flip() +
  theme(
    panel.grid.major.y = element_blank(),
    panel.border = element_blank(),
    axis.ticks.y = element_blank()
  )
ggarrange(p1, p2, ncol = 2)

可以看到弛秋,溫度Temp是臭氧的一個主要因素

交叉驗證

接下來進(jìn)行五折交叉驗證,來選取超參數(shù)(這里是變量個數(shù)):

  • replicate用于重復(fù)n次所需語句俐载,這里進(jìn)行5次五折交叉驗證
  • rfcv通過嵌套交叉驗證程序顯示模型的交叉驗證預(yù)測性能蟹略,模型的預(yù)測器數(shù)量按順序減少(按變量重要性排序)。
  • step如果log=TRUE遏佣,則為每個步驟要刪除的變量的分?jǐn)?shù)挖炬,否則一次刪除這么多變量
  • cv.fold為折數(shù)
#5 次重復(fù)五折交叉驗證
set.seed(111)
ozo_train.cv <- replicate(5, rfcv(ozo_train[-ncol(ozo_train)], ozo_train$Ozone, cv.fold = 5, step = 0.8), simplify = FALSE)
#ozo_train.cv
ozo_train.cv <- data.frame(sapply(ozo_train.cv, '[[', 'error.cv'))
ozo_train.cv$vars <- rownames(ozo_train.cv)
ozo_train.cv <- reshape2::melt(ozo_train.cv, id = 'vars')
ozo_train.cv$vars <- as.numeric(as.character(ozo_train.cv$vars))
 
ozo_train.cv.mean <- aggregate(ozo_train.cv$value, by = list(ozo_train.cv$vars), FUN = mean)
ozo_train.cv.mean

可視化誤差結(jié)果

ggplot(ozo_train.cv.mean, aes(Group.1, x)) +
    geom_line() +
    labs(title = '',x = 'Number of vars', y = 'Cross-validation error')

根據(jù)交叉驗證曲線,提示保留1個重要的變量(或前四個重要的變量)獲得理想的回歸結(jié)果状婶,因為此時的誤差達(dá)到最小意敛。

因此,根據(jù)計算得到的各ozone重要性的值(如“IncNodePurity”)膛虫,將重要性由高往低排序后草姻,最后大約選擇前4個變量就可以了。

#首先根據(jù)某種重要性的高低排個序稍刀,例如根據(jù)“IncNodePurity”指標(biāo)
importance_ozo <- importance_plot[order(importance_plot$IncNodePurity, decreasing = TRUE), ]
 
#然后取出排名靠前的因素
importance_ozo.select <- importance_ozo[1:4, ]
vars <- c(pull(importance_ozo.select, var), 'Ozone')
ozo.select <- airquality[ ,vars]
ozo.select <- reshape2::melt(ozo.select, id = 'Ozone')

# 查看下這些重要的 vars 與Ozone的關(guān)系
ggplot(ozo.select, aes(x = Ozone, y = value)) +
    geom_point() +
    geom_smooth() +
    facet_wrap(~variable, ncol = 2, scale = 'free_y') +
    labs(title = '',x = 'Ozone', y = 'Relative abundance')

這就是R語言進(jìn)行隨機(jī)森林分析的全流程了撩独,希望對大家的科研有所幫助敞曹。

本文由mdnice多平臺發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市综膀,隨后出現(xiàn)的幾起案子澳迫,更是在濱河造成了極大的恐慌,老刑警劉巖剧劝,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橄登,死亡現(xiàn)場離奇詭異,居然都是意外死亡讥此,警方通過查閱死者的電腦和手機(jī)拢锹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暂论,“玉大人面褐,你說我怎么就攤上這事拌禾∪√ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵湃窍,是天一觀的道長闻蛀。 經(jīng)常有香客問我,道長您市,這世上最難降的妖魔是什么觉痛? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮茵休,結(jié)果婚禮上薪棒,老公的妹妹穿的比我還像新娘。我一直安慰自己榕莺,他們只是感情好俐芯,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钉鸯,像睡著了一般吧史。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唠雕,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天贸营,我揣著相機(jī)與錄音,去河邊找鬼岩睁。 笑死,一個胖子當(dāng)著我的面吹牛捕儒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亿笤,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翎迁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了净薛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤肃拜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后燃领,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體士聪,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年猛蔽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片区岗。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毁枯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出种玛,到底是詐尸還是另有隱情,我是刑警寧澤赂韵,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站括堤,受9級特大地震影響绍移,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹂窖,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望横媚。 院中可真熱鬧,春花似錦灯蝴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狡忙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灾茁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工竖螃, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留逗余,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓录粱,卻偏偏與公主長得像画拾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子青抛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容