Caret의 이해

Caret pakcage에 대해서 좀 더 알아 본다.

이전 포스
공식 사이트

Ch.11 Improving Model Performance

트레이닝 조건의 셋의 최적화 지점을 체계적으로 찾아서 모델의 성능을 튜닝하는 방법을 어떻게하면 자동으로 하는지를 배운다.

모델을 하나의 그룹으로 연합시키는 방법이다.

결정 트리의 variant

Tuning Stock Models for Better Performance

Machine Learning 알고리즘을 선택하는 만큼이나,
Parameter를 선택하는 것도 중요하고 어려운 문제이다.
Caret pakcage는 이러한 parameter 튜닝을 쉽게 하기위해서 grid search를 제공 한다.

Parameter tuning
This process of adjusting the model options to identify the best fit is called parameter tuning.

각 모델에서 필요한 파라메터를 바꿔 가면서 모델링을 수행 할 수 있다.

지원하는 모든 모델의 리스트는 아래 URL에서 확인 가능하다.
https://topepo.github.io/caret/modelList.html

특정 모델의 지원 파라메터를 잊었을 경우 아래 명령어로 확인 할 수 있다.

> modelLookup("nb")
  model parameter              label forReg forClass probModel
1    nb        fL Laplace Correction  FALSE     TRUE      TRUE
2    nb usekernel  Distribution Type  FALSE     TRUE      TRUE

Searching a set of cndidate models comprasing a matrix, or gride, of paremter combinations is impractical.
So, only a subset of possibilities is used to construc the grid.
By default, caret searches at most three values for each of the p parameters.
This means that at most $3^p$ cnadidate models will be tested.

하지만 이렇게 default tuning matrix을 쓰는것은 그다지 scientific하지 않다.

튜닝 파라메터를 주고 그중에서 최적의 모델을 선택 할수도 있다.

아래와 같은 코드에서 grid 방식으로 $ 4 \times 4$의 경우의 수가 존재하게 된다.
이것들을 하나하나 적용하면서 가장 정확도가 높은 model을 자동으로 선택하게 된다.
모델의 평가 방식은 10-folds cross validation 방식을 따른다.

set.seed(12358)
library(foreach)
library(caret)
ctrl <- trainControl(method="cv", 10)
grid <- data.frame(.fL=c(0,0,1,1), .usekernel=c(FALSE,TRUE,FALSE,TRUE))
sms_model1 <- train(dfList, factorClassList, method="nb",trControl = ctrl, tuneGrid = grid)

Variable Importance

Variable Importance

two class problems
만약 Model에서 제공해주는 importance 측정 방법이 존재 하지 않는다면
각 predictor의 importance는 filter를 적용해서 평가 되어 질 수 있다.

ROC Curve분석을 각각의 predictor에 적용하게 된다.

trapezoidal rule을 이용해서 ROC curve의 면적을 계산 한다. 그리고 이 면적의 값이variable importance가 된다.

Multi-class problems
각각의 클래스를 분리한다.
그렇게해서 class들간의 쌍을 만든다.

class1 vs class2
class2 vs claass3
이런 형식이다.

이러한 각 class들에 대해서 최대 curve 면적 값을 가지는 것을 variable importance로 규정 한다.

regression

t-value의 기울기 절대치를 이용하거나
R^2를 이용 한다.

Example

sacle=FALSE 이면 정규화를 하지 않는다.
scale=TRUE로 설정하면 0~100 사이의 score로만 표현된다.

varImp(sms_model1, scale=FALSE)

                    Importance
df.title                0.7292
df.hours                0.6968
df.app_name             0.5589
df.recentPhoneUsage     0.5360

filterVarImp

the area under the ROC curve를 각각의 predictor에 대해서 구하고 싶을 경우, filterVarImp를 사용하게 된다.

RocImp <- filterVarImp(x = training[, -ncol(training)], y = training$Class)
RocImp
          M         R
V1 0.6273646 0.6273646
V2 0.5765656 0.5765656
V3 0.5999674 0.5999674
V4 0.6614481 0.6614481
V5 0.6520711 0.6520711
V6 0.5923842 0.5923842

위와 같이 각 feature들을 1개씩 적용 했을 때의 각각의 class에 대한 ROC 면적을 알 수 있다.

Bayes Classifier의 경우 scale을 FALSE로 설정할 경우 varImp와 filterVarImp의 결과는 같게 된다.

VI <- varImp(sms_model1, scale=FALSE)
VI["importance"][[1]][[1]]

RocImp <- filterVarImp(x = dfList[[1]], y = factorClassList[[1]])
RocImp

실행 결과

> RocImp
      FALSE.     TRUE.
X1 0.9085812 0.9085812
X2 0.5491523 0.5491523
X3 0.6975939 0.6975939
X4 0.4907589 0.4907589
X5 0.4425584 0.4425584
X6 0.5000964 0.5000964
X7 0.4230355 0.4230355
X8 0.5114213 0.5114213

> VI["importance"][[1]]
      FALSE.     TRUE.
X1 0.9085812 0.9085812
X2 0.5491523 0.5491523
X3 0.6975939 0.6975939
X4 0.4907589 0.4907589
X5 0.4425584 0.4425584
X6 0.5000964 0.5000964
X7 0.4230355 0.4230355
X8 0.5114213 0.5114213

이전 POST: ROC 정의

그래프 그리기

plot(varImp(sms_model1, scale=FALSE))


+ Recent posts