Terry M. Therneau
Elizabeth J. Atkinson
Mayo Foundation
June 29, 2015
Elizabeth J. Atkinson
Mayo Foundation
June 29, 2015
CRAN에서 R의 rpart 패키지 비네트 문서를 번역
원본: PDF
Contents
1 소개(Introduction)
이 문서는 이전 스텐포드 보고서(Stanford report [5])의 확장으로 샘풀 통계학의 메이요 클리닉 부서(the Mayo Clinic Division of Biostatistics [6])의 기술 보고서를 편집했다.이 문서는, CART(Classification and Regression Trees) 책과 Breiman, Friedman, Olshen and Stone [1]의 프로그램에서 찾을 수 있는 많은 사상을 수행하는, rpart 루틴에서 찾을 수 있는 함수의 짧은 개요를 제공할 의도로 작성되었다. CART 는 이러한 사상들을 수행하는 특별한 소프트웨어의 트레이드마크된 이름이다. 그리고, 트리는 Clark 와 Pregibon의 SPlus루틴은 사용하고 있다(다른 약어- 재귀 분할(Recursive PARTitioning) 또는 rpart 가 선택됨). 이 라벨 "rpart"가, 자유롭게 접근할 수 있는 영향을 증거로, 원본이고 더 잘 설명된 "cart" 보다 더 일반적인 점은 좀 유머러스 하다.
rpart 프로그램은 2단계의 프로시저를 사용하는 매우 일반적인 구조의 분류와 회귀 모델을 만든다: 결과 모델은 이진 트리처럼 표현된다. 예제는 심장 마비 환자 구급대에서 수집된 일반적인 예비 데이터이다. 목표는 알고 있는 14개의 변수 혹은 구급대 도작의 시간에 근거하여 환자가 일상생활에서 성공적으로 생존 할 수 있는지 예측하는 것이다(e.g., 성별(sex), 나이(age), 심장 발작 시간과 처음 치료의 시간 차이 등). 현장에 도착하지 않는 어떤 환자는 나중에 병원에서 성공적으로 소생할 수 있기 때문에, 이러한 다루기 힘든 경우의 빠른 식별은 상당한 임상학적 관심사이다.
Figure 1: Revival data |
그림 1에서 보여준 것처럼 4개의 그룹으로 환자를 분리한 결과 모델, 아래의 경우
X1 = initial heart rhythm 1= VF/VT 2=EMD 3=Asystole(부전수축) 4=Other X2 = initial response to defibrillation(세동제거, 전기충격요법, 의학 용어) 1=Improved 2=No change 3=Worse X3 = initial response to drugs 1=Improved 2=No change 3=Worse
다른 11개의 변수는 최종 모델에 나타나지 않는다. 이 프로시저는, 분명한 순서가 있지만 간격이 동일하지 않은, X1과 같은 변수에 특히 잘 동작하는 것처럼 보인다.
트리는 아래의 프로세스에 의해 만들어 진다: 첫번째 단독 변수는 두개의 그룹으로 최적의(best) 분할하는 데이터를 찾는다("best"는 나중에 정의함). 데이터가 분할되고, 그리면 이 프로세는는 각 서브-그룹에 분리하여 적용되고, 그리고 재귀적으로 서브 그룹이 최소 크기(이 데이터에서는 5개)에 도달하거나 혹은 향상도가 만들어지지 않을 때까지 수행한다.
결과 모델은 확실히 너무 복잡하고, 그리고 언제 중지할 지에 대해 모든 단계의 프로시저에서 행해진다는 문제가 나타난다. 프로시저의 두번째 단계는 전체 트리를 역으로 잘라내는 교차-검증(cross-validation)을 사용하는 것으로 이루어 진다. 위의 의학 예에서 전체 트리는 10개의 최종 도작지가 있다. 위험 교차 검증 추정은 서브 트리의 내부 집합에서 계산된다: 최종 모델은 위험이 가장 낮은 추정치를 가지는 서브 트리이다.
2 표기(Notation)
분할 함수는 많은 다른 종류의 데이터에 적용 할 수 있다. 우리는 더 교훈적인(그라나 또한 가장 복잡한 수식을 가지는) 하나의 분류 문제에서 보는 것에서 시작할 것이다. 예제의 모집단은 C 분류의 n개의 관측치로 구성된다. 주어진 모델에서는 k개의 마지막 그룹에서 이러한 관측치들은 끝날 것이다: 각 그룹은 예측 클래스로 사용하기 위하여. 실제 어플리케이션에서, 대부분의 파라메터는 데이터에서 추정되고, 각 추정식은 ≈ 형식으로 제공된다.
πi | i = 1; 2; :::;C 각 분류의 사전 확률(prior probabilities of each class) |
L(i, j) | i = 1; 2; :::;C 오분류를 위한 손실 메트릭
(Loss matrix for incorrectly classifying) an i as a j. L(i, i) ≡ 0 |
A | 트리의 노드.
A는 표본 데이터에서 개개의 집합이고 그리고, 그것을 만들어내는 트리에서, 미래의 데이터를 위한 분류 규칙. |
τ(x) | x가 예측 변수의 벡터인 경우, 관측값 x에서의 참 분류. |
τ(A) | A에 할당된 분류, A가 최종 노드가 된다면. |
ni, nA | 분류 i의 표본에서 관측 수, 노드 A에서 관측 수 |
P(A) | A의 확률 (미래의 관측을 위한)
= Σi=1C πi P {x ∈ A | τ(x) = i} ≈ Σi=1C πi niA / ni |
p(i | A) |
P {τ(x) = i | x ∈ A} (미래 관측을 위함)
= πi P { x ∈ A | τ(x) =i } / P{ x ∈ A } ≈ πi (niA / ni) / Σ πi (niA / ni) |
R(A) | 위험 A
= Σ i=1C p(i | A) L(i, τ(A)) τ(A) 위험이 최소인 값을 선택한 경우 |
R(T) | 모델(또는 트리)의 위험 T
= Σ i=1k P(Aj) R(Aj) Aj 트리의 최소 노드인 경우 |
모든 i ≠ j 에서 L(i, j) = 1 이면, 우리는 이 표본에서 사전(prior) 확률 π는 관측된 분류의 빈도와 같게 놓을 것이다. 그러면 p (i | A) = n iA 가 되고 그리고 R(T)는 잘못 분류된 확률이 된다.
3 트리 구축(Building the tree)
3.1 특징 분할(Splitting criteria)
우리가 노드 A를 AL 과 AR의 자식 노드(왼쪽 그리고 오른쪽 자식)로 나눈다면, 우리는
P(AL)r(AL) + P(AR)r(AR) ≤ P(A)τ(A)
수식을 가질 것이다([1]에서 증명됨).
이 수식의 사용은, 위험은 줄이고 최대값 Δr로 나누는 선택을 하는 트리를 구축하는 하나의 분명한 방법이다. 이 방법의 결점은 있다, 어쨌든, 아래에 예로 보여준다:
손실률은 같고 그리고 데이터의 80%가 분류 1(class 1) 이고, 어떤 임시 분할의 결과가 AL은 54%의 분류 1이(전체 자식 노드의 집합에서) 되고 그리고 AR은 100%의 분류 1을 가지는(전체 자식 노드의 집합에서) 경우를 가상해 보자. 온쪽과 오른쪽 자식 모두 최소 위험 예측은 τ(AL) = τ(AR) = 1 이므로, 이 분할은 Δr = 0 을 가진다. 또한 과학적으로 표본은 매우 가치있는 분할이다. 중용한 실제 데이터에서, 첫째 몇 개의 분할은 이것보다 종종 더 잘 분할하지 못한다.
더 심각한 결함은 위험 감소가 기본적으로 선형이다 라는 것이다. 만약 두개의 경쟁 분할이 있으면, 하나는 각각 80%와 50%의 순도로 그룹으로 데이터가 분할되고, 다른 하나는 70%-70% 분할될 경우, 우리는 일반적으로 전자를 더 선호할 것이며, 다음 분할에서 더 잘 분할하는 다른 이유가 없으면.
이러한 문제를 모두 처리하는 하나의 방법은 look-ahead rules을 사용한다; 그러나 rpart가 가지는 노드의 불순도나 다양성 측정의 몇 가지 중 하나를 사용하지 않는다면 계산 비용이 매우 비싸다. f 를 불순도 함수로 놓고 그리고 A가 미래의 표본에서 분류 i(Class i)를 가지는 확률이 piA 인 경우, 노드 A의 불순도를 아래와 같이 정의한다.
I(A) = Σ f(piA), i = 1, 2, 3, ..., C
A가 순수할 때 I(A) =0 이므로, f는 f(0) = f(1) = 0 가지고 오목한 곡선이 될 것이다.
Figure 2: 2개의 그룹에서 Gini와 정보 불순도의 비교 |
f의 두 후보는 정보 지수 f(p) = - p log(p) 이고 그리고 Gini 지수는 f(p) = p( 1 - p) 이다. 우리는 그러면 최대 불순도 감소를 가지는 분할을 이용할 수 있다
ΔI = p(A) * I(A) - p(AL) * I(AL) - p(AR) * I(AR)
두개의 불순도 함수는 Gini 측정의 재척도된 버전을 가지는 figure (2)에 플롯되었다. 두개의 분류 문제에서는 약간의 차이가 있고, 그리고 항상 같은 분할 포인트를 선택할 것이다.
위의 분류와 잘 맞지 않는 다른 블록 기준은(convex criteria) 2개의 분류이고 아래의 수식을 가진다.
C1, C2는 어떤 분할이 두개의 분할 집합으로 C 분류가 분할된 값인 경우.
I(A) = min [f(pc1) + f(pc2], C1 C2 중 작은값 가짐
C = 2 이면 두개 분류는 f의 일반적인 불순도 지수와 동등하다. 놀랍게도, 2개의 분류는 일반적인 불순도 지수와 같은 거의 같은 효과로 계산할 수 있다. 2개의 분류의 잠재적인 장점의 하나는 출력은 사용자에게 데이터 구조에 관계된 추가적인 인사이트(insight, 숨은 가치의 발견)를 주는 것이다. A에서 이러한 관측에서 어떤 의미에서 가장 비슷하지 않은 2개의 슈퍼 분류로 C가 분할되는 것으로 간주 할 수 있다. 어떤 문제에서는, C1 이 분류의 구간이 [1, 2,..., k]으로 제약되는 것으로, 자연스럽게 정의된 순서를 가진 2개의 분류의 경우에, 응답 카테고리의 자연적인 순서가 될 것이다(e.g 교육 수준). 2개의 분류는 rpart의 부분이 아니다.
3.2 손실 통합(Incorporating losses)
위험 감소 기준을 불순도 측정에서 찾지 않는다는 것의 하나의 환영하는 측면은 손실 함수을 포함한다는 것이다. 불순도 기준에 손실율을 포함하는 확장으로 2개의 다른 방법은, 일반화된 Gini 지수와 변경된 사전(generalized Gini index and altered priors), CART에서 다루어진다.
rpart 소프트웨어는 변경된 사전(altered priors) 방법을 수행한다.
3.2.1 일반화된 지니 지수(Generalized Gini index)
Gini 지수는 다음과 같은 흥미로운 해석이 있다. 객체가 확률 (p1, p2, .... , pC)에 따라 C 분류의 하나를 무작위로 선택하고 그리고 같은 분포로 분류에 무작위로 할당하는 것을 가정하자. 오분류의 확률은 아래와 같다
Σi Σ j≠i
pipj =
Σi Σj pipj - Σi pipj2 = Σi 1 - pi2 = p에서의 지니 지수
분류 i에 실제로 속하는 객체에서 분류 j로 할당된 손실을 L(i, j)라 하자. 오분류의 기대 비용은 ΣΣL(i,j)pipj 가 된다. 이것은 아래의 식에 의해 불순도의 일반화된 Gini 지수의 정의로 추론된다.
G(p) = ΣiΣjL(i,j)pipj
해당 분할 기준은 변수의 오분류 비용을 포함하여 어플리케이션에 뚜렷하게 나타난다. 그러나 이것에는 몇가지 근거가 있다. 첫째, G(p)는 불순도 측정에 동기를 부여하는 p의 볼록한 곡선 함수에 필요하지 않다. 더 심각하게, G는 그것을 사용하기 전에 손실 메트릭과 대칭적이다. 이것을 보기 위해 아래의 수식을 유의하라.
G(p) = (1/2) Σi Σj[ L(i, j) + L(i, j) ] pi pj
특히, 2-분류 문제에서, 효과에서 G는 손실 메트릭을 무시한다.
3.2.2 변경된 사전(Altered priors)
R(A)의 정의를 기역하면
R(A) ≡ Σi = 1 C piA L(i, τ(A))
= Σi = 1 C πiL(i, τ(A))(niA / ni)(n / nA)
아래와 같이 ~π와 ~L을 가정하면
~π i~L(i, j) = πL(i, j) ∀i,j ∈ C
그러면 R(A) 는 새로운 손실과 사전(priors)에서 변경이 없다. ~L 가 0-1 메트릭이라 가정하면, priors ~ π는 분할 기준으로 사용될 것이다. 이것은 아래의 형태에서만 가능하다.
이것은 C = 2일때 항상 가능하고 그리고 이런 이유로 변경된 사전(altered priors)은 두 분류 문제(two class problem)에 정확하게 부합된다. 차원이 C > 2 인 임의의 손실 메트릭에서는, rpart는 Li = ΣL(i,j)를 가지는 위의 공식을 사용한다.
변경된 사전(altered priors)에 대한 두번째 적합성은 이것이다. 불순도 지수 I(A) = Σf(pi) 가 p1 = p2 = ... = pC = 1 / C에서 최대값을 가진다. 문제는, 예를 들어, 분류 1의 오분류 손실은 분류 2 또는 3의 관측치에서의 손실의 2배가 된다면, 그러므로 노드의 분류 결정에 가장 나쁜 확률 집합이 된다. 변경된 사전 기술(altered priors technique)은 pi 변경에 의한 이것과 정확하게 과 같다.
2개의 최종 노드는
- altered priors가 사용될 때, 그들은 분할의 선택에만 영향을 준다. 원래의 손실(losses)과 사전(priors)은 노드의 위험을 계산하기 위해 사용된다. altered priors는 불순도 규칙이 위험 조건에서 옳바르게 되도록 하는 분할을 선택하는데 단순히 도움을 준다.
- altered priors의 변수(argument )는 지니(Gini )와 정보 분활(information splitting) 규칙 모두에서 유효하다.
3.3 예제: 단계 C 전립선 암(class method, method = "class") (Example: Stage C prostate cancer (class method))
첫번째 예제는 146개의 단계 C 전립선 암 환자의 데이터를 기본으로 한다. 중요 관심은 임상적으로 마지막에서 전립선 제거 수술 후에 재발 가능성과 어떤 형태이든 진행의 발생 시간이다. 이 예제의 마지막은 질병이 진행하면 값 1이고 그리고 아니면 0인 상태값이다. 나중에 우리는 진행의 발생 시간을 가지는, exp method를 사용하여 분석할 것이다. 각 변수에 대한 짧은 설명이 아래에 있다. 이 연구에서 관심있는 주요 예측 변수는 유동 세포 계측법(flow cytometry)에 의해 결정된, DNA 배수성(ploidy)이다. 2배수와 4배수의 종양에서, 유동 세포 계측법은 그들의 세포 사이클에서 G2 (성장) 단계의 종양 세포 비율을 추정할 수 있다: G2%는 대부분 배수성 종양에서 오류는 체계적이다(G2% is systematically missing for most aneuploid tumors).
데이터 셋의 변수는 아래와 같다.
pgtime | 진행 시간, 또는 진행의 최종 시간 |
pgstat | 최종 상태(1=진행, 0=censored(무검출)) |
age | 진단시 연령 |
eet | 초기 내분비 치료(early endocrine therapy)(1=no, 0=yes) |
배수성(ploidy) | 2배수성/4배수성/이수성 DNA 패턴 (diploid/tetraploid/aneuploid DNA pattern) |
g2 | G2 단계에서의 세포 퍼센트(%) |
grade | 종양 단계(1 - 4) |
글리슨 (gleason, 현미경 육안 측정) |
Gleason 단계(3-10) |
이 모델은 rpart 함수를 사용하여 적합되었다. 이 함수의 첫번째 변수는, ~ 기호로 "is modeled as"를 나타내는 모델식이다. print 함수는, 다른 S 모델 처럼 간단하게 출력 한다. plot 과 text 명령어는 트리를 플롯하고 플롯에 표시를 한다, 이 결과는 Figure 3에 보여준다.
> progstat <- factor(stagec$pgstat, levels = 0:1, labels = c("No", "Prog")) > cfit <- rpart(progstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec, method = 'class') > print(cfit) n= 146 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 146 54 No (0.6301370 0.3698630) 2) grade< 2.5 61 9 No (0.8524590 0.1475410) * 3) grade>=2.5 85 40 Prog (0.4705882 0.5294118) 6) g2< 13.2 40 17 No (0.5750000 0.4250000) 12) ploidy=diploid,tetraploid 31 11 No (0.6451613 0.3548387) 24) g2>=11.845 7 1 No (0.8571429 0.1428571) * 25) g2< 11.845 24 10 No (0.5833333 0.4166667) 50) g2< 11.005 17 5 No (0.7058824 0.2941176) * 51) g2>=11.005 7 2 Prog (0.2857143 0.7142857) * 13) ploidy=aneuploid 9 3 Prog (0.3333333 0.6666667) * 7) g2>=13.2 45 17 Prog (0.3777778 0.6222222) 14) g2>=17.91 22 8 No (0.6363636 0.3636364) 28) age>=62.5 15 4 No (0.7333333 0.2666667) * 29) age< 62.5 7 3 Prog (0.4285714 0.5714286) * 15) g2< 17.91 23 3 Prog (0.1304348 0.8695652) * > par(mar = rep(0.1, 4)) > plot(cfit) > text(cfit)
- 응답으로 표시 인자 변수의 생성은 출력의 가시성를 향상키킨다.
- method='class'로 요청함으로서 범주형 변수(categorical variable)로 progstat 를 처리하라고 루틴에 명확하게 지시했다. (progstat는 factor 이므로 이것은 기본 선택을 가질 것이다). 그러므로 루틴에 정확하게 전달하는 분류 옵션 파라메터가 없으므로 분할을 위해 Gini 규칙과 관측된 데이터의 빈도수에 대한 확률인 사전 확률(prior probabilities), 그리고 0/1 손실을 사용할 것이다.
- 노드 x의 자식 노드는 항상 2x 와 2x+1을 갖는다(출력에서 번호), 출력의 탐색에 도움을 주기 위함이다.(Figure 3과 출력을 비교해라)
- 리스트에 있는 다른 항목들은 노드의 생성에 사용된 분할의 정의 이다. 노드에서의 문제(subjects) 수, 노드에서 손실 또는 에러(예를 들어, 사전 확률(prior probabilty)과 유닛 손실을 가지며 이것은 오분류의 숫자가 될 것이다.), 그리고 노드의 예측된 분류(yprop)가 있다
- * 은 최종 노드를 나타낸다.
- Grades 1 and 2 는 왼쪽으로 자식 노드로 가고, grades 3 and 4 는 오른쪽 자식 노드로 간다. 이 트리는 가장 큰 "평균 분류(average class)"를 갖는 가지는 오른쪽으로 가도록 정열한다.
Figure 3: 단계 C데이터의 분류 트리 |
3.4 변수의 중요성(Variable importance)
단계 C데이터의 출력에 긴 형태는, summary 함수를 가지고 만들어진, 대리 노드(surrogates, 하위 노드)에서 더 많은 정보를 가진다. summary함수에서 cp 옵션은 출력물에서 가지치를 지시한다, 그러나 트리를 가지치지는 않는다. 5개의 대리 분할(기본) 까지의 각 노드를 출력한다, 그러나 기준선 "중요한 것 까지" 대리 보다 더 많은 기능을 가진다. 첫번째 분할에서 첫번째 대리 노드는 아래 테이블이 기준이다.
> temp <- with(stagec, table(cut(grade, c(0, 2.5, 4)), cut(gleason, c(2, 5.5, 10)), exclude = NULL)) > temp (2,5.5] (5.5,10] <NA> (0,2.5] 42 16 3 (2.5,4] 1 84 0 <NA> 0 0 0
대리 노드는 126/146 관측값을 0.863과 일치하게 하기 위해 올바른 방향(오른쪽)으로 보낸다. 중요 규칙은 85개의 바른 값을 가지고, 수정된 일치값(agreement)는 (126 - 85)/ (146 - 85) 이다.
변수는, 중요하든 부수적이든 간에 트리에 자주 나타 날 것이이다. 변수 중요도 측정의 모든 것은 중요 변수의 각 분할을 위한 분할 측정도(the goodness of split measures)의 합이다, 대리용 모든 분할의 측정도(goodness)를 더한다. 출력물에서 이것은 100까지 합한 척도이고 그리고 라운드된 값을(rounded values) 보여준다, 확률이 1%보다 적은 어떤 변수들을 제외한다. 필요해서 따로 복제된 2개의 변수를 생각해 보자: 만약 우리가 대리 노드를 계산하지 않는다면 그들은 강하게 나나타지 것과 관계 없이 중요도를 가지고 분할할 것이다.
4 나무 가지치기(Pruning the tree)
4.1 정의(Definitions)
우리는 완전한 트리를 만들었다, 아마도 꽤 크거나 혹은 복잡하다, 그리고 지금은 모델은 유지하기 위하여 많은 것들을 결정해야 한다. 회귀 단계에서, 예를 들면, 이 이슈는 계속 제기될 것이고 그리고 적합은 F 검증이 어떤 수준 α에 다달았을 때 중지된다.
T1, T2,....,Tk 를 트리 T의 마지막 노드라고 놓으면, 정의
회귀와 비교에서, |T| 는 자유도(degrees of freedom)와 잔차-합-제곱(residual sum of squares) R(T)와 유사하다.
|T| = 터미널 노드의 수
T의 위험 = R(T) = Σi=1k P(Ti)R(Ti)
T의 위험 = R(T) = Σi=1k P(Ti)R(Ti)
α를 모델에 다른 변수의 추가 '비용'을 측정한는 0에서 ∞ 까지의 어떤 값이라 하자: α는 복잡도 파라메터라고 한다. R(T0) 0번 분할된 트리의 위험도라 놓자. 정의
Rα(T) = R(T) + α|T|
는 트리의 비용이 되고, Tα는 최소 비용을 가지는 전체 모델에서 하위 트리가 되도록 정의하자. 분명히 T0 = 전체 모델 이고 T∞ = 전혀 분할되지 않은 모델 이다.
아래의 결과는 [1]에서 보여준다(The following results are shown in [1].).
- 만약 T1와 T2는 Rα(T1) = Rα(T2) 기지는 T의 하위 트리이면, 그려면 T1은 T2의 하위 트리 이거나 T2가 T1의 하위 트리이다; 그러므로 T1 < T2 혹은 T2 < T1 가 된다.
- 만약 α > β 이면 Tα = Tβ 이거나 Tα 는 Tβ의 완전한(같은) 하위 트리이다(원문: Tα is a strict sub tree of Tβ ).
- α1, α2, .... , αm 까지 어떤 집합이 주어진다; Tα1, Tα2, .... , Tαm 와 R(Tα1), R(Tα2), .... , R(Tαm) 모두 효과적으로 계산 할 수 있다.
첫번째 결과를 사용하면, 우리는 Tα는 Rα(T)가 최소인 가장 작은 트리 T로 유일하게 정의할 수 있다.
T를 기반으로 하는 어떤 일련의 내부 트리는 적어도 |T| 멤버를 가지므로, 결과 2는 α의 모든 가능한 값은 m 구간으로 그룹으로 묶인다는 것을 함축한다, m ≤ |T|
I1 = (0, α1]
I2 = (α1, α2]
·
·
·
Im = (αm-1, αm]
모든 α ∈ Ii 인 경우는 같은 최소 서브 트리를 공유한다(원문: where all α ∈ Ii share the same minimizing sub tree.).
I2 = (α1, α2]
·
·
·
Im = (αm-1, αm]
4.2 교차 검증(Cross-validation)
교차-검증은 아래의 단계로 최적의 값을 선택하기 위해 사용된다.
-
데이터 셋에 전체 모델을 적합해라
I1, I2, ... , Im 을 계산각 βi는 Ii의 '전형적인 값(typical value)'이다.
β1 = 0
β2 = √(α1α2)
β3 = √(α2α3)
·
·
·
βm-1 = √(αm-2αm-1)
βm = ∞ 라 놓음 -
데이터 셋을 크기가 s/n인 s개의 그룹 G1, G2, ... , Gs로 나누어라, 그리고 각 그룹으로 분할해라:
- '모든 기대되는 Gi' 데이터 셋에 전체 모델을 적합하라 그리고 이 축소된 데이터 셋의 Tβ1, Tβ2, ... , Tβm 를 계산해라.
- G1에서 각 관측의 예측된 분류를 계산해라, 1 ≤ j ≤ m 에서 각 모델 Tβ 하에서 수행.
- 이것으로 부터 각 주제에(subject) 대한 위험을 계산한다.
- 각 βj에서 위험 추정치를 얻기 위해 Gi 전체를 합하라. 작은 위험도를 가지는 β(complexity parameter)를 위해 전체 데이터 셋에서 Tβ를 계산한다, 이것은 가장 최적으로 잘려진 트리를 선택하게 한다.
실제 연습에서는, 우리는 1-SE 룰 대신에 사용할 수 있다. β 대 위험 플롯에서는 처음는 급하게 떨어진 다음 비교적 평평한 평지 그리고 부드럽게 올라가는 곡선을 종종 보인다. 평평한 곳에서 이러한 모델을 따라 β를 선택하는 것은 본질적으로 랜덤하게 된다. 이것을 피하기 위해서, 위험 추정값과 그것의 표준 에러 둘 다 교차 검증 수행 중에 계산 된다. 최소가 된 하나의 표준 에러에서 어떤 위험은 최소와 동등한 것으로 표시된다(i.e. 평평한 곡선이 부부이 되었을 경우를 고려). 그러면 단순 모델이, 평평한 곳에서 "묶어진(tied)" 모든 것들을 따라서, 선택 된다.
교차-검증의 일반적인 정의에서 우리는 위에서 s = n을 가질 것이다, 예, Gi 각각은 정확하게 하나의 관측을 가질 것이다, 그러나 적절한 n값을 위해서 이것은 계산적으로 금지한다. s = 10의 값은 충분하다는 것을 알게 되고, 그러나 사용자는 그들이 원한다면 이것을 다양하게 할 수 있다.
몬테-카를로 시행에서, 가지치지의 이런 방법은 테이터 셋에서 '순수한 잡음(pure noise)' 변수를 걸러내는 데 매우 신뢰할 수 있다고 입증 되었다.
4.3 예: 확률론적인 숫자 인식 문제(Example: The Stochastic Digit Recognition Problem)
이 예제는 [1]의 2.6 단원에서 찾을 수 있다, 그리고 그들의 책의 많은 부분에서 예제를 실행하도록 사용할 수 있다. 신뢰할 수 없는 디지털 판독의 세그먼트를 고려해라, 각각의 빛이 확률 0.9로 올 경우. 예, 참인 숫자가 2이면, 빛은 1,3, 4, 5 그리고 7이 확률 0.9를 가지고 그리고 빛 2와 6은 확률 0.1을 가진다. Y ∈ {0, 1, ... , 9}인 경우, 각 확률은 1/10이고 Xi, i = 1, ...., 7, 테스트 데이터 구성은 Y에 대한 파라메터를 가지는 베르누이 변수 i.i.d. 이다. X8 - X24는 i.i.d. 베르누이 확률 P{Xi = 1} = .5 로 생성되고, 그리고 Y의 독립 변수이다. 그들은 무작위 빛의 큰 사각형에서 판독을 포함하는 것과 상응한다.
크기 200개의 표본이 적당하게 만들어 지고 그리고 프로시저는 트리를 구축하기 위해 Gini 지수(see 3.2.1)를 사용하여 적용하였다. 시뮬레이트 된 데이터를 계산하기 위한 S 코드 그리고 적합은 아래에서 보여준다.
> set.seed(1953) # An auspicious year > n <- 200 > y <- rep(0:9, length = 200) > temp <- c(1,1,1,0,1,1,1, 0,0,1,0,0,1,0, 1,0,1,1,1,0,1, 1,0,1,1,0,1,1, 0,1,1,1,0,1,0, 1,1,0,1,0,1,1, 0,1,0,1,1,1,1, 1,0,1,0,0,1,0, 1,1,1,1,1,1,1, 1,1,1,1,0,1,0) > lights <- matrix(temp, 10, 7, byrow = TRUE) # The true light pattern 0-9 > temp1 <- matrix(rbinom(n*7, 1, 0.9), n, 7) # Noisy lights > temp1 <- ifelse(lights[y+1, ] == 1, temp1, 1-temp1) > temp2 <- matrix(rbinom(n*17, 1, 0.5), n, 17) # Random lights > x <- cbind(temp1, temp2) > dfit <- rpart(y ~ x, method='class', control = rpart.control(xval = 10, minbucket = 2, cp = 0)) > printcp(dfit) Classification tree: rpart(formula = y ~ x, method = "class", control = rpart.control(xval = 10, minbucket = 2, cp = 0)) Variables actually used in tree construction: [1] x1 x10 x13 x14 x17 x19 x2 x21 x3 x4 x5 x6 x7 x8 [15] x9 Root node error: 180/200 = 0.9 n= 200 CP nsplit rel error xerror xstd 1 0.1111111 0 1.00000 1.10556 0.0055416 2 0.1000000 1 0.88889 0.98333 0.0250647 3 0.0888889 2 0.78889 0.88333 0.0317178 4 0.0777778 4 0.61111 0.81667 0.0346744 5 0.0666667 5 0.53333 0.69444 0.0380363 6 0.0611111 6 0.46667 0.66667 0.0384900 7 0.0555556 7 0.40556 0.63889 0.0388393 8 0.0388889 8 0.35000 0.46667 0.0387776 9 0.0222222 9 0.31111 0.39444 0.0375956 10 0.0166667 10 0.28889 0.37222 0.0370831 11 0.0083333 11 0.27222 0.36667 0.0369434 12 0.0055556 17 0.22222 0.37222 0.0370831 13 0.0027778 25 0.17778 0.36111 0.0367990 14 0.0000000 27 0.17222 0.35000 0.0364958 > fit9 <- prune(dfit, cp = 0.02) > par(mar = rep(0.1, 4)) > plot(fit9, branch = 0.3, compress = TRUE) > text(fit9)
이것은 몇가지 방법에서 [1]의 섹션 3.5와 다르다, 실질적으로 마지막 2개.
- 실제 값은 다르다, 물론, 2개의 실행에서 다른 랜덤 넘버 생성기 때문.
- 복잡도 테이블(The complexity table)은 가장 큰 하나(28 분할)에서 가장 단순한 트리(0개 분할)로 출력 되었다. 우리는 그들이 단순한 장소에서 출발하여 하나의 트리와 다른 것을 비교하는 것이 쉽다는 것을 알 수 있다.
- 노드의 수 보다는, 분할 수가 리스트 된다. 노드의 수는 항상 분할의 수 + 1 이다.
- 읽기 쉽게 하기 위해, 에러 컬럼들은 척도화 되었고 그 결과 첫번째 노드는 1의 에러 값을 가진다. 그러므로 이 예예서 분할이 없는 모델은 180/200의 오분류를 만들고, 절대 에러의 조건에서의 결과를 얻기 위해 180을 컬럼 3-5에 곱한다.(계산(Computations)은 절대 에러 척도(the absolute error scale)에서 수행된고, 그리고 상대 척도가 출력된다.)
- 복잡도 파라메터 컬럼(complexity parameter column)은 비슷하게 척도화된다.
Figure 4: 확률론적 숫자 인식 데이터에서 최적으로 가지져진 트리 |
테이블을 보라, 우리는 최적의 트리는 10개의 종료 노드를(9개의 분할) 가진는 것을 볼 수 있다, 교차 검증에 근거함. 이 하위 트리는 prune를 호출하여 추출되고 그리고 fit9에 저장된다. 가지친 트리는 Figure 4에 보여준다. 2개의 옵션이 플롯에 사용되었다. compress 옵션은 플롯에서 수직으로 오버래핑 되는 부분에서 출력을 좁게한다. branch 옵션은 노드에서 그 자식들의 연결 가지의 모양를 제어한다.
가장 큰 트리는, 35개의 종료 노드를 가짐, 관측치의 170/200 = 85%로 올바르게 분류된다, 그러나 그렇게 랜덤 예측 변수 몇몇 개를 사용하면 데이터가 심각하게 오버-피트(over fits) 된다. 종료 노드 당 관측의 수가 2대신에 1로 놓으면, 그러면 모든 관측은 최종 모델에서 올바르레 분류 될 것이다, 많은 노드를이 크기 1을 가짐.
5 결측 데이터(Missing data)
5.1 분할 선택(Choosing the split)
결측 값은 통계적 모델과 분석의 코드 중의 하나이다. 대부분의 프로시저는 결측값 처리를 거부하는 것으로 결측값을 처리한다-불완전한 관측치들은 던저 버린다. Rpart는 좀 더 야심적이다. 어떤 종속변수와 적어도 하나의 독립 변수의 값의 어떤 관측치는 모델링에 참여할 것이다.
최대화 되기 위한 정량은 여전히
최대화 되기 위한 정량은 여전히
ΔI = p(A)I(A) - p(AL)I(AL) - p(AR)I(AR)
이다.
사전(prior) 조건은 모든 변수와 결측치와 관계 없는 분할에서와 같다, 그러나 오른쪽 두 개의 조건은 약간 수정 되었다. 첫째로, 불순도 지수 I(AR)과 I(AL)은 특별한 예측 변수의 결측이 아닌 관측지 전체에서만 계산된다. 두번째로, 두개의 확률 p(AL)과 p(AR)은 관련 관측값 전체에서 또한 계산된다, 그러나 그들은 수정 되고 그 결과 그들의 p(A)에 더해 진다. 이것은 트리를 만드는 것처럼 어떤 여분의 예약이 수반된다, 그러나 종료 노드 확률의 합은 1이 확실하다.
단지 2개의 관측이 결측치가 아닌 극단적인 경우에, 두개의 자식들의 불순도는 그 변수에서 분할할 때 둘 다 0이 될 것이다. 그러므로 ΔI는 최대화 되고, 그리고 이것은 최적으로 선택되기 위해서 '거의 대부분 결측(almost all missing)' 좌표로 생성된다; 이 방법은 극단적인 경우에 확실히 결함이다. 이것은 누락된 좌표의 방향의 편향이 비-극단적인 경우 까지 수행되는지 말하기는 어렵다, 어쨌든, 보다 완벽한 변수는 분할에서 그 자신의 더 가능한 값이 될 여지가 있다.
5.2 대체 변수(Surrogate variables)
일단 그것에서 변수 분할과 분할 포인트가 결정되면, 그 값이 누락된 값을 가지는 관측치를 가지고 무엇을 할 것인가? 하나의 접근은 다른 독립 변수를 사용하여 결측된 데이터를 추정하는 것이다; rpart는 대체 변수를 정의하기 위하여 이것의 편차(variation)를 이용한다.
예와 같이, 분할이(age < 40, age ≥ 40)이 선택되었다고 가정해 보자. 대체 변수는 다른 독립 변수를 이용하여 두 개의 카테고리 'age < 40' 과 'age ≥ 40'을 예측하기 위해 (재귀 없이) 분할 알고리즘을 다시 적용시킴으로써 찾아 진다.
각각의 예측변수를 위한 최적의 분할 포인트와 오분류 에러가 계산된다. (손실과 사전(losses and priors)은 입력되지 않는다 - age 그룹을 위해 정의된 것이 없음 - 그래서 위험은 단순히 오분류된 # / n.) 또한 평가는 아래의 수식인 경우, 오분류 에러 min(p, 1-p)의 '많이 가지고 가라(go with the majority)'라는 묵시적인 규칙이 있다.
p = (# in A with age < 40) / nA
대체 변수는 순위가 매겨지고, 그리고 묵시적인 규칙보다 더 좋지 않는 어떤 변수들은 리스트에서 버려진다.
문제(subjects)의 중요도가 age ≤ 40이고 그리고 age에 상관없는 또다른 변수 x가 있다고 가정하자; 어쨌든, x가 가장 큰 값을 가지는 문제가 age 40 에 있다. 그러면 대체 변수 x < max 대 x ≥ max는, 1 문제(subject)를 오른쪽으로 보내면 외쪽이 n - 1 이 됨, 그 묵시적인 규칙은 하나가 적은 변수를 가지게 된다. age와 전혀 관계 없는 연속적인 변수는 단독으로 우연히 trim-one-end surrogate (대체 변수)와 같은 생성된 확률 1 - p2를 가진다. 이러한 이유로 rpart 루틴은 대체 변수를 구축하는 동안 하나가 더 많은 제약을 강요한다: 후보 분할은 적어도 2개의 관측값을 왼쪽으로 보내야 하고 그리고 적어도 2개를 오른쪽으로 보내야 한다.
분할 변수가 누락된 어떤 관측값은 그러면 첫번째 대체 변수을 이용하여 분류되거나, 혹은 그것이 누락되면, 두번째 대체 변수가 사용되고, 그리고 등등. 만약 관측값이 대체 변수 모두 누락되었다면 묵시적인 규칙이 사용된다. 이러한 '모든 결측(missing everything)' 관측값의 다른 전략을 설득력 있게 주장 할 수 있다, 그러나 이런 타입이 관측이 아예 없거나 조금 있을 것이다(희망함).
5.3 예제: 단계 C 전립선 암(Example: Stage C prostate cancer (cont.))
우리는 앞의 예의 단계 C의 전립선 앞으로 되돌아 가자. rpart 객체의 상세화된 리스트를 위해, 우리는 summary 함수를 사용한다. 그것은 CP 테이블(아래의 반복이 아님)에서 정보가 포함되고, 각각의 노드에 대한 정보가 추가된다. cp 옵션을 이용하여 다른 cp 값에서 하위 트리의 출력을 쉽게 한다. 0.0555에서 0.1049 사이의 어떤 값은 아래에 리스트와 같은 결과를 만들어 낼 것이다, 이것은, 3개의 분할을 가진다. 왜냐하면 출력이 길기 때문이다, summary.rpart의 file 옵션은 종종 유용하다.
> printcp(cfit) Classification tree: rpart(formula = progstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec, method = "class") Variables actually used in tree construction: [1] age g2 grade ploidy Root node error: 54/146 = 0.36986 n= 146 CP nsplit rel error xerror xstd 1 0.104938 0 1.00000 1.00000 0.10802 2 0.055556 3 0.68519 0.88889 0.10511 3 0.027778 4 0.62963 0.83333 0.10332 4 0.018519 6 0.57407 0.85185 0.10395 5 0.010000 7 0.55556 0.79630 0.10200 > summary(cfit, cp = 0.06) Call: rpart(formula = progstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec, method = "class") n= 146 CP nsplit rel error xerror xstd 1 0.10493827 0 1.0000000 1.0000000 0.1080241 2 0.05555556 3 0.6851852 0.8888889 0.1051147 3 0.02777778 4 0.6296296 0.8333333 0.1033229 4 0.01851852 6 0.5740741 0.8518519 0.1039462 5 0.01000000 7 0.5555556 0.7962963 0.1019959 Variable importance g2 grade gleason ploidy age eet 30 28 20 13 7 2 Node number 1: 146 observations, complexity param=0.1049383 predicted class=No expected loss=0.369863 P(node) =1 class counts: 92 54 probabilities: 0.630 0.370 left son=2 (61 obs) right son=3 (85 obs) Primary splits: grade < 2.5 to the left, improve=10.357590, (0 missing) gleason < 5.5 to the left, improve= 8.399574, (3 missing) ploidy splits as LRR, improve= 7.656533, (0 missing) g2 < 13.2 to the left, improve= 7.186766, (7 missing) age < 58.5 to the right, improve= 1.388128, (0 missing) Surrogate splits: gleason < 5.5 to the left, agree=0.863, adj=0.672, (0 split) ploidy splits as LRR, agree=0.644, adj=0.148, (0 split) g2 < 9.945 to the left, agree=0.630, adj=0.115, (0 split) age < 66.5 to the right, agree=0.589, adj=0.016, (0 split) Node number 2: 61 observations predicted class=No expected loss=0.147541 P(node) =0.4178082 class counts: 52 9 probabilities: 0.852 0.148 Node number 3: 85 observations, complexity param=0.1049383 predicted class=Prog expected loss=0.4705882 P(node) =0.5821918 class counts: 40 45 probabilities: 0.471 0.529 left son=6 (40 obs) right son=7 (45 obs) Primary splits: g2 < 13.2 to the left, improve=2.1781360, (6 missing) ploidy splits as LRR, improve=1.9834830, (0 missing) age < 56.5 to the right, improve=1.6596080, (0 missing) gleason < 8.5 to the left, improve=1.6386550, (0 missing) eet < 1.5 to the right, improve=0.1086108, (1 missing) Surrogate splits: ploidy splits as LRL, agree=0.962, adj=0.914, (6 split) age < 68.5 to the right, agree=0.608, adj=0.114, (0 split) gleason < 6.5 to the left, agree=0.582, adj=0.057, (0 split) Node number 6: 40 observations predicted class=No expected loss=0.425 P(node) =0.2739726 class counts: 23 17 probabilities: 0.575 0.425 Node number 7: 45 observations, complexity param=0.1049383 predicted class=Prog expected loss=0.3777778 P(node) =0.3082192 class counts: 17 28 probabilities: 0.378 0.622 left son=14 (22 obs) right son=15 (23 obs) Primary splits: g2 < 17.91 to the right, improve=5.2414830, (1 missing) age < 62.5 to the right, improve=0.8640576, (0 missing) gleason < 7.5 to the left, improve=0.2115900, (0 missing) eet < 1.5 to the right, improve=0.1280042, (1 missing) Surrogate splits: age < 61.5 to the right, agree=0.614, adj=0.190, (1 split) eet < 1.5 to the right, agree=0.591, adj=0.143, (0 split) grade < 3.5 to the right, agree=0.545, adj=0.048, (0 split) gleason < 6.5 to the right, agree=0.545, adj=0.048, (0 split) Node number 14: 22 observations predicted class=No expected loss=0.3636364 P(node) =0.1506849 class counts: 14 8 probabilities: 0.636 0.364 Node number 15: 23 observations predicted class=Prog expected loss=0.1304348 P(node) =0.1575342 class counts: 3 20 probabilities: 0.130 0.870
- 여기에는 54개의 진행(class 1)이 있고 그리고 94개의 비-진행이 있다, 그래서 첫번째 노드는 기대 손실이 54/146 ≈ 0.37을 가진다.(계산은 기본 사전 및 손실(priors and losses)을 위해 단순하다.)
- 단계 1과 2는 왼쪽으로 가고, 단계 3과 4는 오른쪽으로 간다. 트리는 정열되고 그래서 "더 많이 제공(more severe)"하는 노드는 오른쪽으로 간다.
- 향상도는 불순도 지수에서 변화에 n이 곱해진다. 이 인스턴스에서, 가장 큰 향상도는 변수 grade에 있다, 향상도 10.36을 가짐. 다음으로 최적의 선택은 Gleason 스코어 이다, 향상도 8.4를 가짐. 향상도의 실제 값은 그렇게 중요하지 않다, 그러나 그들의 연관 크기는 변수의 비교 도구로써 지표이다.
- 배수성(Ploidy)은 범주형 변화이다, 그 순서에서 배수성(diploid), 이배수성(tetraploid), 배수성(aneuploid)을 가짐. (순서 확인을 위해, table(stagec$ploidy)을 타이핑해라). 이런 모든 가능한 분할이 시도된다: aneuploid+diploid 대 tetraploid, aneuploid+tetraploid 대 diploid, 그리고 aneuploid 대. diploid + tetraploid. 최적의 분할은 이배수성(diploid)를 오른쪽으로 그리고 나머지를 왼쪽으로 보낸다.
- diploid/non-diploid 대 grade= 1-2/3-4의 2 X 2 테이블은 대각선에서 관측치의 64%를 가진다.
1-2 3-4 diploid 38 29 tetraploid 22 46 aneuploid 1 10 -
노든 3에서, 중요 분할은 6개의 문제(subject)에서 누락된 값이다. 6 모두는 첫번째 대체 변수를 기반으로 분할된다. 이배수성 그리고 배수성(diploid and aneuploid) 종양은 왼쪽으로 보내지고 4배수(tetraploid)는 오른쪽으로 보낸다. 대체 변수에서 eet는 45/48보다 좋지 않다(중요한 것을 가지고 감), 그리고 값을 가지고 있지 않는다.
g2 < 13.2 g2 > 13.2 Diploid/aneuploid 71 1 Tetraploid 3 64
6 더 많은 옵션(Further options)
6.1 프로그램 옵션(Program options)
중심 적합 함수는 rpart 이다, 아래와 같은 주요 아규먼트를 갖는다:
- formula: lm이나 다른 S 모델 적합 함수와 같은 모델 공식. 오른쪽 부분은 연속적인 조건이나 범주형(factor) 조건 둘 다 가질 수 있다. 만약 출력 y가 2개의 수준(two levels) 보다 더 가진다면, 그러면 범주형 예측변수들은 매우 긴 시간을 가지는 철저한 열거(exhaustive enumeration)로 적합된다.
- data, weights, subset: S 모델과 같음. 가중치(weights)는 아직 지원되지 않는다, 그리고 만약 표현된다면 무시될 것이다.
- method: 분할 규칙을 사용하기 위한 타입. 이것의 옵션은 are classfi cation, anova, Poisson, and exponential 이다.
- parms: method 특징 옵션 파라메터의 목록. 분류를 위해, 이 리스트는 다음의 어떤 것을 포함할 수 있다: 사전 확률(prior probabilities) 벡터(component prior), 손실 메트릭(component loss) 또는 분할 지수(splitting index)(component split). 사전은 양수이고 합이 1이 되어야만 한다. 손실 메트릭은 대각선은 0 이고 대각선이 아닌 요소는 양수 이어야만 한다. 분할 지수는 "지니(gini)" 또는 "정보(information)"가 될 수 있다.
- na.action: 누락된 값을 위한 작동(action). rpart에서 기본 작동은 na.rpart 이다, 기본값은 options(na.action) 전역 옵션에 의해 덮어 쓰여지지 않는다. 기본 작동은 응답 y 혹은 모든 예측 변수가 결측값인 경우 이런 열들은 제거된다. 부분적으로 결측 관측값을 유지하는 이런 능력은 rpart 모델의 유일하고 가장 유용한 특징이다.
- control: 컨트롤 파라메터의 리스트, 일반적으로 rpart.control 함수의 결과. 리스트는 아래의 변수를 가져야 한다:
- minsplit: 루틴이 분할 계산을 시도하기 위하여 노드에서 관측의 최소 수. 기본값은 20 이다. 이 파라메터는 계산 시간을 절약할 수 있고, 그래서 작은 노드들은 교차-검증에 의해 거의 대부분 항상 잘려 나간다.
- minbucket: 종료 노드에서 관측의 최소 수. 기본값은 minsplit/3 이다.
- maxcompete: 이것은 노드에서 최적 분할을 하는 변수를 보지 않기 위하여 출력에서 종종 유용하게 이용한다, 그러나 또한 둘째 노드, 세번째 노드, 등등. 이 파라메터는 프린트 되는 수를 제어한다. 이것은 계산 시간에 영향이 없고 그리고 사용되는 메모리에 작은 영향을 가진다. 기본값은 4 이다.
- xval: 교차검증이 행해지는 수. 일반적으로 분석의 조사 단계 동안 0 으로 셋팅하라. 값 10은, 예를 들어, 0의 값에 비해 11-배 계산 시간이 증가한다.
- maxsurrogate: 각 노드에서 유지하는 대리 변수(surrogate variables)의 최대 수. ("많은 것을 가지고 가라(go with the majority)" 보다 더 나빠지는 대리(surrogate)는 없으면 출력되거나 사용되어 진다). 이 값을 0 으로 놓으면 반으로 계산 시간이 줄어들 것이며, 그리고 usesurrogate를 0 으로 설정한다. 기본 값은 5 이다. 대리는 경쟁자 분할과는 다른 정보를 제공한다. 경쟁자 리스트는 "다른 분할이 더 많이 올바르게 분류를 가지는가" 묻고, 대리(surrogates)는 "다른 분할이 같은 방법에서 같은 문제(subjects)를 분류 가능한가" 묻는다, 엄한 기준을 가지는.
- usesurrogate: usesurrogate=2 의 값, 기본값, 앞에서 설명된 방법으로 문제를 분할한다. 이것은 CART와 비슷하다. 만약 값이 0 이면, 그러면 주요 분할 변수에서 누락된 값을 가지는 문제(subject)는 트리에서 더 아래로 진행하지 않는다. 1 값은 중간값이다: 모든 대리 변수가 "더 많은 것을 가지고 가라(go with the majority)" 에서 제외 되는 것은 트리에서 더 아래로 사건(case)를 보낸다.
- cp: 복잡도 파라메터의 임계치(The threshold complexity parameter).
복잡도 파라메터(complexity parameter) cp는, 최소 분할과 같은, 조언하는 파라메터 이다, 그러나 더 많은 유용성이 상당하다. 이것은 아래의 식에 따라서 구별되어 진다
Rcp(T) ≡ R(T) + cp * |T| * R(T1)
T1는 분할이 없는 트리 이고, |T|는 트리에서 분할의 수 이다, 그리고 R은 위험(risk)이다. 이 척도화된 버전은 원본 CART 식 보다 아주 더 많이 사용자에게 친숙하다(4.1) 그래서 그것은 단위가 적다(it is unit less). cp = 1 의 값은 분할이 없는 트리에서 항상 같은 결과일 것이다. 회귀 모델에서(다음 섹션을 보라) 척도화된 cp는 매우 직관적인 해석을 가진다: 최소 cp에서 모델의 모든 R2가 증가하지 않으면(R2가 일반적인 선형 모델(linear-models)인 경우에) 그러면 그 분할은, 연역적인, 나쁘게 추구되지 않게 감소되어 진다. 프로그램이 분할하지 않는 것은 더 이상 가지가 없음을 말한다, 그리고 많은 계산적인 노력을 저장한다. 기본값 .01 은 "예비-가지치기(pre-pruning)"트리에서 근거있게 성공적으로 이루어 지고 그래서 교차 검증(cross-validation) 단계는 1 또는 2 레이어 하나를 제거한다, 그러나 그것은 큰 데터터 셋에서 특별하게, 가끔은 전체를 가지친다.
6.2 예: 자동차 데이터의 소비자 보고서(Example: Consumer Report Auto Data)
method="class"를 사용하는 두번재 예는 다중(> 2) 분류의 응답의 출력을 설명했다. 우리는 지니(Gini)와 정보 분할 규칙과의 다름을 탐사했다. 데이터 셋 cu.summary는 117개 자동차의 1990년 4월 소비자 보고서의 요약된 변수들을 가진다. 우리의 목적은, 자동차의 신뢰성(Reliability) 응답으로 처리될 예정이다. 변수들은 아래와 같다:
Reliability | an ordered factor (contains NAs):
Much worse < worse < average < better < Much Better |
Price | numeric: list price in dollars, with standard equipment |
Country | factor: country where car manufactured |
Mileage | numeric: gas mileage in miles/gallon, contains NAs |
Type | factor: Small, Sporty, Compact, Medium, Large, Van |
분석에서 우리는 순서가 없는 출력으로 신뢰성을 처리할 것이다. 노드는 아주 나쁨(Much worse), 나쁨(worse), 보통(average), 좋음(better), 아주 좋음(Much better)으로 잠재적으로 분류할 수 있다, 그렇지만 여기에는 단지 "좋음(better)"이란 라벨이 없다. 누락된 응답(NA로 리스트됨)이 있는 32개의 자동차는 분석에서 사용되지 않는다. 2개의 적합이 만들어 진다, 하나는 Gini 지수를 사용하고 다른 하나는 정보 지수를 사용.
> fit1 <- rpart(Reliability ~ Price + Country + Mileage + Type, data = cu.summary, parms = list(split = 'gini')) > fit2 <- rpart(Reliability ~ Price + Country + Mileage + Type, data = cu.summary, parms = list(split = 'information')) > par(mfrow = c(1,2), mar = rep(0.1, 4)) > plot(fit1, margin = 0.05); text(fit1, use.n = TRUE, cex = 0.8) > plot(fit2, margin = 0.05); text(fit2, use.n = TRUE, cex = 0.8)
Figure 5: 자동차 타입, 가격, 그리고 생산 국가에 따른 자동차의 신뢰와 관계된 rpart 기반 모델을 보여 줌. 왼쪽의 그림은 gini 분할 지수 그리고 오른쪽 그림은 정보 분할 지수를 사용했다. |
아래에서 넓은 라벨 때문에, 우리는 그림 공간을 약간 증가하고 그리고 왼쪽과 오른쪽 모서리에 잘리는 것을 피하기 위해서 글자 크기를 줄여야 한다. Gini 트리에 처음 2개의 분할에서 상세한 기술은:
> summary(fit1, cp = 0.06) Call: rpart(formula = Reliability ~ Price + Country + Mileage + Type, data = cu.summary, parms = list(split = "gini")) n=85 (32 observations deleted due to missingness) CP nsplit rel error xerror xstd 1 0.30508475 0 1.0000000 1.0000000 0.07200310 2 0.08474576 1 0.6949153 0.6949153 0.07808305 3 0.05084746 2 0.6101695 0.8135593 0.07747472 4 0.03389831 3 0.5593220 0.7796610 0.07786634 5 0.01000000 4 0.5254237 0.7457627 0.07808305 Variable importance Country Type Price 66 22 12 Node number 1: 85 observations, complexity param=0.3050847 predicted class=average expected loss=0.6941176 P(node) =1 class counts: 18 12 26 8 21 probabilities: 0.212 0.141 0.306 0.094 0.247 left son=2 (58 obs) right son=3 (27 obs) Primary splits: Country splits as ---LRRLLLL, improve=15.220690, (0 missing) Type splits as RLLRLL, improve= 4.288063, (0 missing) Price < 11972.5 to the right, improve= 3.200000, (0 missing) Mileage < 24.5 to the left, improve= 2.476190, (36 missing) Node number 2: 58 observations, complexity param=0.08474576 predicted class=average expected loss=0.6034483 P(node) =0.6823529 class counts: 18 12 23 5 0 probabilities: 0.310 0.207 0.397 0.086 0.000 left son=4 (9 obs) right son=5 (49 obs) Primary splits: Type splits as RRRRLR, improve=3.186567, (0 missing) Price < 11232.5 to the left, improve=2.563521, (0 missing) Mileage < 24.5 to the left, improve=1.801587, (30 missing) Country splits as ---L--RLRL, improve=1.329310, (0 missing) Node number 3: 27 observations predicted class=Much better expected loss=0.2222222 P(node) =0.3176471 class counts: 0 0 3 3 21 probabilities: 0.000 0.000 0.111 0.111 0.778 Node number 4: 9 observations predicted class=Much worse expected loss=0.2222222 P(node) =0.1058824 class counts: 7 0 2 0 0 probabilities: 0.778 0.000 0.222 0.000 0.000 Node number 5: 49 observations predicted class=average expected loss=0.5714286 P(node) =0.5764706 class counts: 11 12 21 5 0 probabilities: 0.224 0.245 0.429 0.102 0.000
그리고 정보 분할에서 첫번째 분할은
> fit3 <- rpart(Reliability ~ Price + Country + Mileage + Type, data=cu.summary, parms=list(split='information'), maxdepth=2) > summary(fit3) Call: rpart(formula = Reliability ~ Price + Country + Mileage + Type, data = cu.summary, parms = list(split = "information"), maxdepth = 2) n=85 (32 observations deleted due to missingness) CP nsplit rel error xerror xstd 1 0.30508475 0 1.0000000 1.0000000 0.07200310 2 0.05084746 1 0.6949153 0.7118644 0.07812633 3 0.01000000 2 0.6440678 0.7457627 0.07808305 Variable importance Country Type Price 73 16 11 Node number 1: 85 observations, complexity param=0.3050847 predicted class=average expected loss=0.6941176 P(node) =1 class counts: 18 12 26 8 21 probabilities: 0.212 0.141 0.306 0.094 0.247 left son=2 (58 obs) right son=3 (27 obs) Primary splits: Country splits as ---LRRLLLL, improve=38.541250, (0 missing) Type splits as RLLRLL, improve=11.333260, (0 missing) Price < 11972.5 to the right, improve= 6.241277, (0 missing) Mileage < 24.5 to the left, improve= 5.548285, (36 missing) Node number 2: 58 observations, complexity param=0.05084746 predicted class=average expected loss=0.6034483 P(node) =0.6823529 class counts: 18 12 23 5 0 probabilities: 0.310 0.207 0.397 0.086 0.000 left son=4 (36 obs) right son=5 (22 obs) Primary splits: Type splits as RLLRLL, improve=9.280711, (0 missing) Price < 11232.5 to the left, improve=5.608640, (0 missing) Mileage < 24.5 to the left, improve=5.593989, (30 missing) Country splits as ---L--RRRL, improve=2.891017, (0 missing) Surrogate splits: Price < 10970 to the right, agree=0.879, adj=0.682, (0 split) Country splits as ---R--RRRL, agree=0.793, adj=0.455, (0 split) Node number 3: 27 observations predicted class=Much better expected loss=0.2222222 P(node) =0.3176471 class counts: 0 0 3 3 21 probabilities: 0.000 0.000 0.111 0.111 0.778 Node number 4: 36 observations predicted class=average expected loss=0.5 P(node) =0.4235294 class counts: 14 4 18 0 0 probabilities: 0.389 0.111 0.500 0.000 0.000 Node number 5: 22 observations predicted class=worse expected loss=0.6363636 P(node) =0.2588235 class counts: 4 8 5 5 0 probabilities: 0.182 0.364 0.227 0.227 0.000
처음 3개의 국가(Brazil, England, France)는 리스트에서 하나 또는 두개의 자동차만 가진다, 이는 모두 신뢰 변수에 누락된 값이다. 첫번째 노드에서 이러한 나라의 요소는 없다, 규칙에서 - 심벌로 나타남. 정보 측정은 큰 "향상도(improvements)"를 가진다, figure 2에서 보여주는 정보와 Gini 기준과 척도에서 차이를 가지는 일치, 그러나 다른 분할의 연관된 이점은 상당히 안정적이다.
2개의 규칙은 노드 2에서 같은 주요 분할에 선택되지 않았다. 이 포인트에서 데이터는 :
Compact | Large | Medium | Small | Sporty | Van | |
Much worse | 2 | 2 | 4 | 2 | 7 | 1 |
worse | 5 | 0 | 4 | 3 | 0 | 0 |
average | 3 | 5 | 8 | 2 | 2 | 3 |
better | 2 | 0 | 0 | 3 | 0 | 0 |
Much better | 0 | 0 | 0 | 0 | 0 | 0 |
여기에는 6개의 다른 범주가 있기 때문에, 모두 25 = 32 개의 조합이 탐색되고, 그리고 거의 동일한 향상을 가지는 몇 개가 나온다. Gini와 정보 기준은 거의 동등한 이런 집합에서 "랜덤" 선택은 다르게 만든다. Gini 지수에서는, Sporty 대 others 그리고 Compact/Small 대 others는 각각 3.19 와 3.12 의 향상도를 가진다. 정보 지수에서는, 향상은 6.21 과 9.28 이다. 그러므로 Gini지수른 첫번째 규칙을 선택하고 그리고 정보는 두번째를 선택한다. 흥미롭게, 두 분할 기준은 똑같은 같은 최종 모델에 다달은다, 전체 트리에서, 비록 다른 경로 이지만.
우리는 m 수준을 가지는 범주형 예측자에서 다음과 같이 말할 수 있다, 모드 2m-1 다른 가능한 분할이 테스트 된다. 예측자에서 많은 범주가 있을 때, 이럼 문제 모두를 평가하는 계산 부하는 크게 될 수 있다. 예를 들면, rpart(Reliability ., data=car90) 호출은 아주 오랜 시간 응답하지 않는다: 데이터 셋에서 예측자 하나는 30개 수준을 가지는 순서가 없는 펙터이다. 운좋게, 어떤 순서가 있는 출력에서 프로그램이 단지 m - 1 비교를 이용하는 최적의 분할을 찾는 것을 허락하는 계산 단축이 있다. 이것은 2 범주만 있을 때 classification method를 포함한다, 나중에 설명하는 anova 그리고 포아송(Poisson) method를 가지고 수행 함.
6.3 예 척추후만증 데이터(Example: Kyphosis data)
3개의 분류 방식 예는 파라메터 사전(prior) 과 손신(loss)을 탐색한다. 데이터셋 척추후만증은 교정 척추 수술(corrective spinal surgery)을 가진 81명의 어린이에 81개의 열로 표현한 데이터를 가진다. 변수들은:
Kyphosis | factor: 수술 후 변형이 존재 / 없음(present/absent) |
Age | numeric: 어린이 나이(월) |
Number | numeric: 수술에 연관된 척수의 수 |
Start | numeric: 연관된 척수의 범위의 시작 |
> lmat <- matrix(c(0,3, 4,0), nrow = 2, ncol = 2, byrow = FALSE) > fit1 <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis) > fit2 <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis, parms = list(prior = c(0.65, 0.35))) > fit3 <- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis, parms = list(loss = lmat)) > par(mfrow = c(1, 3), mar = rep(0.1, 4)) > plot(fit1); text(fit1, use.n = TRUE, all = TRUE, cex = 0.8) > plot(fit2); text(fit2, use.n = TRUE, all = TRUE, cex = 0.8) > plot(fit3); text(fit3, use.n = TRUE, all = TRUE, cex = 0.8)
이 예는 열거된 사전과 손실을 기반으로 초기 분할 변경이 어떻게 이루어지는지 보여준다. 첫번째와 세번째 적합은 같은 초기 분할(Start < 8:5)을 가진다, 그러나 향상도는 다른다. 두번째는 62명 대신에 46명의 사람을 왼쪽을 이동시킨 12.5명에서 분할 시작(Start)으로 적합한다.
왼쪽 모서리 트리를 보자, 우리는 외쪽 가지에 분할의 연속은 지금 처럼 분류된 하나의 노드만 있을 볼 수 있다. 3에서 4 보다 큰 손실 어떤 것에서, 루틴은 없음(absent)과 같이 이 노드의 대리로 분류할 것이다, 그리고 트리의 왼쪽 전체에서 붕괴한다, 오른쪽에 모여주는 것처럼. 이것은 일반적이지 않다 - 대리 손실 메트릭스의 가장 일반적인 효과는 트리에서 가지치는 총량의 변경에 있다, 어떤 가지에서 더 많이 가지치고, 다른 것에서는 덜 가지친다, 분할의 선택을 변경하기 보다는.
기존 트리에서 첫번째 노드는:
Node number 1: 81 observations, complexity param=0.1765 predicted class= absent expected loss= 0.2099 class counts: 64 17 probabilities: 0.7901 0.2099 left son=2 (62 obs) right son=3 (19 obs) Primary splits: Start < 8.5 to the right, improve=6.762, (0 missing) Number < 5.5 to the left, improve=2.867, (0 missing) Age < 39.5 to the left, improve=2.250, (0 missing) Surrogate splits: Number < 6.5 to the left, agree=0.8025, (0 split)
사전(0.65,0.35)을 사용하는 적합은:
Node number 1: 81 observations, complexity param=0.302 predicted class= absent expected loss= 0.35 class counts: 64 17 probabilities: 0.65 0.35 left son=2 (46 obs) right son=3 (35 obs) Primary splits: Start < 12.5 to the right, improve=10.900, (0 missing) Number < 4.5 to the left, improve= 5.087, (0 missing) Age < 39.5 to the left, improve= 4.635, (0 missing) Surrogate splits: Number < 3.5 to the left, agree=0.6667, (0 split)
손실 4/3아래에 첫번째 분할에는:
Node number 1: 81 observations, complexity param=0.01961 predicted class= absent expected loss= 0.6296 class counts: 64 17 probabilities: 0.7901 0.2099 left son=2 (62 obs) right son=3 (19 obs) Primary splits: Start < 8.5 to the right, improve=5.077, (0 missing) Number < 5.5 to the left, improve=2.165, (0 missing) Age < 39.5 to the left, improve=1.535, (0 missing) Surrogate splits: Number < 6.5 to the left, agree=0.8025, (0 split)
7 회귀(Regression)
7.1 정의
이 지점까지 분류 문제가 정의에 사용 되었고 그리고 우리의 식을 동인 하였다, 어쨌든, 분할 절차는 상당히 일반적이고 그리고 5개의 성분을 구별하는 것으로 확장할 수 있다.
- 분할 특징은(splitting criterion), 변수가 최적의 분할을 주는 것을 결정에서 사용. 분류에서 이것은 지니(Gini) 또는 로그-우도(log-likelihood) 함수이다. 아노바(anova ) 방법에서 분할 특징은 SST - (SSL + SSR) 이다, SST = Σ(yi - y−)2 은 노드의 제곱합인 경우이고, 그리고 SSR, SSL 은 각각 오른쪽과 왼쪽 자식의 제곱합인 경우이다. 이것은 분산의 표본 분석에 그룹-간 제곱합을 최대로하는 분할을 선택하는 것과 동등하다. 이 규칙은 트리의 회귀 옵션에서 구별 한다.
- 요약 통계량 혹은 벡터는(summary statistic or vector), 노드를 설명하기 위해 사용함. 벡터의 첫번째 요소는 적합된 값이 되도록 고려한다. anova 방법에서 이것은 노드의 평균이다; 분류에서 응답은 분류 확률의 벡터가 따라오는 예측 분류이다.
- 노드의 에러(The error of a node). 이것은 anova 에서 y의 분산이 될 것이다, 그리고 분류의 예측 손실도 된다.
- 새로은 관측에서 예측 에러, 노드가 가지는 값(The prediction error for a new observation). anova에서 이것은 ynew - y− 이다
- 어떤 초기화 필요.
anova 방법은 회귀 트리를 이끈다; 이것은 만약 y가 단순 숫자 벡터이면 기본 method 이다, 다시 말하면, 펙터, 메트릭 혹은 생존 객체(survival object)가 아님.
7.2 예: 소비지 보고서 자동차 데이터(Example: Consumer Report car data)
car90 데이터 셋은 1990년 4월 소비자 보고서에서 수집된 변수들이 있다; 이것은 111개의 자동차에 34개의 변수를 가진다. 우리는 3개의 변수를 배제한다: 타이어 사이즈 그리고 모델 이름, 왜냐하면 출력에서 이 리포트 페이지 크기에 잘 적합되지 않는 매우 큰 수준을 가지는 펙터이고 그리고 림 크기는 가격 예측에 너무 좋고 그리고 덜 흥미로운 실례로 이끌기 때문. (작은 차량들은 가격이 싸고 그리고 작은 바퀴를 가진다.)
> cars <- car90[, -match(c("Rim", "Tires", "Model2"), names(car90))] > carfit <- rpart(Price/1000 ~ ., data=cars) > carfit n=105 (6 observations deleted due to missingness) node), split, n, deviance, yval * denotes terminal node 1) root 105 7118.26700 15.805220 2) Disp< 156 70 1491.62800 11.855870 4) Country=Brazil,Japan,Japan/USA,Korea,Mexico,USA 58 421.21470 10.318470 8) Type=Small 21 50.30983 7.629048 * 9) Type=Compact,Medium,Sporty,Van 37 132.80330 11.844890 * 5) Country=France,Germany,Sweden 12 270.72330 19.286670 * 3) Disp>=156 35 2351.19600 23.703910 6) HP.revs< 5550 24 980.27790 20.388710 12) Disp< 267.5 16 395.99670 17.820060 * 13) Disp>=267.5 8 267.58000 25.526000 * 7) HP.revs>=5550 11 531.63680 30.937090 * > printcp(carfit) Regression tree: rpart(formula = Price/1000 ~ ., data = cars) Variables actually used in tree construction: [1] Country Disp HP.revs Type Root node error: 7118.3/105 = 67.793 n=105 (6 observations deleted due to missingness) CP nsplit rel error xerror xstd 1 0.460146 0 1.00000 1.01790 0.162343 2 0.117905 1 0.53985 0.74725 0.109078 3 0.112343 2 0.42195 0.74740 0.112607 4 0.044491 3 0.30961 0.53108 0.093947 5 0.033449 4 0.26511 0.50206 0.099952 6 0.010000 5 0.23166 0.47556 0.119522
- 상대 오차(relative error)는 1 - R2, 선형 회귀와 비슷하다. xerror 는 PRESS 통계량과 관계가 있다. 첫번째 분할은 가장 적합한 향상이 나타난다. 마지막 분할은 명백한 오류에 약간의 개선을 추가하고, 그리고 교차검증된 에러를 증가 시킨다.
- 1-SE 규칙은 3개의 분할을 가지는 트리를 선택할 것이다.
- 이것은 .01과 기본값 cp는 아마도 트리 전체에서 가지치는 경우이다, 그러므로 교차검증된 에러는 최소값에 미미하게 영향을 준다. 0.001의 cp 임계값으로 재실행은 약각의 변화만 있다, 어쨌든.
- Sexprround(temp[3,1],2) 과 0.12 사이의 어떤 CP 값에서 최적의 모델은 하나의 분할을 가진다; 0.04 와 0.11 사이의 어떤 CP 값은 최적 모델에서 2개의 분할이 있다; 등등.
print 와 summary 명령는 또한 cp 옵션을 인식한다, 사용자가 상위 몇 개의 분할을 보는 것을 허용함.
> summary(carfit, cp = 0.1) Call: rpart(formula = Price/1000 ~ ., data = cars) n=105 (6 observations deleted due to missingness) CP nsplit rel error xerror xstd 1 0.46014608 0 1.0000000 1.0179023 0.16234348 2 0.11790530 1 0.5398539 0.7472517 0.10907817 3 0.11234341 2 0.4219486 0.7473962 0.11260680 4 0.04449133 3 0.3096052 0.5310798 0.09394681 5 0.03344936 4 0.2651139 0.5020607 0.09995235 6 0.01000000 5 0.2316645 0.4755624 0.11952205 Variable importance Disp Disp2 Weight Tank HP 19 18 13 12 11 Wheel.base Country HP.revs Gear2 Front.Hd 19 6 4 3 11 Type Length Steering Width 1 1 1 1 Node number 1: 105 observations, complexity param=0.4601461 mean=15.80522, MSE=67.79302 left son=2 (70 obs) right son=3 (35 obs) Primary splits: Disp < 156 to the left, improve=0.4601461, (0 missing) Disp2 < 2.55 to the left, improve=0.4601461, (0 missing) HP < 154 to the left, improve=0.4548845, (0 missing) Tank < 17.8 to the left, improve=0.4431325, (0 missing) Weight < 2890 to the left, improve=0.3912428, (0 missing) Surrogate splits: Disp2 < 2.55 to the left, agree=1.000, adj=1.000, (0 split) Weight < 3095 to the left, agree=0.914, adj=0.743, (0 split) HP < 139 to the left, agree=0.895, adj=0.686, (0 split) Tank < 17.95 to the left, agree=0.895, adj=0.686, (0 split) Wheel.base < 105.5 to the left, agree=0.857, adj=0.571, (0 split) Node number 2: 70 observations, complexity param=0.1123434 mean=11.85587, MSE=21.30898 left son=4 (58 obs) right son=5 (12 obs) Primary splits: Country splits as L-RRLLLLRL, improve=0.5361191, (0 missing) Tank < 15.65 to the left, improve=0.3805426, (0 missing) Weight < 2567.5 to the left, improve=0.3691043, (0 missing) Type splits as R-RLRR, improve=0.3649737, (0 missing) HP < 105.5 to the left, improve=0.3577873, (0 missing) Surrogate splits: Tank < 17.8 to the left, agree=0.857, adj=0.167, (0 split) Rear.Seating < 28.75 to the left, agree=0.843, adj=0.083, (0 split) Node number 3: 35 observations, complexity param=0.1179053 mean=23.70391, MSE=67.17703 left son=6 (24 obs) right son=7 (11 obs) Primary splits: HP.revs < 5550 to the left, improve=0.3569594, (0 missing) HP < 173.5 to the left, improve=0.3146835, (0 missing) Frt.Shld < 57.75 to the right, improve=0.2554028, (0 missing) Front.Hd < 3.25 to the right, improve=0.2278477, (0 missing) Type splits as RLR-RL, improve=0.2178764, (0 missing) Surrogate splits: Country splits as -R-RR----L, agree=0.886, adj=0.636, (0 split) Gear2 < 2.735 to the left, agree=0.886, adj=0.636, (0 split) Disp < 172.5 to the right, agree=0.800, adj=0.364, (0 split) Disp2 < 2.85 to the right, agree=0.800, adj=0.364, (0 split) Front.Hd < 3.25 to the right, agree=0.800, adj=0.364, (0 split) Node number 4: 58 observations mean=10.31847, MSE=7.262322 Node number 5: 12 observations mean=19.28667, MSE=22.56027 Node number 6: 24 observations mean=20.38871, MSE=40.84491 Node number 7: 11 observations mean=30.93709, MSE=48.33062
변위에서 첫 번째는 분할은 105 관측값을 12와 10의 평균 가격을 가지고 70 과 58개의 그룹(노드 2와 3)으로 나눠진다.
- 리스트된 향상도는 분할의 SS에서 변화 비율이다, i.e, 1 - (SSright + SSleft) / SSparent, 적합의 R2에서 획득 됨.
- 데이터 셋은 입방 인치( cubic inches, Disp)와 리터(Disp2) 둘 모두에서 엔진의 변위를 가진다. 두번째는 첫번째의 완전한 대리 분할(surrogate split)이다, 명백히.
- 가중치와 변위(displacement )는 매우 가깝게 연관된다, 91%의 대리 분할 일치(agreement)에 보여 줌.
- 모든 국가가 노드 3에서 나타나지 않는다, e.g., 브라질에서 더 큰 자동차는 없다. 이것은 분할 방향 리스트에서 -로 가르켜 진다.
Regression tree: rpart(formula = Price/1000 ~ ., data = cars) Variables actually used in tree construction: [1] Country Disp HP.revs Type Root node error: 7118.3/105 = 67.793 n=105 (6 observations deleted due to missingness) CP nsplit rel error xerror xstd 1 0.460146 0 1.00000 1.01790 0.162343 2 0.117905 1 0.53985 0.74725 0.109078 3 0.112343 2 0.42195 0.74740 0.112607 4 0.044491 3 0.30961 0.53108 0.093947 5 0.033449 4 0.26511 0.50206 0.099952 6 0.010000 5 0.23166 0.47556 0.119522
다른 플롯은 이 모델에서 최적의 cp 값 결정하는데 참고하여 사용을 수 있다. rsq.rpart 함수는 잭나이프된 에러(jackknifed error) 대 분할의 수를 플롯한다. 흥미로운 것은 가장 작은 에러이다. 그러나 "에러 바(error bars)" 안의 어떤 분할의 수(1-SE rule)는 근거있는 분할의 수로 고려된다(이 경우에, 1 또는 2 분할은 충분하게 보인다). 모델링이 더 참을 가지면, 표본은 더 좋다. 또다른 유용한 플롯은 R2 대 분할의 수 이다. (1 - 명백한 에러) 와 (1 - 상관 에러)는 얼마나 많은 추가 분할을 가질 수 있는지 보여준다. 이 플롯은 R2 값들의 다름이 촛점이다.
Figure 7: 두 개의 그래프는 rsq.rpart(fit3) 함수를 사용하여 얻어졌다. 왼쪽의 그래프는 첫번째 분할이 더 많은 정보를 제공함을 보여준다. 오른쪽 그래프는 트리가 단지 1 또 2 분할을 포함하여 가지를 칠 수 있다는 것을 추측한다. |
마지막으로, 이것은 이 모델에서 잔차를 보는 것이 가능하다, 단지 정규 선형 회귀 적합(regular linear regression fit) 처럼 보임, 아래의 문자에서 생성된 figure 8 에서 보는 것과 같다.
> plot(predict(carfit), jitter(resid(carfit))) > temp <- carfit$frame[carfit$frame$var == '<leaf>',] > axis(3, at = temp$yval, as.character(row.names(temp))) > mtext('leaf number', side = 3, line = 3) > abline(h = 0, lty = 2)
Figure 8: 이 그래프은 자동차 데이터가 도착지의 노드/잎(마지막 노드) 에서 자동의자의 (관측된-기대되는) 가격 대 예측된 가격을 보여준다. 조금의 다른 잎 보더 노드 7에서 다 많은 변화가 나타난다. |
7.3 예: 단계 C 데이터(anova 방법) (Example: Stage C data (anova method))
이전 섹션의 단계 C 전립선 암 데이터는 anova 방법을 사용하여 또한 적합될 수 있다, 상태 변수를 연속 변수 처럼 처리함.
> cfit2 <- rpart(pgstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec) > printcp(cfit2) Regression tree: rpart(formula = pgstat ~ age + eet + g2 + grade + gleason + ploidy, data = stagec) Variables actually used in tree construction: [1] age g2 grade ploidy Root node error: 34.027/146 = 0.23306 n= 146 CP nsplit rel error xerror xstd 1 0.152195 0 1.00000 1.00959 0.045145 2 0.054395 1 0.84781 0.87389 0.064346 3 0.032487 3 0.73901 0.90974 0.076093 4 0.019932 4 0.70653 0.98664 0.088632 5 0.018833 5 0.68660 0.98717 0.088251 6 0.017493 7 0.64893 0.98400 0.088004 7 0.013027 8 0.63144 1.01559 0.091084 8 0.010000 9 0.61841 1.00421 0.091025 > print(cfit2, cp = 0.03) n= 146 node), split, n, deviance, yval * denotes terminal node 1) root 146 34.027400 0.3698630 2) grade< 2.5 61 7.672131 0.1475410 4) g2< 13.19 40 1.900000 0.0500000 * 5) g2>=13.19 21 4.666667 0.3333333 * 3) grade>=2.5 85 21.176470 0.5294118 6) g2< 13.2 40 9.775000 0.4250000 * 7) g2>=13.2 45 10.577780 0.6222222 14) g2>=17.91 22 5.090909 0.3636364 * 15) g2< 17.91 23 2.608696 0.8695652 *
만약 이 트리를 이전 결과와 비교한다면, 우리는 이전 처럼 정확하게 같은 변수와 분할 포인트를 선택한 것이 보인다. 단지 추가된 것은 노드 2의 더 많은 분할이다, figure 3의 위 왼쪽. 이것은 우연한 것이 아니다, 2 분할 경우에 Gini 분할 규칙은 2p(1 - p)로 감소한다, 노드의 변수를 가지는 경우.
두 방법은 그들의 평가와 가지치기에서 다르다, 어쨌든. 노드 4 와 5에 주의해라, 노드 2의 두개의 자식은, 각각 2/40 과 7/21 진행을 가진다. 분류 목적은 두 노드 모두 같은 예측된 값을 가진다(No) 그리고 분할은 버려질 것이다 그래서 분할을 하든 안하든 에러 (오분류의 #)는 구별된다. 회귀 컨텍스드(context)에서 .05와 .33의 두개의 예측된 값은 다르다 - 분할은 의미있는 크기의 거의 순순한 서브그룹을 구별한다.
이 셋업은 확률 회귀(odds regression)로 알려졌다, 그리고 모델의 중요성이 예측 에러 당 se 보다 더 이해성/확정성이 있을 때 분할을 평가함에 더 현명한 방법이 될 것이다. 다중 클래스 문제로 이 규칙의 확장은 매력적이다, 그러나 rpart에서 아직은 수행되지 않는다.
8 포아송 회귀(Poisson regression)
8.1 정의(Definition)
포아송 분할은 이벤트 비율 데이터에서 rpart 모델의 확장을 꾀한다. 이 경우에 모델은:
λ = ƒ(x)
λ는 이벤트 비율이고 그리고 x는 예측자의 어떤 집합인 경우. 예로써 고관절 골절 비율(consider hip fracture rates). 미국의 각 주에서 획득 했다:
- 65 또는 이상의 나이의 환자에서 골절의 수(의학 파일).
- 주의 인구(US 인구 통계 데이터)
- 잠재적인 예측자:
- 사회-경제 지표(socio-economic indicators)
- 영하 일 수(number of days below freezing)
- 민족 혼합(ethnic mix)
- 1000명 인구당 의사 수(physicians/1000 population)
- 등등
이런 데이터는 포아송 회귀(Poisson regression)를 사용하여 일반적으로 접근한다; 우리는 트리 기반 유사법을 발견 가능한가? 이 앙상블에서 비율 회귀(rates regression)의 추가 기준(criteria)에서, 이론 동인은 다음에 있다: 그룹간 제곱합은 매우 강건한 측정이 아니다, 그러나 트리 기반 회귀(tree based regression)는 이 데이터에서 상당히 잘 동작한다. 그러므로 가장 간단한 (통계적인 유효성) 것을 가정 해라.
ci는 관측 i 에서 관측된 이벤트 수로 놓고, ti을 관측 시간으로 놓아라, 그리고 xij, j = 1, ..., p는 예측자가 된다. 프로그램에서 y 변수는 2 컬럼 메트릭이 될 것이다
분할 기준(Splitting criterion): 두 개의 그룹의 우도 비 테스트(likelihood ratio test)
Dparent - (Dleft son - Dright son)
요약 통계량(Summary statistics): 관측된 이벤트 비율 그리고 이벤트의 수.
λ^
= # events ⁄ (total time)
= Σci ⁄ Σti
노드의 에러(Error of a node): 노드 안에서 편차.
D = Σ [ci log(ci ⁄ λ^ ) - (ci - λ^ti)
]
예측 에러(Prediction error): 새 관측에서 편차 기어도, 예측된 비율과 같은 노드의 λ^ 사용.
8.2 방법 향상(Improving the method)
단지 제안된 기준으로는 문제가 있다, 어쨌든: 모델의 교차-검증은 편차에서 무한한 값을 종종 만든다. 이것이 발생하는 단순한 경우는 이해하기가 쉽다. 트리의 어떤 종료 노드가 20개의 문제(subjects)를 가진다고 가정하자, 그러나 단지 20개중 하나만 어떤 이벤트의 경험을 가진다. 교차-검증(cross-validated) 에러는(편차, deviance) 하나의 문제를 가지는 노드에서 추정한다 -- 이벤트를 가지는 문제가 있는 하나는 왼쪽이다 -- λ^ = 0 을 가지는 경우. 우리가 이벤트를 가지지 않는 문제의 10%에서 예측을 사용할 때, 이벤트를 가지는 문제의 편차 기여는:
... + ci log(ci/0) + ...
이다. ci > 0 이면 무한이다. 문제는 λ^ = 0 일 때 이벤트 발생은 무한히 불가능하고, 그리고, 편차 측정 사용은, 모델에 상응하여 무한하게 나빠진다.
하나는 이 현상이 매우 드는 것으로 예상하지만, 그라나 불운하게 그렇지가 않다. 트기-기반 모델링의 주어진 하나는 오른쪽-방향 모델은 의도적인 데이터 오버-피팅(over-fitting)으로 종착된다 그리고 가지의 역으로 가지친다. 첫 단계 동안 숫자 예외에 의한 중단 문제는 적어도 말할 가치가 없다. 더 관심은 이 모서리 영향은 위에 설명된 걷잡을 수 없는 경우에 제한이 있는 것처럼 보이지 않는다. 경계값 λ = 0 에 거의 근접한 어떤 경우는 편차의 큰 값을 유도한다, 그리고 프로시저가 작은 수의 이벤트를 가지는 어떤 최종 노드에 도착 못하게 방해하는 경향이 있다.
애드-훅 솔루션(ad-hoc solution)은 역 추정(revised estimate)을 사용한다
κ는 1/2 또는 1/6인 경우. 그것은, 순수 노드는 특별한 이벤트가 주어진다. (이것은 포아송 회귀(Poisson regression)의 GLM 프로그램에서 사용한 시작 추정값과 비슷하다.) 이것은 만족스럽지 못하다, 어쨌든, 그리고 우리는 수축 추정(shrinkage estimate)을 사용하여 제시한다.
트리의 잎에서 참인 비율 λi는 Gamma(μ, σ) 분포의 무작위 값이라 가정하자. μ를 관측된 전체에서 이벤트 비 Σci / Σti 라 놓고, 그리고 사전 변동 계수 κ = σ/μ 를 사용자가 선택한 것으로 놓자. κ = 0 값은 극단적인 비관을 나타내고("잎 노드(leaf node)는 모두 같은 결과를 줄 것이다"), κ = ∞ 는 극단적인 긍적을 나타낸다. 노드에서 이벤트 비의 베이즈 추정(Bayes estimate)은 아래 처럼 동작한다.
α = 1 / k2 그리고 β = α / λ^ 인 경우.
이 추정값은 척도 불변이다, 단순한 해석을 가지고, 그리고 많은 정보량을 가지는 그러한 노드를 최소한으로 축소 한다. 실제에서, k = 10 인 값은 근보적으로 축소하지 않는다. method='poisson' 에서, 최적의 파라메터 리스트는 하나의 수 k 이다, 1을 기본값으로 가짐.
8.3 예: 땜질 데이터(Example: solder data)
땜질 데이터 프레임, S 도움말 파일에 설명된 것과 같음, 실험 결과는 회로 보드에 출력된 접착된 컴포넌트의 wave-soldering procedure 와 연관된 5개의 다양한 900 개의 관측을 가지는 데이터 셋이다. 응답 변수는, skips, 얼마나 많은 땜질이 육안 검사에서 나타난 skips(건너 뛰었는지) 수 이다. 다른 변수는 아래에 리스트 되었다:
Opening | factor: amount of clearance around the mounting pad
(S < M < L)
장착 패드 주변에 여유 공간의 양
|
Solder | factor: amount of solder used (Thin < Thick) |
Mask | factor: Type of solder mask used (5 possible) |
PadType | factor: Mounting pad used (10 possible) |
Panel | factor: panel (1, 2 or 3) on board being counted |
이 호출에서, rpart.control 옵션은 변경되었다: maxcompete = 2 는 단지 2개의 다른 결쟁 분할이 리스트(기본값은 4임)됨을 의미한다; cp = .05 더 작은 트리가 초기의 생성됨을 의미한다(기본값은 .01). 포아송 분할에서 y 변수는 컬럼 1에는 관측 시간 그리고 컬럼 2에는 이벤트의 수를 가지는 2 컬럼 메트릭이 될 것이다, 혹은 이벤트 개수의 벡터 하나만 가지게 될 것이다.
> sfit <- rpart(skips ~ Opening + Solder + Mask + PadType + Panel, data = solder, method = 'poisson', control = rpart.control(cp = 0.05, maxcompete = 2)) > sfit n= 720 node), split, n, deviance, yval * denotes terminal node 1) root 720 6855.6900 4.965278 2) Opening=L,M 480 1803.1630 1.913780 4) Mask=A1.5,A3,B3 360 718.0687 1.038308 * 5) Mask=B6 120 599.6246 4.542376 * 3) Opening=S 240 2543.1750 11.065710 6) Mask=A1.5,A3 120 596.4945 4.550696 * 7) Mask=B3,B6 120 962.4191 17.570510 14) Solder=Thick 60 256.9253 10.398430 * 15) Solder=Thin 60 343.8841 24.700420 *
- 응답 값은 기대되는 이벤트 비율(시간 변수를 가짐) 또는 이 경우는 기대되는 skip의 수 이다. 이 값은 skips/observation인 5.53 의 전역 추정치를 향해 줄어 든다.
- 편차는 널 편차(null deviance, 가끔은 잔차 편차라 불림)와 같다 널 편차는 주어진 데이터의 하위 집합에서 포아송 glm 모델을 계산할 때 얻을 수 있다.
> summary(sfit, cp = 0.1) Call: rpart(formula = skips ~ Opening + Solder + Mask + PadType + Panel, data = solder, method = "poisson", control = rpart.control(cp = 0.05, maxcompete = 2)) n= 720 CP nsplit rel error xerror xstd 1 0.36602468 0 1.0000000 1.0066991 0.06469989 2 0.14356853 1 0.6339753 0.6426303 0.03737052 3 0.07081271 2 0.4904068 0.4988637 0.02723036 4 0.05274593 3 0.4195941 0.4283703 0.02308702 5 0.05000000 4 0.3668481 0.3953007 0.02192361 Variable importance Opening Mask Solder 58 34 8 Node number 1: 720 observations, complexity param=0.3660247 events=3575, estimated rate=4.965278 , mean deviance=9.521792 left son=2 (480 obs) right son=3 (240 obs) Primary splits: Opening splits as LLR, improve=2509.3530, (0 missing) Mask splits as LLRR, improve=1323.3680, (0 missing) Solder splits as LR, improve= 936.9548, (0 missing) Node number 2: 480 observations events=918, estimated rate=1.91378 , mean deviance=3.75659 Node number 3: 240 observations, complexity param=0.1435685 events=2657, estimated rate=11.06571 , mean deviance=10.59656 left son=6 (120 obs) right son=7 (120 obs) Primary splits: Mask splits as LLRR, improve=984.2639, (0 missing) Solder splits as LR, improve=631.5271, (0 missing) PadType splits as RRRRLLRLRL, improve=244.9255, (0 missing) Node number 6: 120 observations events=546, estimated rate=4.550696 , mean deviance=4.970788 Node number 7: 120 observations events=2111, estimated rate=17.57051 , mean deviance=8.020159
- 향상도는 Devianceparent - (Devianceleft + Devianceright) 이다, 두 포아송 표본 비교에서 우도 비 검정(likelihood ratio test)과 같음.
- 교차 검증된 에러는 얼마나 많은 에러가 각 분할에서 향상 되었는지 비교할 때 전체에서 비관적으로 됨을 찾았다. 이것은 이전에 다루어진 경계 효과의 영향 처럼 보인다, 그러나 더 많은 연구가 필요하다.
- 편차 xstd 유용하게 보이지 않는다, xerror의 편향(bias )이 주어진 xstd.
> par(mar = rep(0.1, 4)) > plot(sfit) > text(sfit, use.n = TRUE, min = 3) > fit.prune <- prune(sfit, cp = 0.10) > plot(fit.prune) > text(fit.prune, use.n = TRUE, min = 2)
use.n = TRUE 옵션은 events / total N 의 수가 예측 비율(number of events/person-years)에 따라 리스트 될 수 있게 명확히 한다. prune 함수는 트리 적합에 cp 값 0.10을 곱한다. 같은 트리는 본래의 rpart 호출에서 cp = 0.10을 명확히 적용 하여 생생된다.
Figure 9: 처음 그림은 땜질 데이터를 보 여준다, poisson 방법을 가지고 적합하고, cp값을 0.05를 사용한다. prune.rpart 함수는 비스한 트리를 만들기 위해 사용했다. |
8.4 예: 단계 C 전립선 암, 생존 메서드(Example: Stage C Prostate cancer, survival method)
포아송 모델의 하나의 특별한 경우는 의학 진찰에서 특히 흥미가 있다(저자가 행한 것과 같음). 우리가 생존 데이터를 가졌다고 가정하자, i.e., 게다가, 시간 값은 지수 모델(exponential mode)을 적합하는 것 처럼 예비-척도(pre-scaled) 되었다고 가정하자. 이것은, 시간 축으로 퍼진다, 데이터의 Kaplan-Meier 플롯은 로그 척도(logarithmic scale)에서 그려질 때 직선이 될 것이다. 이것을 하기 위한 근사적인 방법은
> require(survival) > temp <- coxph(Surv(pgtime, pgstat) ~ 1, stagec) > newtime <- predict(temp, type = 'expected')
이다 그런 다음 newtime 변수를 사용하여 분석을 한다.(이것은 각 시간 값 Λ(t)를 대체한다, Λ가 누적 위험 함수(cumulative hazard function)인 경우. )
우리가 지수 척도(exponential scaling) 호출할 이것의 약간 더 정교한 버전은 파라메트릭 지수 모델(parametric exponential model)에서 log(생존)에 대한 곧은 직선 형태의 선을 만든다. 위의 근사 척도화(approximate scaling)와 다른 점은 그 사이 간격에서 "credit"를 받을 것이다, i.e., 우리는 위험 기준선은 관측된 죽음 간에 선형이 된다고 추측한다. 만약 데이터가 이 방법으로 예비-척도(pre-scaled)가 된다면, 그러면 위의 포아송 모델은 LeBlanc 과 Crowley [3]의 local full likelihood(지역 전체 가능성) 트리와 동등하다. 그들은 이 모델이, 회귀 트리(anova 방법)에서 입력 처럼 Cox 모델로 부터 마틴게일 잔차( martingale residuals)를 사용하는 Therneau et al[7]의 앞선 제안 보다 더 효과적이다. 지수 척도화 또는 method='exp'는 만약 y가 Surv 객체이면 기본이다.
단계 C 암 예제로 다시 돌아가자. 이전에 설명된 변수를 제외하자, 종양 진행(tumor progression)에 시간(time)을 가짐.
> require(survival) > pfit <- rpart(Surv(pgtime, pgstat) ~ age + eet + g2 + grade + gleason + ploidy, data = stagec) > print(pfit) n= 146 node), split, n, deviance, yval * denotes terminal node 1) root 146 192.111100 1.0000000 2) grade< 2.5 61 44.799010 0.3634439 4) g2< 11.36 33 9.117405 0.1229835 * 5) g2>=11.36 28 27.602190 0.7345610 10) gleason< 5.5 20 14.297110 0.5304115 * 11) gleason>=5.5 8 11.094650 1.3069940 * 3) grade>=2.5 85 122.441500 1.6148600 6) age>=56.5 75 103.062900 1.4255040 12) gleason< 7.5 50 66.119800 1.1407320 24) g2< 13.475 24 27.197170 0.8007306 * 25) g2>=13.475 26 36.790960 1.4570210 50) g2>=17.915 15 20.332740 0.9789825 * 51) g2< 17.915 11 13.459010 2.1714480 * 13) gleason>=7.5 25 33.487250 2.0307290 26) g2>=15.29 10 11.588480 1.2156230 * 27) g2< 15.29 15 18.939150 2.7053610 * 7) age< 56.5 10 13.769010 3.1822320 * > pfit2 <- prune(pfit, cp = 0.016) > par(mar = rep(0.2, 4)) > plot(pfit2, uniform = TRUE, branch = 0.4, compress = TRUE) > text(pfit2, use.n = TRUE)
grade 에서 주요 분할은 status가 양분된 끝점에서 사용되어 졌을 때와 동일하다, 그 후 분할은 상이하다.
Figure 10: 단계 C 전립선 데이터에서 생존 적합(Survival fit) |
우리가 이 트리를 단순하게 만들기 원한다고 가정하자, 그래서 단지 4 개의 분할이 남아있다. 복잡도 파라메터(complexity parameters)의 테이블을 보자, 우리는 prune(fit, cp = 0.016) 는 figure 10에서 보여주는 요구된 결과를 가짐을 볼 수 있다, 그림의 노드 4(가장 왼쪽 종료 노드)로 부터 33개의 문제에서 단지 1개를 가진다, .133의 상관 죽음 비율(relative death rate)은 전체 비율에 곱한다. 그리고 grade = 1 - 2 와 g2 < 11.36 에 정의된다.
모델의 마지막 요약을 위해, 이것은 문제가 도착한 최종 bins에 기반된 생존 확률을 그리는데 도움이 될 수 있다. rpart 그룹핑에 근거한 새로운 변수를 만들기 위해, 적합의 where 컴포넌트를 사용한다. figure 11에 보여주는 것과 같음. 우리는 노드 6에서 분할을 제거하기 위해 4개의 노드에서 트리를 더 가지칠 것이다.
> temp <- snip.rpart(pfit2, 6) > km <- survfit(Surv(pgtime, pgstat) ~ temp$where, stagec) > plot(km, lty = 1:4, mark.time = FALSE, xlab = "Years", ylab = "Progression") > legend(10, 0.3, paste('node', c(4,5,6,7)), lty = 1:4)
Figure 11: 잘려진 rpart 객체에 근거한 생존 프롯(Survival plot). 종양 진행 확률은 노드 8에서 최대가 된다, 환자들은 나이가 많고 그리고 높은 초기 종양 단계를 가짐. |
8.5 남겨진 이슈(Open issues)
축소 파라메터(shrinkage parameter) k의 기본값은 1이다. 이것은 추정된 λj에서 1의 분산을 가지는 사전 계수에 상응한다. 우리는 만약 이것이 좋은 값이면 결정하기 위한 많은 충분한 경험을 가지지 않았다.(이것은 log(0) 메세지를 통해서 중지한다).
교차 검증은 잘 동작하지 않는다. 프로시저는 매우 보수적인 결과를 주고 그리고 상당히 자주 최적이 되기 위해 분할이 없는 트리를 보여준다. 이것은 모서리 영향(edge effect)의 다른 잔재일 것이다.
9 플롯팅 옵션(Plotting options)
이 섹션은 rpart 객체를 그릴 때 가능한 다양한 옵션을 시험한다. 단순하게, 같은 모델(예 1의 이터) 출력으로 사용할 것이다. 당신은 예에서par(mar =)의 사용을 이미 의심없이 받아들였다. rpart에서 plot 함수는 그릴 지역을 설정하기 위한 일반적인 plot 함수를 사용한다. 기본적으로 이것은 축, 하단, 좌, 그리고 상단의 범례(legends) 또는 타이틀을 위한 공간을 남긴다. 축을 위한 공간은 rpart 플롯에세 일반적으로 필요하딘 않다. 그리고 이 보고서에는 우리는 상단 타이틀을 가지지 않는다. 이 보고서에 작은 플롯을 위해, 페이지 전부를 사용하는 것이 중요했고, 그리고 우리는 각 플롯을 재설정 했다.(Sweave가 각 플롯에서 동작하는 방법은 분리된 환경이다. 그래서 par() 파라메터는 플롯에서 플롯으로 보장되지 않는다.)
단순하게 표기된 플롯은 기본으로 어떤 것을 변경함이 없이 plot 과 text 를 사용하여 호출되었다. 이것은 우선 보는데 유용하다, 그러나 때로는 각 노드에 대한 더 많은 정보를 원할 것이다.
> fit <- rpart(pgstat ~ age + eet + g2 + grade + gleason + ploidy, stagec, control = rpart.control(cp = 0.025)) > par(mar = rep(0.2, 4)) > plot(fit) > text(fit)
Figure 12: plot(fit); text(fit) |
다음 플롯은 일정한 줄기 길이(uniform stem lengths)를 가지고(uniform = TRUE), 각 노드에서 문제의 수를 구별(use.n = TRUE)하는 추가적인 정보를 가지고, 그리고 모든 노드에서 라벨을 가진다, 단지 터미널 모드만 아니라(all = TRUE).
> par(mar = rep(0.2, 4)) > plot(fit, uniform = TRUE) > text(fit, use.n = TRUE, all = TRUE)
Figure 13: plot(fit, uniform = TRUE); text(fit,use.n = TRUE,all = TRUE) |
팬시어 플롯(Fancier plots)은 branch 옵션을 변경하는 것으로 만들어 질 수 있다, 노드와 그 지식을 연결하는 가지의 형태를 바꿈. 플롯의 기본값은 직각 어깨 트리(branch = 1.0)를 가진다. 이것은 전혀 어깨가 없는 다른 외향을 가질 수 있다(branch=0).
> par(mar = rep(0.2, 4)) > plot(fit, branch = 0) > text(fit, use.n = TRUE)
Figure 14: plot(fit, branch=0); text(fit,use.n = TRUE) |
이러한 옵션들은 특별하게 필요한 적합한 플롯을 그리기 위해 다른 옵션을 가지고 조합 될 수 있다. 기본 플롯은 공간의 사용에서 효과적이지 않다: 종료 노드들은 1, 2, ... 의 x 축에 항상 놓인다. compress 옵션은 어떤 노드들을 오버래핑 하여 이것의 향상을 꾀한다. 이것은 Figure 15에서 약간 효과를 가진다, 그러나 Figure 4에서는 가장 낮은 가지가 위의 이런것들 아래에 놓이는 것을 허락한다. 만약 compress를 가지고 공간의 주변에 있기를 원한다면 터미널 노드와 분할 사이의 공간을 조정하는 nspace 사용해 보라.
> par(mar = rep(0.2, 4)) > plot(fit, branch = 0.4,uniform = TRUE, compress = TRUE) > text(fit, all = TRUE, use.n = TRUE)
이런 옵션의 몇몇은 함수가 post.rpart를 호출하여 조합되어 진다, 현재 디렉토리에 .ps 파일을 생성하기 위한 기본 동작은 과거 보다는 현재이다. 함수에서 구별 가능한 결과는 아래에 보여준 옵션을 조합하는 것으로 가질 수 있다, 결과는 figure 16에서 보여준다. 필수적인 코드는:
> par(mar = rep(0.2, 4)) > plot(fit, uniform = TRUE, branch = 0.2, compress = TRUE, margin = 0.1) > text(fit, all = TRUE, use.n = TRUE, fancy = TRUE, cex= 0.9)
Figure 15: plot(fit, branch = 0.4, uniform = TRUE, compress = TRUE) |
Figure 16: Fancier plot |
text의 fancy 옵션은 타원형과 사각형을 생선한다, 그리고 분할 규칙을 가지의 중간으로 이동한다. Margin은 플롯팅 지역을 조금 축소한다 그래서 text 박스는 플롯의 모서리에 걸져 있지 않다. branch 옵션은 좋은 각도에서 타원에서 나오기 위한 라인을 만든다. 나눠진 패키지 rpart.plot은 이러한 사상을 더 많이 보여준다.
10 다른 기능들(Other functions)
교처-검증의 더 일반적인 접근은 xpred.rpart 함수를 사용하여 얻을 수 있다. rpart fit, k 복잡도 파라메터(complexity parameters)의 벡터, 그리고 교차-검증(cross-validation)의 요구되는 수를 감안할 때, 이 함수는 각 문제에서 예측된 값 y^(-i)를 가지는 n by k 의 메트릭을 반환한다, 그 문제를 가지지 않고 적합된 모델에서 구함. cp 벡터는 전체 데이터 셋에서 가지친 트리의 cp 결과의 기하 평균(geometric mean)이 기본이다.
여기에 일반적인 평균 제곱 에러(mean square error) 보다는 연속된 데이터를 위한 평균 절대 편차(mean absolute deviation)를 사용하는 예가 있다.
> carfit <- rpart(Price/1000 ~ ., cars) > carfit$cptable CP nsplit rel error xerror xstd 1 0.46014608 0 1.0000000 1.0285728 0.16391737 2 0.11790530 1 0.5398539 0.7583103 0.11098017 3 0.11234341 2 0.4219486 0.7720669 0.12011827 4 0.04449133 3 0.3096052 0.6362342 0.10234913 5 0.03344936 4 0.2651139 0.5566097 0.09785706 6 0.01000000 5 0.2316645 0.5130885 0.11456833 > price2 <- cars$Price[!is.na(cars$Price)]/1000 > temp <- xpred.rpart(carfit) > errmat <- price2 - temp > abserr <- colMeans(abs(errmat)) > rbind(abserr, relative=abserr/mean(abs(price2-mean(price2)))) 0.73007304 0.23292416 0.11509076 0.07069871 0.03857728 0.01828917 abserr 6.602487 5.613556 5.7370626 5.2544184 4.9378057 4.7244944 relative 1.008093 0.857099 0.8759565 0.8022645 0.7539229 0.7213537
우리는 절대 에러 척도에서 상관 에러 향상은 그렇게 크지 않다, 비록 이것은 최적의 분할은 절대 에러가 최소가 되도록 선택하지 않게 기대 되도록 주어질 수 있다.
11 테스트 케이스(Test Cases)
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Table 1: 분류 테스트 케이스을 위한 데이터 셋 |
분류 트리의 정의는 가장 복잡한 것을 얻을 수 있다, 특히 사전과 손실 메트릭스(priors and loss matrice)에 기대값을 가지고서. 이 섹션에서 우리는 상당히 상세하고 단순한 예를 구상했다, (이것은 S 함수 디버그에서 행해진다.)
n = 15 로 놓고, 데이터는 table 1 주어진 것 과 같다. 손실 메트릭은 다음과 같이 정의된다.
열(rows )은 참 분류로 열(columns )은 할당된 분류를 나타내는 경우. 그러므로 잘못하여 분류 2 관측값을 3으로 호출하는 에러는 이 데이터 셋에서 아주 크다. 학습을 위한 사전 확률은 π = .2, .3, .5 가 되는것이 추정 된다, 그리고 분류 1은 입력 데이터에서 가장 일반적이다(ni = 6, 5, 그리고 4의 관측값, 개별적), 그러나 분류 3은 외부의 모집단에서 가장 일반적임.
L = | 0 | 2 | 2 |
2 | 0 | 6 | |
1 | 1 | 0 |
분할은 변경된 사전(altered priors)을 가지는 Gini 지수를 사용하여 선택된다, Breiman et al [1]의 식 (4.15)에 정의와 같음.
π~1
= π1(0 + 2 + 2) / Σπ~i
= 4 / 21
π~2 = π2(2 + 0 + 6) / Σπ~i = 21 / 21
π~3 = π3(1 + 1 + 0) / Σπ~i = 5 / 21
π~2 = π2(2 + 0 + 6) / Σπ~i = 21 / 21
π~3 = π3(1 + 1 + 0) / Σπ~i = 5 / 21
주어진 노드 T 에서, 지니 불순도(Gini impurity)는 Σj p(j | T)[1 - p(j | T)] = 1 - Σp(j | T)2 가 될 것이다, p(j | T)는 노드에서 분류 j 의 기대 확률인 경우:
p(j | T) = π^1 [ni(T) / ni ] / Σp(i | T)
상위 노드에서 출발, 각 가능한 기대되는 분류에서 우리는 아래의 손실을 가진다
최선의 선택은 분류 2 이다, 기대 손실 0.9를 가짐. 노드에서 지니 불순도(Gini impurity)는, 변경된 사전(altered priors) 사용, G = 1 - (16 + 144 + 25) / 212 = 256 / 441 ≈ .5805 이다.
predicted class | E(loss) |
1 | .2*0 + .3*2 + .5*1 = 1.1 |
2 | .2*2 + .3*0 + .5*1 = 0.9 |
3 | .2*2 + .3*6 + .5*0 = 2.2 |
변수 x1은 12.5 에서 분할한다고 가정하자, 이것은, 나중에 버려짐, 적어도 2개의 관측값이 각 종료 노드에 있어야 하는 제약 조건 하에서 그 변수의 최적 분할 포인트. 그러면 오른쪽 노드는 (4, 4, 4)의 분류 수를 가질 것이고 그리고 왼쪽 노드는 (2, 1, 0)을 가질 것이다.
오른쪽 노드에서 (트리의 노드 3)
P(R) |
= .2(4/6) + .3(4/5) + .5(4/4)= 131/150
= probability of the node (in the population) |
p(i | R) | = (.2(4/6), .3(4/5), .5(4/4))/P(R) |
P~(R) | = (4/21)(4/6) + (12/21)(4/5) + (5/21)(4/4) = 259/315=37/45 |
p~(i | R) | = [(4/21)(4/6), (12/21)(4/5), (5/21)(4/4)] (45/37) |
G(R) | = 1 - Σ p~(i | R)2 ≈ .5832 |
왼쪽 노드에서 (트리의 노드 2)
P(L) | = .2(2/6) + .3(1/5) + .5(0/4)= 19/150 |
p(i | L) | = (.4/3, .3/5, 0)/ P(L) = (10/19, 9/19, 0) |
P~(L) | = 1 - P~(R) = 8/45 |
p~(i | L) | = [(4/21)(2/6), (12/21)(1/5), (5/21)(0/4)]/ P~(L) |
G(L) | = 1 - Σ p~(i | L)2 ≈ .459 |
분할의 전체 향상도는 부모와 2 자식 노드 간 불순도의 변화를 포함한다.
n(G - [ P~(L) * G(L) + P~(R) * G(R)]) ≈ .2905
n = 15는 전체 표본 크기인 경우.
변수 x2에서 최적의 분할은 5.5 에서 일어난다, 각각 (2, 2, 1)과 (4, 3, 3)의 분류 수를 가지는 왼쪽과 오른쪽 노드의 데이터 분할. 계산은 위에 주어진 향상도 1.912와 정확하게 같다.
변수 3에서는 3개의 누락된 값이 있다, 그리고 계산은 단지 12/15 관측값을 가지는 트리를 더 아래로 노드를 보내기 위해 무엇인가 찾는 것과 비슷하다. 최적 분할 포인트는 3.6 이다, 각각 왼쪽과 오른쪽 노드에서 (3, 4, 0)과 (1, 0, 4)의 분류 수가 주어짐.
오른쪽 노드에서 (트리의 노드 3)
P~(R) | = (4/21)(3/6) + (12/21)(4/5) + (5/21)(0/4) = 174/315 |
p~(i | R) | = [(4/21)(3/6), (12/21)(4/5), (5/21)(0/4)] (315/174) = (5/29, 24/29, 0) |
G(R) | = 1 - (25 + 576)/292 = 240/841 ≈ .2854 |
왼쪽 노드에서 (트리의 노드 2)
P~(L) | = (4/21)(1/6) +(12/21)(0/5) + (5/21)(4/4)= 85/315 |
p~(i | L) | = [(4/21)(1/6), (12/21)(0/5), (5/21)(4/4)] (315/85) = (2/17, 0, 15/17) |
G(L) | = 1 - (4 + 225)/172 = 60/289 ≈ .2076 |
노드 전체의 불순도는 단지 15개의 관측값 중 12 개를 포함한다, 최상위 노드에서 아래의 값이 주어짐.
P~(T) | = 174/315 + 85/315 = 259/315 |
p~(i | T) | = [(4/21)(4/6), (12/21)(4/5), (5/21)(4/4)] (315/259)
= (40/259, 144/259, 75/259) |
G(T) | = 1 - (402 + 1442 + 752)/2592 = 39120/67081 |
분할의 전체 향상도는 모든 3개의 노드의 불순도 G를 포함한다, 대체 사전(alternate priors) 하에 노드의 확률에 의해 가중 됨.
15 * {(259/315)(39120/67081) - [(174/315)(240/841) + (85/315)(60/289)]} ≈ 3.9876
rpart 루틴을 가지고 일반적으로 참이 되는 것처럼, 누락된 값을 가지는 변수는 분할 선택의 기대를 가지고 불이익이 있다 - 259/315 의 펙터(factor ) 또는 최상위 노드에서 x3의 경우. Table 2는 x3의 잘린 포인트 전체에 대한 통계량을 보여준다.
Cutpoint | P(L) | P(R) | G(L) | G(R) | ΔI |
1.3 | 0.03 | 0.97 | 0.00 | 0.56 | 0.55 |
1.8 | 0.06 | 0.94 | 0.00 | 0.53 | 1.14 |
2.5 | 0.18 | 0.82 | 0.46 | 0.57 | 0.45 |
2.9 | 0.21 | 0.79 | 0.50 | 0.53 | 0.73 |
3.1 | 0.32 | 0.68 | 0.42 | 0.56 | 1.01 |
3.3 | 0.44 | 0.56 | 0.34 | 0.52 | 1.96 |
3.6 | 0.55 | 0.45 | 0.29 | 0.21 | 3.99 |
3.9 | 0.61 | 0.39 | 0.41 | 0.26 | 2.64 |
4.3 | 0.67 | 0.33 | 0.48 | 0.33 | 1.56 |
4.7 | 0.73 | 0.27 | 0.53 | 0.45 | 0.74 |
4.8 | 0.79 | 0.21 | 0.56 | 0.00 | 0.55 |
Table 2: Cut points and statistics for variable x3, top node |
x3은 누락된 값을 가지기 때문에, 다음 단계는 대리 분할(surrogate split)을 선택한다. 사전과 손실(Priors and losses) 대리 선택의 계산에서 역할이 없이 한다. 모든 사전 계산에서, 사전의 효과는 관측값에 가중치를 추가하는 경우를 구별한다, 관측값에 나타난 빈도는 선택 사전과 같다; 그러므로 대리 계산은 가중된 경우에 계산된다, 하나는 그들은 또한 그리고 사전의 사용을 만드는 것을 논쟁한다. 아규먼트는 코드에 이것을 추가해도 되는 충분한 강제적인 사항을 아직 찾지 못했다.
나를 주목하라: cp는 usesurrogate=0 에서 올바르지 않다. 분할 후의 에러는 (왼쪽 에러 + 오른쪽 에러) 이 아니다 - 이것은 또한 조건을 가질 필요가 있다(분할되지 않은 그 작업에 대한 부모의 오류).
댓글 없음:
댓글 쓰기