여기서 설명하고자 하는 Bootstrap 방법은 모델의 metric, 정확도(accuracy)를 측정하는 과정에서의 bootstrap을 다룬다. Cross-validation과 마찬가지로 bootstrap은 (conditional) test errorErrT 를 추정하기 위해 사용되지만, 일반적으로 기대예측오차 Err 만을 잘 추정해낸다.
정의
크기가 N인 Training set이 Z=(z1,…,zN) 와 같이 주어졌다고 하고, 이때 각 데이터는 zi=(xi,yi) 로 구성되었다고 하자. Bootstrap은 이러한 training data에서 무작위로 복원추출을 진행하는 것인데, 추출한 sample의 크기가 원래 training set의 크기 N과 동일할 때까지 추출한다. 이 과정을 B번 진행하면 B개의 bootstrap dataset이 생성되고, 이렇게 생성된 B개의 데이터셋에 대해 모델의 성능을 측정하는 것을 bootstrap 과정이라고 한다.
Training set Z에 대해 어떤 정확도 지표 S(Z)를 측정하는 상황이라고 하자. 즉, 우리가 관심있는 대상(qunatity of interest)은 S(Z)이고, 이에 대한 통계적 정확도를 측정해야 한다. 이를 위해 B번의 bootstrap을 실행하여 데이터셋 Z1,…,ZB 각각에 대해 S값을 계산하여, 이들을 S(Z1),…,S(ZB) 라고 두자. 그러면 이로부터 원래 S(Z)의 sample distribution를 다음과 같이 얻을 수 있다.
Sˉ=B∑bS(Zb),Var=B−11b=1∑B(S(Zb)−Sˉ)2
Bootstrap prediction error
이번에는 앞서 설명한 bootstrap 방법을 이용해 예측오차를 추정하는 방법에 대해 생각해보자. 먼저, 각 bootstrap 데이터셋(b=1,…,B)에 대해 모델을 추정하는 방법을 생각하자(f^b). 그러면 이를 이용해 손실함수의 표본평균으로 예측오차의 추정량을 다음과 같이 정의할 수 있다.
Errboot=B1b=1∑BN1i=1∑NL(yi,f^b(xi))
그러나, 이는 올바른 추정량이 될 수 없다. 손실함수를 계산하는데 쓰이는 데이터, 즉 test sample의 역할을 하는 데이터가 각 zi=(xi,yi) 로 원래 Training set Z인 반면 훈련에 쓰인 데이터는 Z에서 추출한 bootstrap set들이기 때문이다. 즉, 훈련과 테스트 데이터의 성격이 매우 유사하여 test error의 추정량으로서의 의미가 없어진다. 만일 위 추정량을 이용하게 되면 예측오차가 비현실적으로 좋게 추정되고, 그렇기 때문에 cross-validation의 경우 training-test data가 중첩되지 않도록 하는 것이다.
Bootstrap error의 개선
Errboot의 성능을 개선하기 위해, 우선 bootstrap이 예측오차 추정에 주는 영향을 간단한 예를 통해 살펴보도록 하자.
클래스 {0,1} 각각 N개의 데이터가 있는 분류 문제에 1-Nearest Neighbor 분류기를 이용한다고 하자. 그러면 0-1 loss를 이용할 때 원 데이터셋의 true error(rate)는 0.5가 된다. 하지만 bootstrap을 이용하게 되는 경우 Errboot은 true error보다 낮아지게 된다. 만일 j번째 관측값이 k번째 bootstrap sample에 포함되지 않으면
Errboot=N1i=1∑NB1b=1∑BL(yi,f^b(xi))
위 식에서 i=j,b=k인 항의 값이 0이 되므로 true error보다 낮아지게 된다. 이때 낮아지는 정도는 i번째 관측값이 b번째 bootstrap sample에 속하지 않을 확률, 즉
에 비례한다. 즉, Errboot의 기댓값은 대략 0.5×0.368=0.184 가 되고, 실제 true error 0.5에 비해 많이 낮은 수치이다.
즉, 위 예시에서 문제가 되었던 것은 bootstrap이 특정 관측값을 포함하지 않는 경우이고, 이를 해결하기 위해 LOOCV와 유사한 방법을 사용해야 한다. 각각의 관측값 zi에 대해 zi를 포함하지 않는 bootstrap sample만을 다루자. 즉, zi를 포함하지 않는 bootstrap sample들의 인덱스 집합을 C−i로 두고, 이때 샘플의 개수를 ∣C−i∣로 쓰자. 이를 이용해 다음과 같이 예측오차에 대한 Leave-one-out bootstrap(LOOB) 추정치를 정의할 수 있다.
Err(1)=N1i=1∑N∣C−i∣1b∈C−i∑L(yi,f^b(xi))
이때 주의해야 할 것은, 모든 bootstrap sample이 어떤 관측값 zi를 모두 포함하면 ∣C−i∣=0이 되므로 모든 관측값에 대해 ∣C−i∣>0이 되도록 큰 B값을 설정해야 한다는 것이다. 또한, 앞서 살펴본 특정 관측값이 어떤 bootstrap sample에 포함될 확률 0.632를 이용해 ".632 estimator"를 다음과 같이 정의할 수 있다(자세한 유도과정은 복잡하므로 생략했다).
Err.632=0.368⋅err+0.632⋅Err(1)
앞선 0-1 class 분류 문제에 이를 적용하면, err=0, Err(1)=0.5 이므로 .632 estimator는 0.316의 값을 갖는다. 그러나, 이 역시도 true error 0.5에 못미치는 bias을 갖는다. 이를 해결하기 위해, 과적합이 일어나는 정도를 수치화하여 이를 토대로 추정치를 개선할 수 있다.
.632+ estimator
우선, no-information error rate γ 를 정의하자. 이는 input data와 클래스 레이블이 독립이라고 가정할 때 예측 규칙의 error rate로 정의된다. 하지만 실제 데이터는 독립성을 보장할 수 없으므로, 우리는 이에 대한 추정치를 다음과 같이 정의한다.
γ^=N21i=1∑Ni′=1∑NL(yi,f^(xi′))
즉, 각 예측변수 xi들과 반응변수 yi들의 모든 가능한 N2 개의 조합에 대한 sample error rate를 추정치로 사용한다. 이를 이용하여 상대적 과적합율relative overfitting rate 을 다음과 같이 정의하는데, 이는 LOOB 추정치의 과적합이 상대적으로 얼만큼 발생했는지를 측정하는 변수이다.
R^=γ^−errErr(1)−err
위 값이 0이면 과적합이 일어나지 않음을 의미하고, 1이면 과적합의 정도가 no-information value γ^−err와 일치함을 의미한다. 이를 바탕으로 다음과 같이 개선된 .632+ estimator을 얻을 수 있다.