Building Predictive Models in R Using the caret Package :: PART02

Max Kuhn Pfizer Global R&D


CONTENTS

  1. 1. Introduction
  2. 2. An illustrative example
  3. 3. Data preparation
  4. 4. Building and tuning models
  5. 5. Prediction of new samples
  6. 6. Characterizing performance
  7. 7. Regression models
  8. 8. Other modeling functions
  9. 9. Predictor importance
  10. 10. Parallel processing
  11. 11. Summary


4. Building and tuning models

train 함수는 재표본을 사용하는 모델의 성능을 추정하거나 모델의 튜닝 파라메의 값을 선택할 수 있다. 예를 들면 방사형 기저 함수(radial basis function) 서포트 벡터 머신(SVM)은 우리의 혼합물 화학 데이터에서 표본을 분류하는데 사용할 수 있다. 이 모델은 2개의 튜닝 파라메터를 갖는다. 첫번째는 기저방사함수에서 척도 함수이다.

K(a,b) = exp(- σ || a - b ||2)


그리고 다른 하나는 결정 경계의 복잡성을 제어하기 위한 비용 값 C 이다. 평가를 위한 후보 튜닝 값의 그리드를 만들 수 있다. 재표본 함수의 이용은, 부트스트랩 또는 교차-검증, 변경된 데이터 집합의 집합은 훈련 표본에서 생성된다. 각 데이터 집합은 홀드 아웃 표본(hold-out samples)의 집합과 대응한다. 개개 후보의 튜닝 파라메터 조합을 위해, 모델은 각각의 재표본된 데이터를 적합( fitting) 하고, 대응되는 홀드아웃 표본을 예측하기 위하여 사용된다. 재표본의 성능은 각각의 홀드아웃 표본 집합의 결과를 누적함으로서 평가한다. 이러한 성능 추정은 튜닝 파라메터의 결합이 적당한지 평가하기 위해 사용된다. 일단 최종 튜닝 값이 구해지면, 최종 모델은 전체 데이터 집합을 사용하여 다시 적합시키다.
train 함수를 위해, 가능한 재표본 함수들이 있다: 부트스트래핑, k-fold 교차 검증, leave-one-out 교차 검증 그리고 leave-group-out 교차 검증(재표본 없이분할 반복 ). 기본값으로 부트스트랩의 25회 반복이 재표본 스킴으로 사용된다. 이 경우에, 반복 횟수는 훈련 집합에서 큰 표본의 수로 인해 200까지 증가한다.
이런 특별한 모델을 위해, 훈련 집합에서 σ의 적당한 값을 바로 추정하기 위한 분석 함수를 실행한다(Caputo et al. 2002). 기본으로 train함수는 이런 파라메터를 초기화 하기 위해 kernlab 패키지에 있는 sigest함수를 사용한다. 이렇게 함으로써, 비용 파라메터 C값은 유일하게 최적화된 파라메터가 된다.
train 함수는 아래의 변수를 갖는다:

x: 예측자의 데이터 프레임 또는 메트릭. 지금은, 함수는 오직 숫자형 값만 허용한다(i.e., factors 또는 character 변수는 지원 안함). 어떤 경우는, model.matrix 함수는 순수한 숫자형 데이터의 데이터 프레임 또는 메트릭을 생성하기 위해서 필요할 것이다.

y: 숫짜 또는 factor 벡터의 출력 값. 함수는 이 변수에서 주어진 응답의 타입(분류 또는 회귀)에서 문제의 타입을 결정한다.

method: 모델 타입을 구별하기 위한 문자열로 사용. 가능한 값은 테이블 1 참조.

metric: "Accuracy", "Kappa", "RMSE" 또는 "Rsquared" 값을 가지는 문자열 스트링. 이 값은 최종 모델에 의해 선택되는 목적 함수가를 결정한다. 예를 들어, "Kappa"를 선택하면 held-out 함수를 표본에서 계산된 평균 카파 통계량 중 가장 큰 값을 가지는 향상(tuning) 파라메터를 선택하게 만든다.

trControl: 함수를 위한 제어 변수의 리스트를 갖는다. 재표본의 반복 수 뿐 아니라 재표본의 타입은 이 리스트를 사용하여 집합을 만든다. trainControl 함수는 기본 변수를 계산하기 위해 사용될 수 있다. 표본 반복의 기본값은 25이다, 정확한 성능 추정을 하기 위해 너무 작은 경우에.

