더북(TheBook)

아이리스 데이터에 대해 caret::train( )을 사용하여 모델을 만들어보자. 다음은 80%를 훈련 데이터, 20%를 테스트 데이터로 분리한 뒤 입력 데이터를 PCA하고 랜덤 포레스트 모델에 대해 10겹 교차 검증을 3회 수행하면서 최고의 성능을 보이는 mtry 파라미터를 찾는 예다.

> library(caret)
> set.seed(137)
> train.idx <- createDataPartition(iris$Species, p=0.8)[[1]]
> data.train <- iris[train.idx, ]
> data.test <- iris[-train.idx, ]
> (m <- train(Species ~., data=data.train,
+             preProcess=c("pca"), method="rf", ntree=1000,
+             trControl=trainControl(method="cv", number=10, repeats=3)))
Random Forest

120 samples
  4 predictors
  3 classes: 'setosa', 'versicolor', 'virginica'

Pre-processing: principal component signal extraction, scaled, centered
Resampling: Cross-Validated (10 fold)

Summary of sample sizes: 108, 108, 108, 108, 108, 108, ...
Resampling results across tuning parameters:

  mtry Accuracy Kappa Accuracy SD Kappa SD
  2    0.883    0.825 0.0896      0.134
  3    0.883    0.825 0.0896      0.134
  4    0.883    0.825 0.0896      0.134

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 2.

보다시피 이 복잡한 계산 과정이 몇 개의 명령으로 손쉽게 수행된 것을 볼 수 있다. 뿐만 아니라 최적의 mtry 값 2 역시 구해졌고, 이때 정확도가 88.3%라는 것까지 알 수 있었다.

새로운 데이터에 대한 예측은 predict( )로 수행한다. 다음은 테스트 데이터에 만들어진 모델을 적용하고 혼동 행렬을 구한 예다.

> confusionMatrix(
+   predict(m, newdata=data.test, type="raw"),
+   data.test$Species)
Confusion Matrix and Statistics

              Reference
Prediction     setosa versicolor virginica
  setosa           10          0         0
  versicolor        0          8         1
  virginica         0          2         9

Overall Statistics

               Accuracy : 0.9
                 95% CI : (0.7347, 0.9789)
    No Information Rate : 0.3333
    P-Value [Acc > NIR] : 1.665e-10

                  Kappa : 0.85
 Mcnemar's Test P-Value : NA

Statistics by Class:

                  Class: setosa Class: versicolor Class: virginica
Sensitivity              1.0000            0.8000           0.9000
Specificity              1.0000            0.9500           0.9000
Pos Pred Value           1.0000            0.8889           0.8182
Neg Pred Value           1.0000            0.9048           0.9474
Prevalence               0.3333            0.3333           0.3333
Detection Rate           0.3333            0.2667           0.3000
Detection Prevalence     0.3333            0.3000           0.3667
Balanced Accuracy        1.0000            0.8750           0.9000

이제 caret이 제공하는 함수들을 사용하면 몇 행 되지 않는 코드로 복잡한 모델링 작업을 쉽게 처리할 수 있음을 충분히 알 수 있으리라 생각한다.

그러나 실제 프로그래밍을 하다 보면 이처럼 정형화된 코드로는 해결되지 않는 문제들이 있다. 예를 들면, 복잡한 전처리가 필요하다거나 여러 모델을 복잡하게 조합하는 경우다. 이런 경우에는 이 장에서 설명한 개별 함수들과 예들이 좋은 출발점이 될 것으로 생각한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.