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


Journal of Statistical Software

November 2008, Volume 28, Issue 5. http://www.jstatsoft.org/

Max Kuhn Pfizer Global R&D


요약
caret 패키지, 분류 및 회귀 훈련 (classification and regression training)의 약어, R에서 사용 가능한 풍부한 모델을 사용하여 예측 모델을 개발하기 위한 다양한 툴을 가진다. 패키지는 훈련을 단순화하고 그리고 모델링 기술의 폭넓고 다양한 기법의 튜닝에 초점을 맞춘다. 이것은 훈련 데이터의 예비-처리(pre-processing), 변수 중요도 계산(calculating variable importance), 그리고 모델 시각화(model visualizations)를 위한 방법 또한 포함한다. 전산 화학(computational chemistry)의 예는 실제 데이터 세트에서 기능을 설명하고 그리고 모델의 몇가지 타입으로 병행 처리(parallel processing)의 이점을 벤치마크(benchmark) 하기 위해 사용되었다.
Keywords : model building, tuning parameters, parallel processing, R, NetWorkSpaces.


원본 링크: PDF

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

1. Introduction

복잡한 분류와 회귀 모델의 사용은 점점 더 과학, 금융 그리고 수많은 다른 도메인에서 일상화 되고 있다 (Ayres 2007). R 언어는 (R Development Core Team 2008) 분류와 회귀 모두에서 함수 모델링의 풍부한 집합을 가진다, 사실 상당히 많은 분야, 각 함수의 구문 뉘앙스의 추적을 유지하는데 어려움이 더 증가하고 있다. caret 패키지는, classi cation and regression training의 약어, 몇가지 목적을 염두하여 만들어졌다.
  • 생성과 모델 예측을 위한 많은 함수들 사이에 구문의 다른점을 제거하기 위해,
  • 반-자동화된 집합을 생성 하기 위해, 많은 이러한 모델에서 조정 변수(tuning parameters)의 값을 최적화 하기 위한 합당한 접근 그리고
  • 병렬 처리 시스템으로 쉽게 확장 가능한 패키지를 생성.
패키지는 프로젝트 시작 단계에서 유용한 기능을 가진다 (e.g., 데이터 분할 그리고 예비-처리), 뿐만 아니라 비감독 특징 선택 루틴 (unsupervised feature selection routines) 그리고 과적합 진단에 도움이 되는 재표본을 사용하여 모델을 조정하는 함수(method).
패키지는 포괄적인 R 아카이브 네트워크 http://CRAN.R-project.org/package=caret에서 이용가능하다. caret은 25개의 다른 패키지에서 의존한다, 비록 이러한 많은 것들은 caret이 시작할 때 자동으로 적재되지 않는 "추천 (suggested)" 패키지 목록이다. 패키지는 모델이 훈련되거나 예측할 때 개별적으로 적재된다. 패키지가 설치되고 그리고 적재된 후에, 도움말 페이지는 help(package = "caret")를 사용하여 찾을 수 있다. vignette 함수를 사용하여 찾을 수 있는 3개의 패키지 비네트(vignette)가 있다 (e.g., vignette(package = "caret")).
이 논문의 나머지 부분에는, 패키지의 능력으로 다음을 논의한다: 데이터 분할 그리고 예비-처러 (data splitting and pre-processing); 모델 생성 그리고 조정 (tuning and building models); 성능 특성 그리고 변수 중요도 (characterizing performance and variable importance); 그리고 모델 생성 시간을 감소 하기 위한 병렬 처리 (parallel processing) 툴. 아무것도 없이 패키지의 능력을 논의하기 보다는, 실제 예제의 분석으로 패키지의 기능을 논증 하기 위해 사용 되었다. 이것은 독자가 다양한 툴을 다룬적이 있어 친숙하다고 가정한다. Hastie et al. (2001)는 이러한 툴의 좋은 기술 소개이다.


2. An illustrative example