tuneLength: 튜닝 변수의 기본 그리드 값의 크기를 제어. train 함수는 각 모델에서, 후보 값들에서 복잡한 변수의 그리드를 선택한다. SVM 모델을 위해, 함수는 10-1, 1, 10에서 튜닝한다. 기본 리스트의 크기를 크게 하기 위해서, tuneLength 변수가 이용될 수 있다. tuneLength = 5, 0.1 에서 1000 까지 C 값을 선택하는 것으로 추정한다.

tuneGrid: 튜닝 변수의 특별한 그리드를 정의하기 위해 사용 가능. 아래의 예 참조.

... : 세개의 점들은 표 1에서 나열된 함수의 추가 변수를 전달하기 위해 사용될 수 있다. 예를 들어, 우리는 이미 중앙화 되고 척도화 된 예측자를 갖는다. 그래서 변수 scaled = FALSE 는 ksvm함수가 전처리 과정의 복제를 방지하기 위해 전달 할 수 있다.


Model method value Package Tuning parameters
Recursive partitioning rpart rpart* maxdepth
ctree party mincriterion
Boosted trees gbm gbm* interaction.depth,n.trees
n.trees, shrinkage
blackboost mboost maxdepth, mstop
ada ada maxdepth, iter, nu
Other boosted models glmboost mboost mstop
gamboost mboost mstop
logitboost caTools nIter
Random forests rf randomForest * mtry
cforest party mtry
Bagged trees treebag ipred None
Neural networks nnet nnet decay, size
Partial least squares pls * pls, caret ncomp
Support vector machines
(RBF kernel)
svmRadial kernlab sigma, C
Support vector machines
(polynomial kernel)
svmPoly kernlab scale, degree, C
Gaussian processes
(RBF kernel)
gaussprRadial kernlab sigma
Gaussian processes
(polynomial kernel)
gaussprPoly kernlab scale, degree
Linear least squares lm * stats None
Multivariate adaptive regression splines earth* , mars earth degree, nprune
Bagged MARS bagEarth* caret, earth degree, nprune
Elastic net enet elasticnet lambda, fraction
The lasso lasso elasticnet fraction
Relevance vector machines
(RBF kernel)
rvmRadial kernlab sigma
Relevance vector machines
(polynomial kernel)
rvmPoly kernlab scale, degree
Linear discriminant analysis lda MASS None
Stepwise diagonal discriminant analysis sddaLDA, sddaQDA SDDA None
Logistic/multinomial regression multinom nnet decay
Regularized discriminant analysis rda klaR lambda, gamma
Flexible discriminant analysis (MARS basis) fda * mda, earth degree, nprune
Bagged FDA bagFDA * caret, earth degree, nprune
Least squares support vector machines (RBF kernel) lssvmRadial kernlab sigma
k nearest neighbors knn3 caret k
Nearest shrunken centroids pam * pamr threshold
Naive Bayes nb klaR usekernel
Generalized partial least squares gpls gpls K.prov
Learned vector quantization lvq class k
Table 1: train에 사용된 모델 ( *는 모델-특징 변수 중요 메서드를 사용함을 나타냄, see Section 9.).


우리는 아래의 코드를 이용하여 SVM model을 조정하고 만들 수 있다.

R> bootControl <- trainControl(number = 200)
R> set.seed(2)
R> svmFit <- train(trainDescr, trainClass,
+                  method = "svmRadial", tuneLength = 5,
+                  trControl = bootControl, scaled = FALSE)

Model 1: sigma=0.0004329517, C=1e-01
Model 2: sigma=0.0004329517, C=1e+00
Model 3: sigma=0.0004329517, C=1e+01
Model 4: sigma=0.0004329517, C=1e+02
Model 5: sigma=0.0004329517, C=1e+03
R> svmFit

Call:
train.default(x = trainDescr, y = trainClass, method = "svmRadial",
              scaled = FALSE, trControl = bootControl, tuneLength = 5)

3252 samples
650 predictors

summary of bootstrap (200 reps) sample sizes:
   3252, 3252, 3252, 3252, 3252, 3252, ...


boot resampled training results across tuning parameters:
sigma    C    Accuracy Kappa Accuracy SD Kappa SD Selected
0.000433 0.1  0.705    0.395 0.0122      0.0252
0.000433 1    0.806    0.606 0.0109      0.0218
0.000433 10   0.818    0.631 0.0104      0.0211 *
0.000433 100  0.8      0.595 0.0112      0.0227
0.000433 1000 0.782    0.558 0.0111      0.0223
Accuracy was used to select the optimal model

