Week 02: Caret package, data slicing


  • Caret package
  • Data slicing
  • Training options
  • Plotting predictions
  • Basic peprocessing
  • Covariate creation
  • Preprocessing with principal components analysis
  • Predicting with Regression
  • Predicting with Regression Multiple Covariates


caret package


해당 페키지는 R에서 Machine Learning을 수행하도록 도와주는 많은 package들 중의 하나이다.

하지만 여타 package들과 다르게 간편하고 강력하다는 장점이 있다.




■ caret의 기능들


1) 프리프로세싱 (데이터 클린)

2) 데이터 분할

createDataPartition

createResample

createTimeSlices

3) 트레이닝과 테스트 함수

train

predict

4) 생성한 모델들간의 비교

confusionMatrix



caret에서 지원하는 Machine Learning Algorithms

  • Linear discriminant analysis 

  • Regression

  • Naive Bayes

  • Support vector machines

  • Classificiation and Regression tree

  • Random forests
  • Boosting
  • etc.


왜 caret 인가? 수많은 machine learning 구현 package들 중에서


caret이 설정해서 사용하기 제일 편하다.

아래의 표처럼 각각의 페키지들은 서로다른 알고리즘을 사용할 때 마다 설정을 재각각 다르게 해줘야 한다.




다시보는 SPAM 예제


Data Splitting 

library(caret)

library(kernlab)

data(spam)


inTrain <- createDataPartition(y=spam$type, 

                               p=0.75, list=FALSE)

training <- spam[inTrain,]

testing <- spam[-inTrain,]

dim(training)


[1] 3451   58


Fit a model

train 함수를 이용해서 machine learning을 수행한다.

prediction할 것은 type이고

tilde (~)와 dot(.) 은 모든 data frame에 있는 데이터들은 prediction을 위해서 사용된다는 것을 의미한다.

그리고 어떤 데이터셋을 트레이닝을 위해서 사용할지 알려준다.

data=training

마지막으로 어떤 method를 사용할지를 알려준다.

method="glm"


set.seed(32343)

modelFit <- train(type ~., data=training, method="glm")

modelFit


생성된 모델 정보는 아래와 같다.

> modelFit

Generalized Linear Model 


3451 samples

  57 predictor

   2 classes: 'nonspam', 'spam' 


No pre-processing

Resampling: Bootstrapped (25 reps) 

Summary of sample sizes: 3451, 3451, 3451, 3451, 3451, 3451, ... 

Resampling results


  Accuracy  Kappa      Accuracy SD  Kappa SD  

  0.918051  0.8278053  0.01416705   0.02778765


모델의 계수(coeeficients)들을 확인하면 아래와 같다.

> modelFit$finalModel


Call:  NULL


Coefficients:

      (Intercept)               make            address                all              num3d                our  

       -1.490e+00         -4.477e-01         -1.493e-01          5.160e-02          1.746e+00          4.210e-01  

             over             remove           internet              order               mail            receive  

        1.504e+00          2.466e+00          5.677e-01          4.802e-01          1.196e-01         -3.559e-01  

             will             people             report          addresses               free           business  

       -6.004e-02         -2.322e-01          1.732e-01          5.614e-01          1.164e+00          1.200e+00  

            email                you             credit               your               font             num000  

        4.194e-02          8.780e-02          2.307e+00          2.697e-01          2.301e-01          2.094e+00  

            money                 hp                hpl             george             num650                lab  

        3.204e-01         -2.117e+00         -1.391e+00         -1.031e+01          3.958e-01         -2.554e+00  

             labs             telnet             num857               data             num415              num85  

       -1.399e-01         -1.854e-01          2.073e-01         -6.540e-01          8.005e-01         -2.510e+00  

       technology            num1999              parts                 pm             direct                 cs  

        1.340e+00          6.107e-02          1.001e+00         -1.107e+00         -4.080e-01         -4.010e+01  

          meeting           original            project                 re                edu              table  

       -3.290e+00         -1.187e+00         -2.507e+00         -8.582e-01         -1.383e+00         -3.183e+00  

       conference      charSemicolon   charRoundbracket  charSquarebracket    charExclamation         charDollar  

       -5.973e+00         -1.367e+00         -1.341e-01         -4.585e-01          2.613e-01          4.264e+00  

         charHash         capitalAve        capitalLong       capitalTotal  

        2.430e+00         -2.119e-02          1.297e-02          7.873e-04  