전산 화학(computational chemistry)에서, 화학자는 화학 물질 구조와 어떤 관측된 끝점 사이의 예측 관계를 구축하기 위해 종종 시도한다, 이러한 생물학적 표적에 대한 활성과 같은. 혼합물의 구조 식을 사용하여, 화학 물질 설명 변수(descriptors)는 화학 물질의 특별한 특징을 잡아 내기 위한 시도로 생성될 수 있다, 그것의 크기, 복잡도, 지성(greasiness) 등. 모델은 관심 있는 결과를 예측 하기 위해 이러한 설명 변수를 사용하여 만들 수 있다. 설명 변수의 예 그리고 그들이 어떻게 사용되는 지를 위해 Leach and Gillet (2003) 보라.
Kazius et al. (2005)는 돌연변이를 예측하기 위해 화학 구조를 사용하는 것을 조사했다 (유전 물질의 손상에 의한 변이의 증가). Ames test (Ames et al. 1972)는 다양한 화학 물지의 돌여변이 유발 가능성을 추정하기 위해 사용했다. 돌연변이 비율 55.3%를 가진는 데이터 셋애 4,337개의 혼합물이 있다. 이러한 혼합물을 사용하여, dragonX 소프트웨어는 (Talete SRL 2007) 1,579개의 예측자의 기본 집합을 생성했다, 위상 및 연결 설명 변수, 다른 것들 사이에서. 이러한 변수는 기본 숫자 변수로 구성되고 그리고 변수를 센다 (e.g., 할로겐 원자 수(number of halogen atoms)).
설명 변수 데이터는 R 데이터 프레임 이름 descr에 들어가 있다 그리고 결과 데이터는 수준 "mutagen"과 "nonmutagen"를 가지는 mutagen라 불리는 펙터 벡터에 있다. 이러한 데이터는 페키지 웹사이트 http://caret.R-Forge.R-project.org/에서 접근 가능하다.

3. Data preparation

정형의 데이터가 모델의 훈련, 튜닝 및 평가에 사용하기에, 첫번째 해야 할 일은 어떻게 샘플을 이용할것인지 결정하는 것이다. 여기에는 사상적 학파가 몇 개 있다. 통계적으로, 데이터를 가장 효과적으로 사용하는 것은 표본의 모든 데이터를 훈련에 사용하고 그리고 모델의 효율 평가하기 위해 재표본(resampling e.g., cross-validation, the bootstrap etc.)을 이용한다. 재표본을 잘못 사용할 가능성이 있지만 (Ambroise and McLachlan 2002), 이 방법이 일반적이다. 아무튼 왜 재표본 단독 사용이 비효율적인지는 비기술적인 이유가 있다. 모델이 어떻게 사용하는지에 따라, 외부의 테스트/검증 표본 집합이 필요하고 그리고 모델의 성능은 모델 훈련에 사용하지 않은 데이터로 측정한다. 예를 들어, 모델 예측은 고도로 통제 된 환경에서 이용된다면(임상 진단), 사용자는 검증 집합으로 “hold-back”표본과 비교한다.
예시의 목적은, 초기에 훈련과 테스트 집합으로 데이터 분할에 있다. 테스트 집합은 (완성된 모델에)성능을 평가하는데 사용한고 훈련 집합은 모든 다른 활동에 사용한다.
createDataPartition 함수는 데이터 집합의 계층화된 분할한다. 이 경우에, 데이터의 75%는 모델 훈련에 사용하고 그리고 나머지는 모델 성능 평가를 위해 사용한다. 함수는 각 분류에 따라 무작위 분할한다. 그 결과 전체 분류 분포는 같아 진다.
R> library("caret")  
R> set.seed(1) 
R> inTrain <- createDataPartition(mutagen, p = 3/4, list = FALSE) 
R> 
R> trainDescr <- descr[inTrain,] 
R> testDescr <- descr[-inTrain,] 
R> trainClass <- mutagen[inTrain] 
R> testClass <- mutagen[-inTrain] 
R> 
R> prop.table(table(mutagen)) 
mutagen mutagen nonmutagen 
      0.5536332 0.4463668 
   
R> prop.table(table(trainClass)) 
trainClass mutagen nonmutagen 
         0.5535055  0.4464945