이 출력에서, 각 행(row)는 조정 변수의 특별한 조합에 상응하는 테이블. "Accuracy" 컬럼은 200개의 held-out 표본의 평균 정밀도 이고 그리고 "Accuracy SD"인 컬럼 명칭은 200개의 정밀도의 표준편차이다.
Kappa 통계량은 우연하게 예상되는 어떤 것에 상응하는 일치 정도를 측정하는 범주형 데이터를 위한 일치의 척도이다. 1값은 완전하게 일치한다른 것을 가리킨고, 0 값은 일치의 부족을 가리킨다. 음수의 Kappa 값을 가질 수 있지만 관측된 데이터와 예측된 데이터의 부정적인 상관관계를 가리키므로 일반적이지 않다. Kappa 는 분류가 크게 균형이 안 맞는 경우 훌륭한 측정 수단이다. 예를 들어, 데이터에서 돌연변이의 비가 5% 이내로 매우 작다면, 대부분의 모델은 모든 혼합물의 돌연변이 비를 에측함에 정밀도가 높아진다. 이 경우에, Kappa 통계량은 거의 0에 가깝게 나올 것이다. 여기서 주어진 Kappa 통계량은 e1071 패키지에 있는 classAgreement 함수에 의해 계산된 가중치가 없는 버전이다(Dimitriadou et al. 2008). 위의 결과에서 Kappa 컬럼은 200개 표본의 Kappa 추정치를 요약한다.
이전에 다루어진, "최적" 모델은 가장 큰 정밀도를 가지는 후보 모델을 선택한다. 하나 보다 많은 "최적" 모델이 있으면 함수는 가장 간단한 복합 모델에 상응하는 조합을 선택한다. 이러한 데이터는 σ가 0.000433 으로 추정되고 C = 10 으로 최적값이 나타난다. 이런 값을 근거로, 모델은 3,252 개의 표본의 원본 집합을 재적합하고(refitting), 이 객체는 svmFit$finalModel에 저장된다.
R> svmFit$finalModel
Support Vector Machine object of class "ksvm"

SV type: C-svc (classification)
 parameter : cost C = 10
 
Gaussian Radial Basis kernel function.
 Hyperparameter : sigma = 0.000432951668058316
 
Number of Support Vectors : 1616

Objective Function Value : -9516.185
Training error : 0.082411
Probability model included.
많은 경우에, 조정 변수의 그리드 전체에서 더많은 제어가 필요하다.예를 들어, gbm 패키지(Ridgeway 2007)의 함수를 사용하는 boosted trees 경우, 우리는 트리 전체를 조정할 수 있다(i.e., boosting iterations), 트리의 복잡도(interaction.depth 나타내는) 그리고 학습율(shrinkage라 알려짐). 예로, 사용자는 (점 앞에)컬럼은 조정 변수의 이름이고 행(row)은 조정 변수 조합과 상응하는 데이터 프레임을 사용하여 조정하는 값의 그리드를 명확히 할 수 있다. 데이터에서 우리는 50개 조합의 그리드를 만들고, 이 값을 사용하기 위해 train 함수에 tuneGrid 변수를 사용한다.


R> gbmGrid <- expand.grid(.interaction.depth = (1:5) * 2,
+                         .n.trees = (1:10)*25, .shrinkage = .1)
R> set.seed(2)
R> gbmFit <- train(trainDescr, trainClass,
+                  method = "gbm", trControl = bootControl, verbose = FALSE,
+                  bag.fraction = 0.5, tuneGrid = gbmGrid)

Model 1: interaction.depth= 2, shrinkage=0.1, n.trees=250
 collapsing over other values of n.trees
Model 2: interaction.depth= 4, shrinkage=0.1, n.trees=250
 collapsing over other values of n.trees
Model 3: interaction.depth= 6, shrinkage=0.1, n.trees=250
 collapsing over other values of n.trees
Model 4: interaction.depth= 8, shrinkage=0.1, n.trees=250
 collapsing over other values of n.trees
Model 5: interaction.depth=10, shrinkage=0.1, n.trees=250
 collapsing over other values of n.trees