Degrees of Freedom: 3450 Total (i.e. Null);  3393 Residual

Null Deviance:    4628 

Residual Deviance: 1351 AIC: 1467


모델을 이용해서 prediction할 수 있다.

predict() 함수를 이용하는데, 이때 통일된 인자를 넘겨 주게된다. 이러한 통일성이 caret의 장점이다.

인자로는 생성된 model과 prediction에 사용될 데이터 set을 넘겨 준다.


# predict 

predictions <- predict(modelFit, newdata=testing)

predictions 


모델의 평가는 confusion matrix을 이용해서 한다.

# evaluating models

confusionMatrix (predictions, testing$type)


많은 statistical information들이 자동으로 계산 되는것을 볼 수 있다.

Confusion Matrix and Statistics


          Reference

Prediction nonspam spam

   nonspam     646   45

   spam         51  408

                                         

               Accuracy : 0.9165         

                 95% CI : (0.899, 0.9319) # confidence interval for the accuracy

    No Information Rate : 0.6061         

    P-Value [Acc > NIR] : <2e-16         

                                         

                  Kappa : 0.8256         

 Mcnemar's Test P-Value : 0.6098         

                                         

            Sensitivity : 0.9268         

            Specificity : 0.9007         

         Pos Pred Value : 0.9349         

         Neg Pred Value : 0.8889         

             Prevalence : 0.6061         

         Detection Rate : 0.5617         

   Detection Prevalence : 0.6009         

      Balanced Accuracy : 0.9137         

                                         

       'Positive' Class : nonspam        


추가적인 참고 자료들


공식 사이트: http://topepo.github.io/caret/index.html

튜토리얼 자료1: http://www.edii.uclm.es/~useR-2013/Tutorials/kuhn/user_caret_2up.pdf

튜토리얼 자료2: https://cran.r-project.org/web/packages/caret/vignettes/caret.pdf

caret 논문 (journal of statistical software): file:///C:/Users/justin/Downloads/v28i05.pdf




Data Slicing


data slicing에 대한 이야기 이다.

뭘하던 간에 데이터 슬라이싱 부터 수행 해야 한다.


caret에서 지원하는 Data Splitting function들은 아래와 같다.

createDataPartition(y, 

                    times = 1,

                    p = 0.5,

                    list = TRUE,

                    groups = min(5, length(y)))

createResample(y, times = 10, list = TRUE)

createFolds(y, k = 10, list = TRUE, returnTrain = FALSE)

createMultiFolds(y, k = 10, times = 5)

createTimeSlices(y, initialWindow, horizon = 1, 

            fixedWindow = TRUE, skip = 0)

각각에 대해서 알아보자.




■ createDataPartition

아래의 createDataPartion() 함수를 이용해서 데이터를 분할 하게 된다.

y 변수에 분할할 데이터를 입력하고

p에서 몇 %를 분할 할지를 설정한다.

그럼 최종적으로 inTrain에는 index 값이 저장 되어 진다.


# --- 2-1 caret package ---

library(caret); library(kernlab); data(spam)

inTrain <- createDataPartition(y=spam$type, 

                               p=0.75, list=FALSE)

training <- spam[inTrain,]

testing <- spam[-inTrain,]

dim(training)



■ createFolds

cross validation방법중 k-folds 방법으로 data와 training set을 분할 하는 방법을 소개한다.

y는 결과값을 저장하고 있는 vector 이다.

k는 folds할 숫자를 나타낸다.

list = TRUE로 설정할 경우 결과를 list로 저장 하게 된다.

returnTrain = TRUE로 설정할 경우 folds의 결과를 training을 위해서 사용할지 여부를 결정 한다.


