R語(yǔ)言實(shí)現(xiàn)隨機(jī)森林(randomForest)分析

嵌牛導(dǎo)讀:randomForest 包提供了利用隨機(jī)森林算法解決分類和回歸問(wèn)題的功能;我們這里只關(guān)注隨機(jī)森林算法在分類問(wèn)題中的應(yīng)用

嵌牛鼻子:R語(yǔ)言;隨機(jī)森林

嵌牛提問(wèn):如何使用R語(yǔ)言進(jìn)行隨機(jī)森林分析,分析結(jié)果是怎樣的?

轉(zhuǎn)載源:https://www.cnblogs.com/xudongliang/p/7357967.html

嵌牛正文:

首先安裝randomForest這個(gè)包

install.packages("randomForest")

安裝成功之后,首先運(yùn)行一下example

library(randomForest)

通過(guò)查看函數(shù)的幫助文檔,可以看到對(duì)應(yīng)的example

data(iris)

set.seed(71)

iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE, proximity=TRUE)

print(iris.rf)

代碼很簡(jiǎn)單,全部的功能都封裝在 randomForest 這個(gè)R包中,首先來(lái)看下用于分類的數(shù)據(jù)

> str(iris)

'data.frame': 150 obs. of? 5 variables:

$ Sepal.Length: num? 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

$ Sepal.Width : num? 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...

$ Petal.Length: num? 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...

$ Petal.Width : num? 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...

$ Species? ? : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

> head(iris)

? Sepal.Length Sepal.Width Petal.Length Petal.Width Species

? ? ? ? 5.1? ? ? ? 3.5? ? ? ? ? 1.4? ? ? ? 0.2? setosa

? ? ? ? 4.9? ? ? ? 3.0? ? ? ? ? 1.4? ? ? ? 0.2? setosa

? ? ? ? 4.7? ? ? ? 3.2? ? ? ? ? 1.3? ? ? ? 0.2? setosa

? ? ? ? 4.6? ? ? ? 3.1? ? ? ? ? 1.5? ? ? ? 0.2? setosa

? ? ? ? 5.0? ? ? ? 3.6? ? ? ? ? 1.4? ? ? ? 0.2? setosa

? ? ? ? 5.4? ? ? ? 3.9? ? ? ? ? 1.7? ? ? ? 0.4? setosa

采用數(shù)據(jù)集iris 進(jìn)行分類,iris 數(shù)據(jù)集共有150行,5列,其中第5列為分類變量,共有3種分類情況,這個(gè)數(shù)據(jù)集可以看做150個(gè)樣本,根據(jù)4個(gè)指標(biāo)進(jìn)行分類,最終分成了3類

接下來(lái)調(diào)用randomForest 函數(shù)就行分類

iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE, proximity=TRUE)

調(diào)用該函數(shù)時(shí),通過(guò)一個(gè)表達(dá)式指定分類變量 Species 和對(duì)應(yīng)的數(shù)據(jù)集data 就可以了,后面的importance 和 proximity 是計(jì)算每個(gè)變量的重要性和樣本之間的距離

分類器構(gòu)建完畢之后,首先看一下這個(gè)分類器的準(zhǔn)確性

> print(iris.rf)

Call:

randomForest(formula = Species ~ ., data = iris, importance = TRUE,? ? ? proximity = TRUE)

? ? ? ? ? ? ? Type of random forest: classification

? ? ? ? ? ? ? ? ? ? Number of trees: 500

No. of variables tried at each split: 2

? ? ? ? OOB estimate of? error rate: 4%

Confusion matrix:

? ? ? ? ? setosa versicolor virginica class.error

setosa? ? ? ? 50? ? ? ? ? 0? ? ? ? 0? ? ? ? 0.00

versicolor? ? ? 0? ? ? ? 47? ? ? ? 3? ? ? ? 0.06

virginica? ? ? 0? ? ? ? ? 3? ? ? ? 47? ? ? ? 0.06

print 的結(jié)果中,OOB estimate of error rate 表明了分類器的錯(cuò)誤率為4%, Confusion matrix 表明了每個(gè)分類的詳細(xì)的分類情況;

對(duì)于setosa 這個(gè)group而言,基于隨機(jī)森林算法的分類器,有50個(gè)樣本分類到了setosa 這個(gè)group, 而且這50個(gè)樣本和iris 中屬于setosa 這個(gè)group的樣本完全一致,所以對(duì)于setosa 這個(gè)group而言,分類器的錯(cuò)誤率為0;