Figure 1: train 객체의 plot함수 예. (a) 분류 정밀도 대 튜닝 펙터의 플롯(plot(gbmFit) 사용)). (b) 비슷하게, Kappa 통계량 프로파일 플롯(plot(gbmFit, metric = "Kappa")). (c) 정밀도 값의 수준 플롯(plot(gbmFit, plotType = "level")). (d) 최종 모델에서 정밀도와 카파를 추정한 200 부트스트랩의 밀도 플롯(Density plots) (resampleHist(gbmFit)).
이 모델에서, 우리는 50개의 후보 모델로 성능을 계산하고 가장큰 정밀도를 가지는 모델을 선택하기 위해 200개의 부트스트랩(bootstrap) 복제한다. 이 경우에 8개의 상호작용 깊이를 가지고 250번의 부스팅 반복을 가지고 자동으로 모델을 선택한다(비록 다른 값들은 적당하지만; 그림 1 참조). train 객체의 다른 결과가 다양게 보인다. 그림 1은 plot.train과 resampleHist를 이용하여 만들어진 몇개의 샘플 도표를 보여준다.
프로시저가 "n.trees의 다른 값 모두 에서 붕괴"가 나타남을 주의해라. 어떤 모델은(method 값이 pls, plsda, earth, rpart, gbm, gamboost, glmboost, blackboost, ctree, pam, enet 그리고 lasso 을 가지는 모델), train 함수는 어떤 하위 모델을 위한 예측을 유도하기 위해 사용되는 모델을 적합(fit)할 것이다. 예를 들어, 부스팅 모델은 부스팅의 각각의 반복에 대한 결과를 저장하고, train 함수는 다른 조정 변수가 같고 다른 부스팅 반복에서 적은 수가 요구되는 경우, 가장 많은 반복을 하는 모델을 적합(fit) 한다. 위의 예에서, interaction.depth = 2 이고 shrinkage = .1 를 가지는 모델, 우리는 오직 가장 큰 반복을 가지는 모델을 접합할 필요가 있다(이 예에서는 250). interaction.depth와 shrinkage 를 상수로 고정하는 것은, 250번의 반복 보다 적은 모델을 예측하기 위한 계산 시간이 상대적으로 저렴하다. 위의 예에서, 우리는 250 * 5 * 10 = 10,000 대신에 250 * 50 = 1,000개의 모델을 적합한다(fit). train 함수는 가능한한 많은 모델의 특징을 표현하려고 시도한다.
재귀 분할 모델(recursive partitioning model)애서, 초기 모델은 어떤 노드의 최대 깊이의 가능한 값을 구하기 위하여 훈련 집합 전체를 적합한다. tuning grid는 이러한 값들에 근거하여 생성된다. tuneLength 가 가능한 최대 깊이 값보다 크다면, 초기 모델에 의해 결정된 값, 그리드는 maxdepth 리스트로 잘려진다. 초기 모델이 가능 임계치 값을 찾기 위한 근접 중앙 축소 모델(nearest shrunken centroid model)도 같게 적합한다. 그리고 MARS 모델들(Section 7 확인).
또한, mboost 패키지(Hothorn and Buhlmann 2007)의 glmboost 와 gamboost 함수에서는, 추가 조정 변수 prune이 훈련에 사용된다. prune = "yes" 이면 트리의 수는 AIC 통계량에 근거하여 축소된다. "no"이면 트리의 수는 mstop 값으로 명시된 값으로 유지된다. AIC 가지치기에 대한 보다 상세한 내용은 Buhlmann and Hothorn (2007)를 보라.
일반적으로, caret 패키지에서 함수는 데이터에서 missing values가 없다고 추정하나 또는 다른 값으로 대체(전가)되거나 다른 방법을 통해 처리된다. missing value를 처리하기 위한 어떤 모델이 있다(rpart의 경우). 이 경우는 x 변수로 전달된 데이터는 missing values를 포함할 수 있다.

5. Prediction of new samples

이전에 설명한 바와 같이, train 클래스의 객체는 재표본에 의해 선택된 튜닝 파라메터를 가지고 적합된 모델인 finalModel라 불리는 속정을 가진다. 이 객체는 모델의 prediction 함수를 사용하여 새로운 표본의 예측을 생성하기 위한 일반적인 방법으로 사용 될 수 있다. 대부분의 경우, R에서의 prediction 함수는 일관성있는 문장을 따르지만, 그러나 예외가 있다. 예를 들어, gbm 함수에 의해 만들어진 부스티드 트리 모델(boosted tree models)은 트리 모델의 수를 명확히 하는 것이 요구된다.또한, pls 패키지의 predict.mvr (Mevik and Wehrens 2007)은 테스트된 ncomp 의 모든 후보값으로 예측을 수행한다. 이러한 미묘한 차이를 피하기 위하여 caret은 이러한 문제를 처리할 수 있는 몇가지 함수를 제공한다.
predict.train함수는 어떤 추가 변수의 명세를 다루는 모델의 예측함수의 인터페이스이다(이전에 gbm 와 PLS 모델을 위해 다룸). 예:
R> predict(svmFit$finalModel, newdata = testDescr)[1:5]
[1] mutagen nonmutagen nonmutagen nonmutagen mutagen
Levels: mutagen nonmutagen