library(caret); library(kernlab); data(spam)

set.seed(32323)

folds<-createFolds(y=spam$type, k=10, list=TRUE, returnTrain = TRUE)

sapply(folds, length)


생성된 10-folds의 데이터 길이를 각각 확인하면 아래와 같다.

Fold01 Fold02 Fold03 Fold04 Fold05 Fold06 Fold07 Fold08 Fold09 Fold10 

  4141   4140   4141   4142   4140   4142   4141   4141   4140   4141 

각각의 fold의 데이터 길이는 유사한것을 알 수 있다.


각 fold가 포함하는 데이터를 10개씩만 확인해보면 아래와 같다.

> folds[[1]][1:10]

 [1]  1  2  3  4  5  6  7  8  9 10

> folds[[2]][1:10]

 [1]  1  3  4  5  6  7  8  9 10 11

> folds[[3]][1:10]

 [1]  1  2  3  4  5  6  7  8  9 10

> folds[[10]][1:10]

 [1]  1  2  3  4  5  6  7  8  9 10


test set을 생성하는 방법은 아래와 같다.

> # for test set

> set.seed(32323)

> folds <- createFolds(y=spam$type, k=10, list=TRUE, returnTrain = FALSE)

> sapply(folds, length)



Fold01 Fold02 Fold03 Fold04 Fold05 Fold06 Fold07 Fold08 Fold09 Fold10 

   460    461    460    459    461    459    460    460    461    460 



> folds[[1]][1:10]

 [1] 24 27 32 40 41 43 55 58 63 68

> folds[[2]][1:10]

 [1]   2  21  25  54  64  71  87 105 107 108


■ createResample

완전히 full cross validation하는 것이 아니라 resampling 또는 bootstrapping을 하고 싶을 때가 있다.


설정방법은 아래와 같다.

y는 이전과 같이 결과 데이터를 저장하고 있는 vector 이다.

time은 얼마만큼 resampling을 할지를 저장해 준다.

list, vector, matrix 원하는 type을 설정해 준다.


> # resampling for traning set

> set.seed(32323)

> folds <- createResample(y=spam$type, times=10, list=TRUE)

> sapply(folds, length)


Resample01 Resample02 Resample03 Resample04 Resample05 Resample06 

      4601       4601       4601       4601       4601       4601 

Resample07 Resample08 Resample09 Resample10 

      4601       4601       4601       4601 


결과를 확인해보면 k-folds 방법과 다르게 중복 데이터가 존재하는 것을 알 수 있다.

> folds[[1]][1:10] 


[1]  1  2  3  3  3  5  5  7  8 12



■ createTimeSlice


시계열 데이터를 slicing 할 필요가 있을 수도 있다.

기상예보를 예측하려고 할때를 말한다.


아래와 같이 time series 데이터의 경우 

window 크기를 20으로 설정한다음 그것으로 다음 10개를 예측 하는 식으로 동작하게 된다.

이렇게 순차적으로 데이터를 분할하게 된다.


즉, (트레이닝 20개, 테스트 10)이 조합이 반복적으로 수행 된다.

> # Time Slices for traning and test set

> set.seed(32323)

> time <- 1:1000

> folds <- createTimeSlices(y=time, initialWindow = 20, horizon = 10)

> names(folds)


[1] "train" "test" 


> folds$train[[1]]


[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20


> folds$test[[1]]


[1] 21 22 23 24 25 26 27 28 29 30

















  1. choiseoyong 2021.10.21 17:25

    안녕하세요 예전 글인데 혹시 몰라 글 남겨봐요 올려주신 것들 보면서 공부하고 있는 석사 과정 학생입니다.

    confusion matrix 결과 맨 밑에 positive class가 nonspam아니라 spam 아닌가요? 바꾸면 민감도 특이도의 위치가 바뀔거 같은데, 그리고 민감도 특이도의 95% 신뢰구간도 추가로 구할 수 있는지 궁금합니다 ㅠㅠ

+ Recent posts