對(duì)于versicolor 這個(gè)group而言,基于隨機(jī)森林算法的分類器,有47個(gè)樣本分類到了versicolor 這個(gè)group, 3個(gè)樣本分類到了virginica 這個(gè)group,有3個(gè)樣本分類錯(cuò)誤,在iris 中屬于versicolor 這個(gè)group的樣本有50個(gè),所以對(duì)于versicolor 這個(gè)group而言,分類器的錯(cuò)誤率為3/50 = 0.06 ;

對(duì)于virginica 這個(gè)group而言,基于隨機(jī)森林算法的分類器,有3個(gè)樣本分類到了versicolor 這個(gè)group, 47個(gè)樣本分類到了virginica 這個(gè)group,有3個(gè)樣本分類錯(cuò)誤,在iris 中屬于virginica 這個(gè)group的樣本有50個(gè),所以對(duì)于virginica這個(gè)group而言,分類器的錯(cuò)誤率為3/50 = 0.06 ;

然后看一下樣本之間的距離

iris.mds <- cmdscale(1 - iris.rf$proximity, eig=TRUE)

通過(guò)調(diào)用cmdscale 函數(shù)進(jìn)行樣本之間的距離,proximity 是樣本之間的相似度矩陣,所以用1減去之后得到樣本的類似距離矩陣的一個(gè)矩陣

iris.mds 的結(jié)果如下

> str(iris.mds)

List of 5

$ points: num [1:150, 1:2] -0.566 -0.566 -0.566 -0.565 -0.565 ...

? ..- attr(*, "dimnames")=List of 2

? .. ..$ : chr [1:150] "1" "2" "3" "4" ...

? .. ..$ : NULL

$ eig? : num [1:150] 23.87 20.89 2.32 1.67 1.23 ...

$ x? ? : NULL

$ ac? ? : num 0

$ GOF? : num [1:2] 0.723 0.786

> head(iris.mds$points)

? ? ? ? [,1]? ? ? [,2]

-0.5656446 0.01611053

-0.5656904 0.01585927

-0.5656267 0.01654988

-0.5651292 0.01649026

-0.5653773 0.01576609

-0.5651923 0.01663060

在iris.mds 中points可以看做每個(gè)樣本映射到2維空間中的坐標(biāo),每一維空間是一個(gè)分類特征,但是不是最原始的4個(gè)特征,而是由4個(gè)特征衍生得到的新的分類特征,根據(jù)這個(gè)坐標(biāo),可以畫(huà)一張散點(diǎn)圖,得到每個(gè)樣本基于兩個(gè)分類變量的分組情況

plot(iris.mds$points, col = rep(c("red", "blue", "green"), each = 50))

生成的圖片如下:


生成圖片

圖中不同分類的樣本用不同的顏色標(biāo)注,可以看到基于兩個(gè)新的分類特征,樣本的分組效果還是很好的,不同組的樣本明顯區(qū)分開(kāi)來(lái)

最后,在看一下4個(gè)特征,每個(gè)特征的重要性

> iris.rf$importance

? ? ? ? ? ? ? ? ? setosa? versicolor? virginica MeanDecreaseAccuracy

Sepal.Length 0.027726158 0.0202591689 0.03688967? ? ? ? ? 0.028920613

Sepal.Width? 0.007300694 0.0006999737 0.01078650? ? ? ? ? 0.006093858

Petal.Length 0.331994212 0.3171074926 0.31762366? ? ? ? ? 0.319580655

Petal.Width? 0.332417881 0.3004615039 0.26540155? ? ? ? ? 0.296416932

? ? ? ? ? ? MeanDecreaseGini

Sepal.Length? ? ? ? 9.013793

Sepal.Width? ? ? ? ? 2.263645

Petal.Length? ? ? ? 44.436189

Petal.Width? ? ? ? 43.571706

?之前調(diào)用randomForest 函數(shù)時(shí),通過(guò)指定importance = TRUE 來(lái)計(jì)算每個(gè)特征的importance , 在 iris.rf$importance 矩陣中,有兩個(gè)值是需要重點(diǎn)關(guān)注的MeanDecreaseAccuracy 和 ?MeanDecreaseGini

我們還可以利用

varImpPlot(iris.rf, main = "Top 30 - variable importance")

嵌??偨Y(jié):以上介紹的主要是安裝randomForest包以及調(diào)用官網(wǎng)的例子來(lái)運(yùn)用這個(gè)包。更深入的了解隨機(jī)森林包還需要在實(shí)際使用中進(jìn)一步深入。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容