더북(TheBook)

다음은 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을 지정했다.

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