수식이 나오지 않는다면 새로고침(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 |
이미 통계 학습 카테고리에서 소개한 방법이지만 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 계산
일때 leave one out cv를 사용한 test error는 아래와 같습니다.
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 계산
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 |