1. 程式人生 > >R包 randomForest 進行隨機森林分析

R包 randomForest 進行隨機森林分析

分類器 屬於 成功 and 分類 新的 nts class 散點

randomForest 包提供了利用隨機森林算法解決分類和回歸問題的功能;我們這裏只關註隨機森林算法在分類問題中的應用

首先安裝這個R包

install.packages("randomForest")

安裝成功後,首先運行一下example

library(randomForset)
?randomForset

通過查看函數的幫助文檔,可以看到對應的example

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

代碼很簡單,全部的功能都封裝在 randomForest 這個R包中,首先來看下用於分類的數據

> 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
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

采用數據集iris 進行分類,iris 數據集共有150行,5列,其中第5列為分類變量,共有3種分類情況,這個數據集可以看做150個樣本,根據4個指標進行分類,最終分成了3類

接下來調用randomForest 函數就行分類

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

調用該函數時,通過一個表達式指定分類變量 Species 和對應的數據集data 就可以了,後面的importance 和 proximity 是計算每個變量的重要性和樣本之間的距離

分類器構建完畢之後,首先看一下這個分類器的準確性

> 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 的結果中,OOB estimate of error rate 表明了分類器的錯誤率為4%, Confusion matrix 表明了每個分類的詳細的分類情況;

對於setosa 這個group而言,基於隨機森林算法的分類器,有50個樣本分類到了setosa 這個group, 而且這50個樣本和iris 中屬於setosa 這個group的樣本完全一致,所以對於setosa 這個group而言,分類器的錯誤率為0;

對於versicolor 這個group而言,基於隨機森林算法的分類器,有47個樣本分類到了versicolor 這個group, 3個樣本分類到了virginica 這個group,有3個樣本分類錯誤,在iris 中屬於versicolor 這個group的樣本有50個,所以對於versicolor 這個group而言,分類器的錯誤率為3/50 = 0.06 ;

對於virginica 這個group而言,基於隨機森林算法的分類器,有3個樣本分類到了versicolor 這個group, 47個樣本分類到了virginica 這個group,有3個樣本分類錯誤,在iris 中屬於virginica 這個group的樣本有50個,所以對於virginica這個group而言,分類器的錯誤率為3/50 = 0.06 ;

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

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

通過調用cmdscale 函數進行樣本之間的距離,proximity 是樣本之間的相似度矩陣,所以用1減去之後得到樣本的類似距離矩陣的一個矩陣

iris.mds 的結果如下

> 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]
1 -0.5656446 0.01611053
2 -0.5656904 0.01585927
3 -0.5656267 0.01654988
4 -0.5651292 0.01649026
5 -0.5653773 0.01576609
6 -0.5651923 0.01663060

在iris.mds 中points可以看做每個樣本映射到2維空間中的坐標,每一維空間是一個分類特征,但是不是最原始的4個特征,而是由4個特征衍生得到的新的分類特征,根據這個坐標,可以畫一張散點圖,得到每個樣本基於兩個分類變量的分組情況

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

生成的圖片如下:

技術分享

圖中不同分類的樣本用不同的顏色標註,可以看到基於兩個新的分類特征,樣本的分組效果還是很好的,不同組的樣本明顯區分開來

最後,在看一下4個特征,每個特征的重要性

> 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

之前調用randomForest 函數時,通過指定importance = TRUE 來計算每個特征的importance , 在 iris.rf$importance 矩陣中,有兩個值是需要重點關註的MeanDecreaseAccuracy 和 MeanDecreaseGini

我們還可以利用

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

生成的圖片如下:

技術分享

圖中和坐標為importance 結果中的MeanDecreaseAccuracy 和 MeanDecreaseGini 指標的值,縱坐標為對應的每個分類特征,該函數默認畫top30個特征,由於這個數據集只有4個分類特征,所以4個都出現了

R包 randomForest 進行隨機森林分析