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
왜 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)
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)들을 확인하면 아래와 같다.
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 방법과 다르게 중복 데이터가 존재하는 것을 알 수 있다.
■ 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] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[1] 21 22 23 24 25 26 27 28 29 30