Stats & AI tech blog - '일단 시도함'
[R] Caret Package로 모델 학습 및 튜닝하기 본문
이번 포스팅에서는 R의 caret 패키지로 쉽게 모델을 학습 & 튜닝하는 방법에 대해 알아보겠다.
아래는 모델을 튜닝하기 위해 먼저 고려해야할 요소이다.
- 어떤 모델을 다룰지 선택 ex) SVM
- 모델을 튜닝하기 위해서 어떤 parameters를 사용할 것인지 선택 ex) C, kernel,,
- 학습에 사용할 데이터를 어떻게 resampling 할지 선택 ex) 10-fold Cross Validation
예시로 SVM 분류 모델을 학습 & 튜닝하는 과정에 대해 알아보겠다.
1. Resampling 방법 지정 (trainControl)
먼저 caret 패키지의 trainControl 함수를 통해 Resampling 방식을 지정한다.
아래 코드는 K-fold Cross Validation을 여러번 반복해서 샘플링하는 'repeated K-fold CrossValidation'에 대한 코드이다.
## 10-fold CV repeated 5 times
fitControl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 5)
repeated CV외에도 단순 K-fold cross-validation이나 leave-one-out 등 여러 방법으로 bootstrap을 생성할 수 있다.
2. 모델 학습 (train) 및 평가
resampling 방법을 지정했다면, train함수를 사용해서 모델을 학습한다.
2.1 default 파라미터로 모델 학습 및 평가
모델 학습 코드 또한 매우 간단한데 아래는 SVM 선형분류기를 학습하는 코드이다.
set.seed(1)
svm1 <- train(tracheostomy ~ ., data = train01, method = "svmLinear", trControl = train_control, preProcess = c("center","scale"))
- 'method' : 어떤 SVM 모델을 학습할 것인지 입력
( 7 train Models By Tag | The caret Package (topepo.github.io) 에서 method인자에 들어갈 모델을 찾을 수 있다.) - 'trControl' : trainControl 함수로 지정해줬던 resampling 방식 입력
- 'preProcess = c("center","scale")' : 모델 학습 전 변수들의 scale을 맞춰주는 normalization을 진행
위 코드를 실행하면 10-fold repeated CV 데이터로 학습한 linear SVM 모델 하나를 얻을 수 있다.
test set을 사용해서 생성한 Default 모델의 정확도를 평가해보자.
# confusion matrix
pred <- predict(svm1, test01)
actual <- test$tracheostomy
confusionMatrix(pred, actual, mode='everything')
Defalut 모델의 예측 값과 실제 값을 사용해서 confusion matrix를 그려보면 78.7% 정확도를 가지는 것을 확인할 수 있다. 그럼 이제 모델을 튜닝하기 위해 파라미터를 바꿔가면서 학습해 볼게요.
2.2 Parameter에 따른 모델 학습 및 평가
SVM 모델의 커널 함수로는 linear, polynomial 등이 사용될 수 있다. 커널 함수 별로 파라미터를 바꿔가며 학습을 진행해보겠다. 커널함수는 method인자에, 학습할 파라미터 경우의 수는 tuneGrid인자에 넣어주면 된다.
2.2.1 svmLinear 모델
# 파라미터에 따른 svmLinear 모델 학습
set.seed(1)
svmGrid <- expand.grid(C = seq(1,10,length=20))
svm2 <- train(tracheostomy ~ ., data = train01, method = "svmLinear", trControl = train_control, preProcess = c("center","scale"), tuneGrid = svmGrid)
svm2
- 'tuneGird' : 학습할 모델의 파라미터 종류 입력
(expand.grid(파라미터명 = 파라미터 input 값) 형태로 값을 넣어주면 되고, 어떤 파라미터를 입력해야 하는지는
7 train Models By Tag | The caret Package (topepo.github.io) 에서 확인할 수 있다.)
method가 'svmLinear' 인 경우에는 C (Cost) 파라미터만을 인자로 받기 때문에 expand.grid(C = seq(1,10,length=20))를 통해 1부터 10까지 20개의 길이로 input값을 지정해 주었다. 이렇게 학습한 svm2 결과를 출력해보면, 각 파라미터 별로 모델 성능을 확인할 수 있다.
# 모델 평가 confusion matrix
pred <- predict(svm2, test01)
actual <- test$tracheostomy
confusionMatrix(pred, actual, mode='everything')
predict함수에 위에서 학습한 svm2 모델을 넣으면 자동으로 Accuracy가 가장 높은 모델을 사용해서 결과를 예측해준다.
최종 모델은 Accuracy 78.7%로 초기 모델과 동일한 성능을 보이는 것을 확인할 수 있다.
2.2.2 svmPoly 모델
이번에는 커널함수로 Polynomial을 사용하는 'svmPoly' 모델을 학습해 보겠다.
method를 'svmPoly'로 변경하고, tuneGrid에는 C, degree, scale 3가지 파라미터에 대한 입력 값을 작성해준다.
# 파라미터에 따른 svmPoly 모델 학습
svmGrid.poly <- expand.grid(C = seq(1,10,length=20),degree = c(4,5,6), scale = T)
svm3 <- train(tracheostomy ~ ., data = train01, method = "svmPoly", trControl = train_control, preProcess = c("center","scale"), tuneGrid = svmGrid.poly)
svm3
마찬가지로 정확도를 계산해 보았을 때, Accuracy 83.6%로 default 모델, svmLinear 모델보다 높은 성능을 가지는 것을 확인할 수 있다.
# confusion matrix
pred <- predict(svm3, test01)
actual <- test$tracheostomy
confusionMatrix(pred, actual, mode='everything')
여기까지 caret 패키지를 사용해서 가장 높은 정확도를 보이는 svm 모델을 찾는 과정을 알아보았다.
아래 사이트를 참고해서 다양한 모델에 대한 튜닝, 학습을 진행할 수 있다.
7 train Models By Tag | The caret Package (topepo.github.io)
'Programming > R' 카테고리의 다른 글
[R] R에서 변수 동적 처리 (0) | 2024.07.12 |
---|---|
[R] R에서 라이브러리 (패키지) 만들기 (0) | 2024.07.09 |
[R] EDA with ggplot2 (0) | 2024.02.27 |
[R] K-Means Clustering (0) | 2024.02.26 |
[R] 자주 쓰는 전처리 코드 정리 (0) | 2024.02.23 |