머신 러닝의 기본적인 개념 중 하나인 Bias-Variance trade-off에 대해 포스팅 해보려고 한다. 가능한 쉽게 설명하기 위해 예시를 든다는 것이 오히려 전달하는 바를 왜곡시키는 것은 아닐까 염려스럽다..(*예시 선택은 신중해야한다.)
Bias와 Variance가 서로 trade-off 관계를 가진다고 설명하는 글은 아주 많다. 정말 많다. 하지만, 세부적으로 Bias와 Variance가 어떻게 계산되고, 그것이 왜 trade-off 관계를 가질 수 밖에 없는지에 대해 설명하는 글은 아직 보지 못했다. 그래서 용감하게 도전했다.
Bias-Variance trade-off를 본질적으로 이해하기 위해서는 parameter(or degree of freedom)에 대한 개념을 인지하고 있어야 한다. 우선 Bias-Variance trade-off가 어떻게 발생하는지 다음 예시를 통해 살펴보겠다.
f<-c()
x<-seq(-10,10,by=0.02)
set.seed(1234)
noise <- rnorm(length(x),sd=0.3)
f<- sin(x)+noise
plot(x, f, main='Example data')
lines(x, sin(x),col='yellow',lwd=3)
여기서 우리 실험의 목적은 위 데이터가 주어졌을 때, signal이 sin(x)라는 것을 알지 못한 채로, 데이터의 signal 함수, \(h(x)\),를 추정해보는 것이다.
만약 삼각함수를 알지 못하는 사람이라면, 아마도 다항식을 가장 먼저 떠올릴 것이다. 아래 플롯은 1~9차 다항식을 순차적으로 적합해본 것이다. 노란색 선이 바로 추정된 다항식이다.
par(mfrow=c(3,3))
for(i in 1:9){
ply <- lm(f~poly(x,i))
new_data<-data.frame(x=x)
pred<-predict.lm(ply,newdata = new_data)
plot_name <- paste0(i,'-th degree polynomial fitting')
plot(x, f, main=plot_name)
lines(x, pred,col='yellow',lwd=3)
}
여기서 ‘Bias’, \(Bias := f-E(h(x)) \quad \Leftrightarrow \quad black point\; - \; yellow line\)와 ‘차수’ 사이의 관계를 파악할 수 있다. 말해볼 수 있겠는가? 바로 차수가 높아질수록 Bias가 작아진다는 것이다.
Variance는 어떻게 될까. Variance를 수치로도 구할 수 있지만, 관계의 의미를 더욱 잘 파악하기 위해 시각화를 하였다. Variance의 정의는 다음과 같다. \(Var := E[[h(x)-E(h(x))]^2]\)
우선 데이터 \(D\)에 대해 200개의 boostrap samples, \({D}_{1}, \;{D}_{2}, \;{D}_{3} .... \;{D}_{198}, \;{D}_{199}, \;{D}_{200}\)을 만들었다. 그리고 각각의 bootstrap sample에 대해 train train 데이터와 test 데이터를 8:2로 나누었다. 마지막으로 그 데이터들을 이용하여 1~9차 다항식에 대하여 200번의 적합과 200번의 예측을 하였다.
pred_degree<-list()
# 차수에 따른 예측값을 list의 형태로 저장
# 하나의 차수에 대하여 200개의 200개의 데이터 프레임이 있다.
for(i in 1:9){
pred_for_one_model<-list()
for(j in 1:200){
# Doing boostrap.
data <- data.frame(f=f, x=x)
test_idx <- sample(1:1001, size = 200, replace = FALSE)
train_data <- data[-test_idx, ]
test_data <- data[test_idx, ]
ply <- lm(f ~ poly(x,i), data = train_data)
pred_for_one_model[[j]]<-data.frame(x=test_data$x,
predict.lm(ply, newdata = test_data))
}
pred_degree[[i]] <- pred_for_one_model
}
그리고 1~9차 다항식에 각각 적합한 200개의 예측 데이터 셋트를 플롯으로 그려보았다. 노란색이 두터운 이유는 200개의 추정직선이 그려졌기 때문이다.
# Model variance plot
par(mfrow=c(3,3))
for(j in 1:9){
plot_name <- paste0(j,'-th degree polynomial')
plot(x,f,xlim=c(-10,10),ylim=c(-1.8, 1.8),main=plot_name)
for(i in 1:200){
lines(pred_degree[[j]][[i]][,1],pred_degree[[j]][[i]][,2],col='yellow')
}
}
위 플롯으로부터 다음의 사실을 알 수 있다. 1 -> 9차로 갈수록 노란색 선들이 두꺼운 밴드를 형성한다. 바로 이 사실이 Variance와 관련이 있다.
Variance가 작다는 것은 200개의 노란 선들이 대체로 비슷한 부근에 몰려있는 것을, 다시 말해 200개의 적합값들이 대체로 비슷하다는 것을 말한다. 반대로 Variance가 크다면 200개의 노란 선들은 흩뜨려져있을 것이다. 이는 200개의 적합값들이 비슷한 결과를 내지 못한다는 것을 말한다.
따라서 위 사실들로부터 다음과 같이 말할 수 있다.
1. Bias는 예측값이 실제값으로부터 얼마나 떨어져있는지를 말한다.
2. Variance는 여러 데이터에 대해 모델이 얼마나 일관성 있게 적합되는가를 말한다.
3. 차수가 올라갈수록 대체로 bias는 감소하고 Variance는 증가한다.
Bias and Variance trade-off (1) 끝. 다음편 계속