와인 등급 예측
회귀트리, 모델트리
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. 결과에 대한 개별 속성의 전체적인 기준점을 결정하기 어려움 |
'R > ML & DL 공부' 카테고리의 다른 글
[R] 콘크리트 내구성 예측 - 인공신경망 (0) | 2022.06.03 |
---|---|
[R] 의료비 예측 - 선형 회귀 (0) | 2022.04.22 |
[R] 휴대폰 스팸 분류 - Naive bayes (0) | 2022.04.20 |
[R] 독버섯 분류 - 분류 규칙 (OneR, Ripper) (0) | 2022.04.19 |
[R] 은행 대출 채무 여부 분류 - 의사결정트리 (0) | 2022.04.15 |