랜덤포레스트(Random Forest) Start

BioinformaticsAndMe







랜덤포레스트(Random Forest)


: Random Forest는 오버피팅을 방지하기 위해, 최적의 기준 변수를 랜덤 선택하는 breiman(2001)이 제안한 머신러닝 기법

: Random Forest는 여러 개의 Decision tree(의사결정나무)를 만들고, 숲을 이룬다는 의미에서 Forest라 불림

*Random이란 의미는 숲에 심는 의사결정나무에 쓰이는 특성들을 랜덤하게 선택하기 때문





랜덤포레스트 장점(Advantage)


ㄱ) Classification(분류) 및 Regression(회귀) 문제에 모두 사용 가능

ㄴ) Missing value(결측치)를 다루기 쉬움

ㄷ) 대용량 데이터 처리에 효과적

ㄹ) 모델의 노이즈를 심화시키는 Overfitting(오버피팅) 문제를 회피하여, 모델 정확도를 향상시킴

ㅁ) Classification 모델에서 상대적으로 중요한 변수를 선정 및 Ranking 가능






랜덤포레스트 과정


1) Training set에서 표본 크기가 n인 bootstrap sampling 수행

*bootstrap sampling - Original sample 집단에서 더 작지만 무수히 많은 집단으로 랜덤하게 뽑는 방법


2) Bootstrap sample에 대해 Random Forest Tree 모형 제작

a) 전체 변수 중에서 m개 변수를 랜덤하게 선택

b) 최적의 classifier 선정

c) classifier에서 따라 두 개의 daughter node 생성


#아래 그림은 랜덤하게 선택된 유전자를 변수로 두고 재발환자를 가르는 랜덤포레스트 모델링 과정

#OOB(Out-Of-Bag): 학습된 랜덤포레스트 모델이 우수한지의 성능 지표


3) Tree들의 앙상블 학습 결과 출력

*앙상블 학습(ensemble learning): 큰 데이터를 수많은 작은 set으로 나눠 학습시킨 후, 각 학습 모델을 연결하여 성능 좋은 머신러닝 구축





랜덤포레스트 예제


Example - R and Data Mining by Zhao

# R randomForest package 설치 및 로딩 install.package('randomForest')

library(randomForest)

# iris 데이터 사용 data(iris) 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 ...

# iris 데이터를 7:3 비율로 trainData 및 testData로 샘플링 ind <- sample(2, nrow(iris), replace = TRUE, prob = c(0.7, 0.3)) trainData <- iris[ind == 1, ] testData <- iris[ind == 2, ]

# randomForest 분석결과 100개의 tree가 생성

# 랜덤하게 두 개 변수를 선택하여 가지의 분류기준을 정함

rf <- randomForest(as.factor(Species) ~ ., data = trainData, ntree = 100, proximity = TRUE, importance = TRUE)


# Out-of-Bag sample의 오차율과 교차표 확인 가능 print(rf)

Call:
 randomForest(formula = as.factor(Species) ~ ., data = trainData,      ntree = 100, proximity = TRUE, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 100
No. of variables tried at each split: 2

        OOB estimate of  error rate: 4.46%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         40          0         0  0.00000000
versicolor      0         35         3  0.07894737
virginica       0          2        32  0.05882353

# trainData의 randomForest model을 이용한 예측값 출력 predict(rf)

         1          2          3          4          6          7          8          9         10         11         12         13         15         17         18         19 
    setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa 
        20         21         22         23         24         25         27         30         31         32         33         34         35         37         38         41 
    setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa 
        42         43         44         45         46         47         48         49         51         52         54         55         56         57         59         62 
    setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor 
        63         64         65         67         68         69         70         71         73         75         76         77         78         79         80         82 
versicolor versicolor versicolor versicolor versicolor versicolor versicolor  virginica versicolor versicolor versicolor versicolor  virginica versicolor versicolor versicolor 
        83         84         85         87         88         89         91         93         94         95         96         97         98         99        101        102 
versicolor  virginica versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor  virginica  virginica 
       103        104        105        106        107        108        109        110        112        114        115        118        119        125        126        127 
 virginica  virginica  virginica  virginica versicolor  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica 
       128        129        130        132        133        134        136        138        139        141        143        144        145        146        148        150 
 virginica  virginica  virginica  virginica  virginica versicolor  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica 

Levels: setosa versicolor virginicaa

# 실제 trainData값과 예측값을 비교하는 교차표 출력 table(predict(rf), trainData$Species)

             setosa versicolor virginica
  setosa         40          0         0
  versicolor      0         35         2
  virginica       0          3        32

# trainData의 randomForest model을 이용한 testData에 적합한 예측값 출력 irisPred <- predict(rf, newdata = testData) irisPred

         5         14         16         26         28         29         36         39         40         50         53         58         60 
    setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa     setosa versicolor versicolor versicolor 
        61         66         72         74         81         86         90         92        100        111        113        116        117 
versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor versicolor  virginica  virginica  virginica  virginica 
       120        121        122        123        124        131        135        137        140        142        147        149 
versicolor  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica  virginica 
Levels: setosa versicolor virginica

# 실제 testData값과 예측값을 비교하는 교차표 출력 table(irisPred, testData$Species)

irisPred     setosa versicolor virginica
  setosa         10          0         0
  versicolor      0         12         1
  virginica       0          0        15

# randomForest 분석결과 변수별 중요도 확인 importance(rf)

                setosa versicolor virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length  1.550198   2.904545  5.359329             6.234686         6.863905
Sepal.Width   1.616085   1.750807  1.932415             2.689961         1.582434
Petal.Length  8.829176  11.694845 11.303180            12.970271        30.346106
Petal.Width  10.915855  13.094225 14.000101            15.456179        35.045996

# 변수의 중요도를 dot 형식의 플롯팅 varImpPlot(rf)

#MeanDecreaseAccuracy: 정확도

#MeanDecreaseGini: 노드 불순도 개선



#Reference

1) https://towardsdatascience.com/understanding-random-forest-58381e0602d2

2) https://wikidocs.net/34086

3) http://rstudio-pubs-static.s3.amazonaws.com/4944_b042d59e3b174ec395bf2a20eab939d3.html

4) https://www.edureka.co/blog/random-forest-classifier/

5) https://www.codingame.com/playgrounds/7163/machine-learning-with-java---part-6-random-forest

6) https://www.researchgate.net/figure/An-example-of-bootstrap-sampling-Since-objects-are-subsampled-with-replacement-some_fig2_322179244

7) https://www.biostars.org/p/86981/

8) https://thebook.io/006723/ch10/03/04/03/




랜덤포레스트(Random Forest) End

BioinformaticsAndMe

'Machine Learning' 카테고리의 다른 글

Feature selection vs Feature extraction  (0) 2019.10.29
K-NN(최근접이웃) 알고리즘  (0) 2019.10.23
[TensorFlow] Logistic Regression  (0) 2019.10.09
[TensorFlow] Linear Regression  (0) 2019.10.05
[TensorFlow] 기본 연산  (0) 2019.10.04

+ Recent posts