결과가 숫자형인 경우, 표본(samples)은 분위수로 분할되고 샘플링은(sampling) 각 분위수 내에서 행해진다. 이 논문에서는 논의되지 않지만, 패키지는 최대 차이 표본(maximum dissimilarity sampling (Willett 1999))을 사용하여 표본을 선택하는 함수를 가진다. 표본에 대한 이러한 접근은 그들의 예측 값에 근거하여 훈련 집합과 테스트 집합으로 표본을 분할하는데 사용한다.
하나의 유일한 값(공분산 예측:zero- variance predictors)을 가지면 모델 구축을 실패하게 만드는 원인이 된다. 우리는 재샘플링 모델을 사용하여 모델을 튜닝하기 때문에, 훈련 집합의 무작위 표본은 하나의 유일값을 가지는 표본을 공분산 예측이 되는 결과를 만들 것이다 (우리의 데이터에서, 데이터의 검증 집합과 훈련 집합으로 표본 분할은 3개의 예측자가 훈련집합에서 하나의 유일값을 갖는다). 이것들은 소위 "근접 공분산 예측자(near zero-variance predictors)"는 어떤 모델을 위한 재표본을 하는 동안 수치적인 문제를 유발한다.
그러한 예측자의 예로, 변수 nR04는 혼합물에서 4개의 링의 수를 갖는다. 훈련 집합에서, 모든 샘플에서 대부분은 (n = 3, 233) 18개의 혼합물이 하나를 가지고 다른 하나의 혼합물이 2개를 갖으면 4개의 링을 가질 수 없게 된다. 이러한 데이터가 재표본 된다면 이 예측자는 어떤 모델에서 문제가 될 수 있다. 예측자의 종류를 구분하기 위하여 2개의 특성를 조사해야 한다:
  • 첫번때로, 훈련집합에서 유일값의 퍼센트는 개개의 예측자를 위해 계산 된다. 낮은 수를 가지는 변수는 재표본에서 공분산 예측자가 되는 높은 확률을 갖는다. nR04 변수에서, 훈련집합에서 유일값의 백분율은 낮다(9.2%). 어쨌든, 예측자에 있어 이것은 문제가 되지 않는다. 가상의 변수 같은 이진 예측자에서 낮은 백분율을 가질 수 있고 이것은 단순한 이유에서 버려진다.
  • 조사되는 다른 중요한 범주는 변수의 빈도 분산의 왜도(skewness)이다. 두 번째로 가장 빈번한 값 예측의 가장 빈번한 값의 비율이 큰 경우, 예측의 분포가 매우 비대칭(왜도) 일 수있다. nR04 변수에서, 빈도율은 값의 빈도에 상당한 불균형을 초래할 수 있게 크다 (179 = 3233/18)
두 가지의 범주가 표시된다면, 예측자는 근접 공분산 예측자가 될 것이다. 아래의 경우 추측 가능:
  1. 유일값의 백분율이 20%보다 적어야 하고
  2. 가장 작은 빈도 비율이 두번째 작은 빈도 비율이 20 보다 커야 한다.
예측자는 어떤 모델에 문제를 야기할 수 있다. nearZeroVar 함수는 데이터 집합에서 근접 공분산 예측자를 구별하는데 사용한다. 이 함수는 컬럼의 위의 2개의 조건을 만족하지 않는 인덱스를 돌려준다.
또한 어떤 모델은 다중공선에 민감하다(i.e., 예측자 사이의 높은 상관관계). 선형 모델, 신경망 그리고 다른 모델들은 이러한 상황에 나쁜 성능을 가지거나, 불안정한 솔류션을 생성한다. 분류 및 회귀 트리 같은 다른 모델은 높은 상관관계의 예측자에게 내성이 생길 수 있다, 그러나 다중공선은 모델의 해석 능력에 부정적인 영향을 끼칠 것이다. 예를 들어, 분류 트리는 높은 상관관계를 가지고 좋은 성능을 가질 수 있다, 그라나 모델에서 예측 변수의 결정을 무작위로 한다.
만약 다중공선성의 영향을 최소화 한다면, 몇 가지 옵션이 있다. 첫째, 부분최소제곱 같은 것은 큰 예측 변수 간 상관관계에 내성이 생길 수 있다. 또한, 주성분 분석은 상관관계를 제거하는 방법으로 차원의 수를 줄일 수 있다(아래 참조). 대안으로, 우리는 상관관계에 가장 크게 기여하는 예측자를 제거하거나 구별 할 수 있다.
선형 모델에서, 다중공선을 줄이는 전통적인 방법은 가변평창계수(variable inflation factor (VIF))를 이용하여 잘못된 예측을 식별한다. 각각의 변수에서, 모델 파라메터의 변량의 증가의 통계량 측정은 최적의 상황고 비교하여 추정한다.(i.e., an orthogonal design). 이것은 선형 모델이 사용되고 예측자보다 더 많은 표본이 있으면 수용 가능한 기술이다. 다른 경우에, 이 기술은 적절하지 않을 것이다.
대안으로, 우리는 예측자의 상관 메트릭을 계산할 수 있고, 짝을 이루는 상관관계 모두 임계치 이하로 하여 문제가 발생할 예측자의 하위 집합를 제거하기 위한 알고리즘을 사용한다:


