##### 예제) 회귀트리/모델트리/랜덤 포레스트 (콘크리트)
#1 데이터 수집 data9 <- read.csv('concrete.csv')
#2 데이터 탐색 str(data9) # 종속변수 strength colSums(is.na(data9)) hist(data9$strength)
#3 데이터 준비 library(caret) set.seed(1) idx <- createDataPartition(data9$strength, p = 0.9, list = F) train_data9 <- data9[idx, ] test_data9 <- data9[-idx, ]
#4 모델 훈련: 회귀트리 library(rpart) model9 <- rpart(strength ~ ., data = train_data9) model9 # n= 930 # node), split, n, deviance, yval # * denotes terminal node # 1) root 930 260382.3000 35.86398 # 2) age< 21 288 41349.6200 23.06563 # 4) cement< 354.5 206 15027.5600 18.45393 # 8) superplastic< 6.45 134 4725.6990 14.93172 * # 9) superplastic>=6.45 72 5545.5400 25.00917 * # 5) cement>=354.5 82 10934.6100 34.65110 * # 3) age>=21 642 150696.8000 41.60530 # 6) cement< 355.95 495 81382.1300 37.16259 # 12) cement< 164.8 113 9537.3810 25.99000 # 24) slag< 115.3 30 436.9436 14.72500 * # 25) slag>=115.3 83 3917.4040 30.06169 * # 13) cement>=164.8 382 53566.7900 40.46757 # 26) water>=180.15 221 22830.7000 35.99620 # 52) fineagg>=719.9 160 10640.6100 32.91737 * # 53) fineagg< 719.9 61 6695.2830 44.07180 * # 27) water< 180.15 161 20252.5000 46.60528 # 54) slag< 163.5 146 13827.5200 44.70473 * # 55) slag>=163.5 15 764.5650 65.10400 * # 7) cement>=355.95 147 26645.0300 56.56544 # 14) water>=183.05 60 7005.5360 45.89383 * # 15) water< 183.05 87 8094.0930 63.92517 *
#5 모델 평가 result9 <- predict(model9, test_data9[, -9]) cor(result9, test_data9[, 9]) # [1] 0.745415
#7 시각화 library(rpart.plot) rpart.plot(model, digits = 3) |
#6 모델 개선 ### 모델트리로 업그레이드
library(Cubist) model8 <- cubist(x = train_data9[, -9], y = train_data9[, 9])
result8 <- predict(model8, test_data9[, -9]) cor(result8, test_data9[, 9]) # [1] 0.9338277 |
#6 모델 개선 ### 랜덤포레스트로 업그레이드
library(randomForest) set.seed(1) model7 <- randomForest(strength ~ ., data = train_data9, ntree = 500, mtry = 3)
result7 <- predict(model7, test_data9[, -9]) cor(result7, test_data9[, 9]) # [1] 0.9684604 |
#6 모델 개선 ### 오차 확인
mae <- function(actual, predicted) { mean(abs(actual - predicted)) }
mae(test_data9[, 9], result9) # [1] 8.979734 mae(test_data9[, 9], result8) # [1] 4.518774 mae(test_data9[, 9], result7) # [1] 3.458593 |