R> predict(svmFit, newdata = testDescr)[1:5]
[1] mutagen nonmutagen nonmutagen nonmutagen mutagen
Levels: mutagen nonmutagen


같은 데이터 집합으로 다중 모델을 위해 예측이 필요한 경우에, predict.list가 내부적으로 사용 될 수 있다:
R> models <- list(svm = svmFit, gbm = gbmFit)
R> testPred <- predict(models, newdata = testDescr)
R> lapply(testPred, function(x) x[1:5])
$svm
[1] mutagen nonmutagen nonmutagen nonmutagen mutagen
Levels: mutagen nonmutagen

$gbm
[1] mutagen mutagen mutagen nonmutagen mutagen
Levels: mutagen nonmutagen
predict.train는 각각의 모델의 예측 벡터를 생성한다. extractPrediction 함수는 한번에 훈련 또는 미확인 표본의 예측 값을 얻는데 사용할 수 있고, 데이터 프레임의 데이터를 리턴할 것이다. 예

R> predValues <- extractPrediction(models,
+                                  testX = testDescr, testY = testClass)
R> testValues <- subset(predValues, dataType == "Test")
R> head(testValues)

            obs       pred      model dataType
3253    mutagen    mutagen svmRadial      Test
3254 nonmutagen nonmutagen svmRadial      Test
3255    mutagen nonmutagen svmRadial      Test
3256 nonmutagen nonmutagen svmRadial      Test
3257    mutagen    mutagen svmRadial      Test
3258    mutagen    mutagen svmRadial      Test

R> table(testValues$model)
    gbm svmRadial
   1083 1083
   
R> nrow(testDescr)
[1] 1083

이 출력은 관측된 결과, 모델 에측, 모델 타입 그리고 데이터 타입(i.e., training, test or unknown)을 나타내는 컬럼을 가진다.
표 1에서 나열된 많은 분류 모델에서 분류 확률을 만들 수있다. 이 값은 변수 type = "prob"을 사용하는 predict.train 을 사용하여 접근할 수 있다. 이 경우에, 함수는 각각의 분류의 확률 컬럼을 가지는 데이터 프레임을 반환할 것이다. 또한 extractProb 함수는 extractPrediction와 비슷하지만, 그러나 데이터에서 각각의 분류를 위한 분류 확률을 생성한다. 확률의 추가 컬럼은 훈련에서 생성된 펙터의 각각의 수준(level)을 제공한다.
R> probValues <- extractProb(models,
+                            testX = testDescr, testY = testClass)
R> testProbs <- subset(probValues, dataType == "Test")
R> str(testProbs)
'data.frame': 2166 obs. of 6 variables:
$ mutagen   : num 0.6274 0.2970 0.1691 0.0177 0.9388 ...
$ nonmutagen: num 0.3726 0.7030 0.8309 0.9823 0.0612 ...
$ obs       : Factor w/ 2 levels "mutagen","nonmutagen": 1 2 1 2 1 1 2 2 2 2 ...
$ pred      : Factor w/ 2 levels "mutagen","nonmutagen": 1 2 2 2 1 1 2 2 2 2 ...
$ model     : chr "svmRadial" "svmRadial" "svmRadial" "svmRadial" ...
$ dataType  : chr "Test" "Test" "Test" "Test" ...
분류 모델에서 plotClassProbs 함수의 기능은 plotClassProbs의 결과를 사용하여 분류 확률의 분산을 눈으로 보기위한 히스토그램(Sarkar 2008)을 위한 라티스 플롯(lattice plot)을 생성한다. 그림 2는 plotClassProbs(testProbs)을 사용하여 생성되었고 다른 모델에 대한 변이 분포와 참 분류의 확률의 히스토그램을 보여준다.
Figure 2: 2개 모델의 "mutagen" 분류 확률 히스토그램(plotClassProbs(testProbs) 사용하여 생성됨). panel은 모델 사용과 관측된 분류에 대응.(패널에서 Data로 표시).

댓글 없음:

댓글 쓰기