아이리스 데이터에 대해 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이 제공하는 함수들을 사용하면 몇 행 되지 않는 코드로 복잡한 모델링 작업을 쉽게 처리할 수 있음을 충분히 알 수 있으리라 생각한다.
그러나 실제 프로그래밍을 하다 보면 이처럼 정형화된 코드로는 해결되지 않는 문제들이 있다. 예를 들면, 복잡한 전처리가 필요하다거나 여러 모델을 복잡하게 조합하는 경우다. 이런 경우에는 이 장에서 설명한 개별 함수들과 예들이 좋은 출발점이 될 것으로 생각한다.