아래의 임계점을 수집:
repeat
    가장 큰 절대 상관계수를 가지는 예측자의 쌍을 찾음;
    쌍의 예측자에서, 각 예측자와 다른 모든 변수들 간의 평균 상관계수 계산;
    제거하기 위해 가장 큰 평균 상관계수를 가지는 변수를 표시;
    상관 메트릭에서 행과 열(row and column)를 제거;
until 임계점을 넘는 상관계수가 없음 ;
이 알고리즘은 예측자의 최조 집합을 찾는데 이용 될 수 있고, 그러면 짝-상관이 특별한 임계점 아래에 있게 된다. 두개의 변수가 높은 상관을 가지면 알고리즘은 가장 높은 상관관계를 가지는 하나를 결정하고 제거함을 유의해라.
다시 설명하면, 절대 짝-상관관계가 90보다 큰 결과의 예측자는 findCorrelation 함수를 사용하여 제거된다. 이 함수는 제거될 컬럼의 인덱스를 반환한다.

R> ncol(trainDescr)
[1] 1576
R> descrCorr <- cor(trainDescr)
R> highCorr <- findCorrelation(descrCorr, 0.90)
R> trainDescr <- trainDescr[, -highCorr]
R> testDescr <- testDescr[, -highCorr]
R> ncol(trainDescr)
[1] 650


화학 설명변수(descriptors)에서, 예측자 사이에 매우 큰 상관관계를 가지는 것은 일반적이다. 이 경우에, 0.90의 임계치를 사용하여 데이터에서 926개의 서술자를 제외했다.
일단 예측자의 최종 집합이 결정되고, 그 값이 모델에 사용하기 전에 변환하는 작업이 필요하다. 부분 최소 제곱(partial least squares), 신경망, 서포트 벡터 머신 같은 어떤 모델에서는, 중앙과 척도를 맞추는 것을 필요로 한다. preProcess 함수는 훈련집합을 사용하는 예측자의 변환은 값을 결정하기 위해 사용되고 검증 집합이나 미래의 표본에 사용 된다. 이 함수는 아규먼트(argument)로 method 를 갖는다. method로 "center", "scale", "pca" 그리고 "spatialSign" 값을 전달한다. 처음 두개의 옵션은 각각의 예측자를 위한 단순한 위치와 척도 변환을 한다(기본값으로 사용). 분류를 위한 예측함수는 새 표본에 프로세스를 적용하여 사용된다.

R> xTrans <- preProcess(trainDescr)
R> trainDescr <- predict(xTrans, trainDescr)
R> testDescr <- predict(xTrans, testDescr)

"pca" 옵션은 어떤 다른 데이터 집합에 적용할 주성분분석을 적재하고 계산된다. 많은 성분을 유지하기 위한 방법을 위해, preProcess 함수는 주성분에 채택된 변수의 누적 백분율이 임계점인 thread라 불리는 변수를 갖는다. 함수는 누적 백분율이 임계치를 넘을 때까지 성분을 추가한다. method 값이 척도 변환이 필요하지 않은 경우에서도, method = "pca"인 경우 데이터는 자동으로 척도변환 됨을 유의하라. PCA 변환을 위해, 예측 함수는 "PC1", "PC2" 등의 컬럼 이름을 가지는 값을 만든다.
method = "spatialSign" 명확히 하는 것은 각 표본을 위한 예측자의 값이 x = x/||x||을 사용하는 unit circle로 투영 될 때 공간 부호 변환(the spatial sign transformation, Serneels et al. ∗−2006)을 적용한다. 이 변환은 훈련 집합에서 x 공간에서 이상점을 찾는데 도움을 줄 것이다.

댓글 없음:

댓글 쓰기