다음은 upSample( )을 훈련 데이터에 적용한 경우와 그렇지 않은 경우 각각 의사 결정 나무의 성능을 비교한 코드다.
> library(party) > # Id는 식별자므로 피처로는 적절치 않아 제외한다. 그렇지 않으면 Id에 따라 예측을 수행하는 > # 의미 없는 모델이 만들어진다. > data <- subset(BreastCancer, select=-Id) > parts <- createDataPartition(data$Class, p=.8) # 80%의 훈련 데이터와 20%의 테스트 데이터 > data.train <- data[parts$Resample1,] > data.test <- data[-parts$Resample1, ] > m <- rpart(Class ~., data=data.train) > confusionMatrix(data.test$Class, + predict(m, newdata=data.test, type="class")) Confusion Matrix and Statistics Reference Prediction benign malignant benign 86 5 malignant 3 45 Accuracy : 0.9424 95% CI : (0.8897, 0.9748) No Information Rate : 0.6403 P-Value [Acc > NIR] : <2e-16 Kappa : 0.874 Mcnemar's Test P-Value : 0.7237 Sensitivity : 0.9663 Specificity : 0.9000 Pos Pred Value : 0.9451 Neg Pred Value : 0.9375 Prevalence : 0.6403 Detection Rate : 0.6187 Detection Prevalence : 0.6547 `Positive' Class : benign > data.up.train <- upSample(subset(data.train, select=-Class), + data.train$Class) > m <- rpart(Class ~., data=data.up.train) > confusionMatrix(data.test$Class, + predict(m, newdata=data.test, type="class")) Confusion Matrix and Statistics Reference Prediction benign malignant benign 83 8 malignant 2 46 Accuracy : 0.9281 95% CI : (0.8717, 0.965) No Information Rate : 0.6115 P-Value [Acc > NIR] : <2e-16 Kappa : 0.8455 Mcnemar's Test P-Value : 0.1138 Sensitivity : 0.9765 Specificity : 0.8519 Pos Pred Value : 0.9121 Neg Pred Value : 0.9583 Prevalence : 0.6115 Detection Rate : 0.5971 Detection Prevalence : 0.6547 `Positive' Class : benign
분할표에서 볼 수 있듯이 원본 데이터를 사용한 경우 malignant로 예측한 수는 45개였으나, upSample( ) 이후에는 46개로 늘었다. 이로 인해 Sensitivity도 0.9663에서 0.9765로 올랐으며, 대신 Specificity는 0.9000에서 0.8519로 내렸다.
createDataPartition( )은 훈련 데이터와 검증 데이터의 분리를 위해 사용했으며, 이 예에서는 80%의 데이터를 훈련 데이터, 나머지 20%를 검증 데이터로 사용하기 위해 p=0.8을 지정했다.