R/실습(project)

[R/머신러닝/실습] 랜덤포레스트를 이용한 다중 분류 분석

연정양 2023. 1. 12.

데이터 정의 및 탐색적 데이터 분석(EDA)

1) 데이터 정의

iris 데이터셋은 꽃잎의 각 부분의 너비와 길이들을 측정한 데이터이며 150개의 레코드로 구성되어 있다.

변수명 변수 설명
Sepal.Length 꽃받침의 길이
Sepal.Width 꽃받침의 너비
Petal.Length  꽃잎의 길이
Petal.Width 꽃잎의 너비
Species 꽃의 종류

2) 탐색적 데이터 분석

> 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

> 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 …

> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300     Min.   :2.000      Min.   :1.000     Min.   :0.100       setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800    1st Qu.:1.600    1st Qu.:0.300      versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300    virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758    Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300    3rd Qu.:5.100    3rd Qu.:1.800                  
 Max.   :7.900    Max.   :4.400    Max.   :6.900    Max.   :2.500

 탐색적 데이터 분석 결과 결측치와 이상치를 발견할 수 없고 전처리가 필요한 변수도 없다.

 

다중 분류 분석

1) 모델 생성 및 예측

library(SyncRNG)
v <- 1:nrow(df)
s <- SyncRNG(seed=38)
idx <- s$shuffle(v)[1:round(nrow(df)*0.7)]
idx[1:length(idx)]
train <- df[idx,]
test <- df[-idx,]

m_rf<-randomForest(Species~.,train,ntree=100)
p_rf<-predict(m_rf, test[,-5])

R과 Python의 iris 데이터를 동일하게 나누기 위해 SyncRNG 함수를 사용하여 train,test 데이터셋을 만들고

트리수를 100개로 지정해 랜덤 포레스트 모델을 생성했다.

 

2) 모델 평가

Confusion Matrix and Statistics

                 Reference
Prediction   setosa   versicolor   virginica
  setosa         15          0         0
  versicolor      0         13         2
  virginica       0          2        13

Overall Statistics
                                          
               Accuracy : 0.9333          
                 95% CI : (0.8173, 0.986)
    No Information Rate : 0.3333          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                        Class: setosa      Class: versicolor  Class: virginica
Sensitivity                     1.0000            0.8667           0.9333
Specificity                     1.0000            0.9667           0.9333
Pos Pred Value                  1.0000            0.9286           0.8750
Neg Pred Value                  1.0000            0.9355           0.9655
Prevalence                      0.3333            0.3333           0.3333
Detection Rate                  0.3333            0.2889           0.3111
Detection Prevalence            0.3333            0.3111           0.3556
Balanced Accuracy               1.0000            0.9167           0.9333

 predict 함수로 랜덤포레스트를 진행한 m_rf 변수와 test set을 이용하여

모델평가를 진행하였는데, 여기서 정확도가 93%로 예측력이 매우 높은 모델임을 알 수 있다

 

3) 시각화

plot(m_rf)
randomForest::varImpPlot(m_rf)

 plot 함수를 이용해서 모델을 시각화 했고,

randomForest::varImpPlot() 함수를 이용해 랜덤포레스트 모형을 사용한 변수 중요도를 시각화 했다.

 각각의 컬럼들의 트리수가 많아질수록 에러율이 적어지고, 트리수가 20개 이후로는 에러율이 일정한 것을 알 수 있다.

 각 tree에서 해당 feature를 기준으로 분류하는 지점에서의 불순도의 총합을 계산후 모든 tree의 값들의 평균을 낸것을 표로 나타낸 것이다. 여기서 Petal.Length, Petal.Width가 모델이 분류를 하는데에 중요하게 작용되는 것들이다.

 

 

 

댓글