R/ML & DL 공부

[R] 와인 등급 예측 - 회귀트리, 모델트리

dori_0 2022. 4. 22. 14:30

와인 등급 예측

회귀트리, 모델트리

11가지 화학적 특성과 4,898가지 와인 표본에 대한 데이터

 

acidity 신맛, sugar content 당도, chlorides 염화물

sulfur 황, alcohol 알코올, pH 산성도, density 농도

3명의 와인 감정위원이 블라인드 테스트로 표본을 0(매우 나쁨)부터 10(매우 좋음)까지 등급을 매김

 


 

1. 데이터 준비와 탐구

> wine = read.csv("C:/R/whitewines.csv", header=T)
> str(wine)
'data.frame':	4898 obs. of  12 variables:
 $ fixed.acidity       : num  6.7 5.7 5.9 5.3 6.4 7 7.9 6.6 7 6.5 ...
 $ volatile.acidity    : num  0.62 0.22 0.19 0.47 0.29 0.14 0.12 0.38 0.16 0.37 ...
 $ citric.acid         : num  0.24 0.2 0.26 0.1 0.21 0.41 0.49 0.28 0.3 0.33 ...
 $ residual.sugar      : num  1.1 16 7.4 1.3 9.65 0.9 5.2 2.8 2.6 3.9 ...
 $ chlorides           : num  0.039 0.044 0.034 0.036 0.041 0.037 0.049 0.043 0.043 0.027 ...
 $ free.sulfur.dioxide : num  6 41 33 11 36 22 33 17 34 40 ...
 $ total.sulfur.dioxide: num  62 113 123 74 119 95 152 67 90 130 ...
 $ density             : num  0.993 0.999 0.995 0.991 0.993 ...
 $ pH                  : num  3.41 3.22 3.49 3.48 2.99 3.25 3.18 3.21 2.88 3.28 ...
 $ sulphates           : num  0.32 0.46 0.42 0.54 0.34 0.43 0.47 0.47 0.47 0.39 ...
 $ alcohol             : num  10.4 8.9 10.1 11.2 10.9 ...
 $ quality             : int  5 6 6 4 6 6 6 6 6 7 ...

 

와인 품질의 분포를 확인해보면

> hist(wine$quality)

  • 6이 중심이 되는 종 모양의 정규분포이다.

 

이 데이터를 8:2로 훈련 데이터와 테스트 데이터로 나눠주자

> # 훈련 데이터, 테스트 데이터 나누기 8:2
> 4898*0.8 #3918
[1] 3918.4
> 
> wine_train = wine[1:3918, ]
> wine_test = wine[3919:4894, ]

 

 

2. 데이터로 모델 훈련

wine_train 데이터를 이용하여 모델을 훈련해주자

> library(rpart)
> m.rpart = rpart(quality ~., data=wine_train)
> m.rpart
n= 3918 

node), split, n, deviance, yval
      * denotes terminal node

 1) root 3918 3079.16700 5.871363  
   2) alcohol< 10.85 2482 1496.41900 5.606366  
     4) volatile.acidity>=0.2275 1686  859.65600 5.431791  
       8) volatile.acidity>=0.3025 724  289.72790 5.255525 *
       9) volatile.acidity< 0.3025 962  530.50420 5.564449 *
     5) volatile.acidity< 0.2275 796  476.54650 5.976131 *
   3) alcohol>=10.85 1436 1107.20000 6.329387  
     6) free.sulfur.dioxide< 10.5 87   98.71264 5.390805 *
     7) free.sulfur.dioxide>=10.5 1349  926.90290 6.389918  
      14) alcohol< 11.74167 664  452.42770 6.171687  
        28) volatile.acidity>=0.465 12   11.00000 4.500000 *
        29) volatile.acidity< 0.465 652  407.27610 6.202454 *
      15) alcohol>=11.74167 685  412.19850 6.601460 *
      
> #summary(m.rpart)
  • alcohol 변수가 트리의 루트 노드에 사용된 것으로 보아 와인 품질과 관련된 가장 중요한 변수인 것으로 보인다.

 

결정 트리 시각화를 사용하여 결과를 파악해보자

> # 결정트리 시각화
> library(rpart.plot)
> rpart.plot(m.rpart, digits = 3)
> #rpart.plot(m.rpart, digits = 4, fallen.leaves=T, type = 3, extra=101)

  • 위에서 본 것과 마찬가지로 alcohol에 대해 제일 먼저 분류하는 것을 확인할 수 있다.
  • digit, fallen.leaves, type, extra 매개변수들을 이용해 내가 원하는 대로 시각화를 해볼 수 있다.

 

 

3. 모델 성능 평가

> p.rpart = predict(m.rpart, wine_test)

> summary(p.rpart)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  5.256   5.564   5.976   5.907   6.202   6.601 
> summary(wine_test$quality)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.000   5.000   6.000   5.901   6.000   9.000
  • 예측값이 실제값보다 범위가 더 좁은 것으로 보아 이 모델은 상급 와인과 하급 와인을 잘 식별해내지 못하는 것으로 보인다.

 

> cor(p.rpart, wine_test$quality)
[1] 0.5344686

> # MAE
> MAE = function(actual, predicted){
+   mean(abs(actual - predicted))
+ }
> MAE(p.rpart, wine_test$quality)
[1] 0.5852092
  • 예측값과 실제값의 상관도는 모델의 성능을 나타내는 간단한 방법이다.
  • MAE(평균 절대 오차)로 성능을 측정해보니 이 모델의 예측과 실제 품질 점수의 차이는 약 0.59임을 확인할 수 있다.

 

 

4. 모델 성능 향상 - 모델 트리

모델 트리는 잎 노드를 회귀 모델로 변환하여 회귀 트리를 향상 시킨다.

학습기의 성능을 향상시키기 위해 모델 트리를 만들어보자

> library(RWeka)
> m.m5p = M5P(quality~., data=wine_train)
> m.m5p

> summary(m.m5p)

=== Summary ===

Correlation coefficient                 -0.314 
Mean absolute error                    111.4331
Root mean squared error                146.2734
Relative absolute error              16529.1147 %
Root relative squared error          16499.8879 %
Total Number of Instances             3918

  • 각 노드는 수치 예측이 아닌 선형 모델이다.
  • 10개의 변수에 의해 추정된 모형으로 총 130개의 선형 모델이 만들어졌다.

 

 

이 모델의 성능도 확인해보면 다음과 같다.

> cor(p.m5p, wine_test$quality)  #상관관계
[1] -0.3607982

> MAE(wine_test$quality, p.m5p)  #MAE
[1] 112.1825

 

 

5. 회귀 트리의 장단점

장점 단점
1. 수치 데이터를 모델화할 수 있는 결정 트리의 장점과 결합
2. 자동으로 속성을 선택
3. 선형 회귀보다 훨씬 더 쉽게 적합할 수 있음
4. 모델 해석을 위해 통계적 지식이 필요 없음
1. 선형 회귀처럼 일반적으로 사용되지 않음
2. 대량의 훈련 데이터가 필요함
3. 회귀 모델보다 이해하기 어려움
4. 결과에 대한 개별 속성의 전체적인 기준점을 결정하기 어려움