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個都出現了