수식이 나오지 않는다면 새로고침(F5)을 해주세요
모바일은 수식이 나오지 않습니다.
이미 통계 학습 카테고리에서 소개한 방법이지만 Resampling의 파트에서도 자세히 소개해보고자 합니다.
아래에서 설명하는 내용은 모두 Train set를 이미 따로 둔 상태를 가정하고 설명하는 겁니다.
📌 Hold-out
Hold-out
방법의 경우 간단합니다. 보통 50:50을 사용하고 주어진 데이터를 랜덤하게 Train set, Validation set로 나눕니다.
with R
# Auto data의 mpg 사용.
library(ISLR)
set.seed(42)
data = Auto$mpg
dim(data.frame(data))
>> 392 1
# caret이용
library(caret)
train = createDataPartition(data, p=0.5)
dim(data.frame(train))
>> 198 1
10번 해보기
for (i in 1:10) {
set.seed(i) # 시드 변경하며 보기
train = createDataPartition(data,p=0.5, list=FALSE)
MSE = rep(0:10) # error 저장할 영벡터 길이 0
for (j in 1:10) {
fit = lm(mpg ~ poly(horsepower, j), data=Auto,
subset = train)
MSE[j] = mean((Auto$mpg[-train]-predict(fit, Auto[-train,]))^2)
}
if (i == 1) {
plot(MSE, ylab='MSE', xlab='다항회귀 차수')
} else {
lines(MSE, col=i)
}
}
다항 함수로 해본 예시 입니다. 2차항부터 대략 9차항까지 MSE의 차이가 없는 걸 보니 validaition set로 본 결과 2차항까지만 사용해서 test set으로 성능을 확인하면 될 것같네요.
📌 Leave-One-Out Cross-validation
LOOCV
. 이해하기 굉장히 쉽습니다. 데이터가 n개 있다고 할 때. n-1개를 랜덤으로 뽑아 train set를 만들고 나머지 1개를 validation set로 이용하는 것입니다. 단점이라면 데이터가 커질수록 Train, Test set로 split한 set가 많아진다는 거죠. 그만큼 컴퓨팅 자원이 많이 듭니다.
error 계산
$$
MSE_i = (y_i-\hat{y}_i)^2
$$
일때 leave one out cv를 사용한 test error는 아래와 같습니다.
$$
LOO_{e(n)} = \frac1n \sum^n_{i=1}MSE_i
$$
with R
똑같이 mpg를 이용합니다.
library(boot)
MSE = rep(0,10)
for (i in 1:10) {
fit = glm(mpg~poly(horsepower, i), data=Auto)
MSE[i]= cv.glm(Auto, fit)$delta[1] # LOOCV 수행 후 MSE 추출
plot(MSE, type='o', xlab='차수', col='blue')
}
📌 k-fold Cross-validation
k-fold
입니다. 위에서 LOOCV의 경우 데이터가 크면 클수록 컴퓨팅 자원이 많이 든다는 단점이 있었죠(실제로 데이터를 다루다보면 잘못씁니다..) 그래서 n개의 데이터에서 n-1개로 train set를 만드는게 아니라 원하는 개수의 fold로 만들어 나눕니다.
아래 그림은 4-fold 예시입니다.
error 계산
$$
Fold_{e(k)} = \frac1k \sum^k_{i=1}MSE_i
$$
with R
set.seed(15)
k =10
MSE_matrix = matrix(0, nrow=k, ncol=10)
folds <- sample(1:k, length(Auto$mpg), replace = T, prob=rep(1/k,k))
for (i in 1:k) {
for (j in 1:10) {
fit = lm(mpg~poly(horsepower,j), data = Auto[folds != i, ])
pred = predict(fit, newdata=Auto[folds == i,])
MSE_matrix[i,j] = mean((pred-Auto$mpg[folds == i])^2)
}
if (i == 1) {
plot(MSE, type = 'l', xlab='차수', ylab='MSE')
} else {
lines(MSE_matrix[i,], type = 'l', col=i)
}
}
그래프를 보시면 맨처음 Hold-out과 비슷하게 2차에서 비슷해지는 경향이 있습니다. 코드를 돌려보시면 아시겠지만 이게 seed값을 변경해줄 때마다 MSE 값 차이가 좀 있습니다. 그래서 정확히 보려면 시간이 걸리더라도 LOOCV가 좋을수도 있습니다.
'🌞 Statistics for AI > Resampling' 카테고리의 다른 글
부트스트랩(Bootstrap) 리샘플링(resampling) (0) | 2024.02.16 |
---|---|
잭나이프(Jackknife) 리샘플링(resampling) (0) | 2024.02.16 |
순열 검정 : Wilcoxon, Mann-Whitney (0) | 2024.02.16 |