R에서 모델 성능을 교차 검증하는 방법
통계에서는 다음과 같은 두 가지 이유로 모델을 구축하는 경우가 많습니다.
- 하나 이상의 예측 변수와 반응 변수 간의 관계를 이해합니다.
- 모델을 사용하여 향후 관찰을 예측합니다.
교차 검증은 모델이 미래 관측치를 얼마나 잘 예측할 수 있는지 추정하는 데 유용합니다.
예를 들어 연령 과 소득을 예측 변수로 사용하고 기본 상태를 응답 변수로 사용하는 다중 선형 회귀 모델을 구축할 수 있습니다 . 이 경우 모델을 데이터 세트에 맞춘 다음 해당 모델을 사용하여 신규 신청자의 소득과 연령을 기반으로 대출 불이행 가능성을 예측할 수 있습니다.
모델에 강력한 예측 능력이 있는지 확인하려면 모델을 사용하여 이전에 본 적이 없는 데이터 에 대한 예측을 해야 합니다 . 이를 통해 모델의 예측 오류를 추정할 수 있습니다.
교차 검증을 사용하여 예측 오류 추정
교차 검증은 예측 오류를 추정할 수 있는 다양한 방법을 나타냅니다. 교차 검증 에 대한 일반적인 접근 방식은 다음과 같습니다.
1. 데이터 세트에서 특정 수의 관측치를 따로 보관합니다(일반적으로 모든 관측치의 15-25%).
2. 데이터세트에 보관된 관측값에 모델을 맞추거나 “훈련”합니다.
3. 모델을 훈련하는 데 사용하지 않은 관찰에 대해 모델이 얼마나 잘 예측할 수 있는지 테스트합니다.
모델 품질 측정
적합 모델을 사용하여 새로운 관측값에 대한 예측을 할 때 다음과 같은 여러 가지 측정항목을 사용하여 모델 품질을 측정할 수 있습니다.
다중 R-제곱: 예측 변수와 반응 변수 간의 선형 관계의 강도를 측정합니다 . R 제곱 배수 1은 완벽한 선형 관계를 나타내고, R 제곱 배수 0은 선형 관계가 없음을 나타냅니다. R 제곱 배수가 높을수록 예측 변수가 반응 변수를 예측할 가능성이 높아집니다.
RMSE(제곱평균제곱근 오차): 새 관찰 값 을 예측할 때 모델이 만든 평균 예측 오차를 측정합니다 . 이는 관측값의 실제 값과 모델에서 예측한 값 사이의 평균 거리입니다. RMSE 값이 낮을수록 모델 적합도가 더 우수함을 나타냅니다.
평균 절대 오차(MAE): 이는 관찰의 실제 값과 모델에서 예측한 값 사이의 평균 절대 차이입니다. 이 측정항목은 일반적으로 RMSE보다 이상값에 덜 민감합니다. MAE 값이 낮을수록 모델 적합도가 더 우수함을 나타냅니다.
R에서 네 가지 교차 검증 기술 구현
그런 다음 R에서 다음 교차 검증 기술을 구현하는 방법을 설명합니다.
1. 검증 세트 접근 방식
2. k-겹 교차 검증
3. 교차 검증은 제쳐두세요
4. 반복된 k-겹 교차 검증
이러한 다양한 기술을 사용하는 방법을 설명하기 위해 mtcars 내장 R 데이터 세트의 하위 집합을 사용합니다.
#define dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #view first six rows of new data head(data) # mpg disp hp drat #Mazda RX4 21.0 160 110 3.90 #Mazda RX4 Wag 21.0 160 110 3.90 #Datsun 710 22.8 108 93 3.85 #Hornet 4 Drive 21.4 258 110 3.08 #Hornet Sportabout 18.7 360 175 3.15 #Valiant 18.1 225 105 2.76
disp, hp 및 drat를 예측 변수로 사용하고 mpg를 응답 변수로 사용 하여 다중 선형 회귀 모델을 구축합니다 .
검증 세트 접근 방식
검증 세트 접근 방식은 다음과 같이 작동합니다.
1. 데이터를 두 세트로 나눕니다. 한 세트는 모델을 훈련하는 데 사용되고(예: 모델 매개변수 추정) 다른 세트는 모델을 테스트하는 데 사용됩니다. 일반적으로 훈련 세트 는 데이터의 70~80%를 무작위로 선택하여 생성하고 , 나머지 20~30%는 테스트 세트로 사용합니다.
2. 훈련 데이터 세트를 사용하여 모델을 생성합니다.
3. 모델을 사용하여 테스트 세트 데이터에 대해 예측합니다.
4. R-제곱, RMSE, MAE 등의 지표를 사용하여 모델 품질을 측정합니다.
예:
다음 예에서는 위에서 정의한 데이터 세트를 사용합니다. 먼저 데이터를 다음과 같이 나눕니다.
훈련 세트와 테스트 세트로 구성되며, 데이터의 80%를 훈련 세트로 사용하고 나머지 20%를 테스트 세트로 사용합니다. 다음으로 훈련 세트를 사용하여 모델을 구축합니다 . 그런 다음 모델을 사용하여 테스트 세트에 대해 예측합니다. 마지막으로 R-제곱, RMSE 및 MAE를 사용하여 모델 의 품질을 측정합니다 .
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #split the dataset into a training set (80%) and test set (20%). training_obs <- data$mpg %>% createDataPartition(p = 0.8, list = FALSE) train <- data[training_obs, ] test <- data[-training_obs, ] # Build the linear regression model on the training set model <- lm(mpg ~ ., data = train) # Use the model to make predictions on the test set predictions <- model %>% predict(test) #Examine R-squared, RMSE, and MAE of predictions data.frame(R_squared = R2(predictions, test$mpg), RMSE = RMSE(predictions, test$mpg), MAE = MAE(predictions, test$mpg)) #R_squared RMSE MAE #1 0.9213066 1.876038 1.66614
다양한 모델을 비교할 때 테스트 세트에서 가장 낮은 RMSE를 생성하는 모델이 선호되는 모델입니다.
이 접근법의 장점과 단점
검증 세트 접근 방식의 장점은 간단하고 계산적으로 효율적이라는 것입니다. 단점은 모델이 전체 데이터의 일부만을 사용하여 구축된다는 것입니다. 훈련 세트에서 제외된 데이터에 흥미롭거나 가치 있는 정보가 포함되어 있으면 모델은 이를 고려하지 않습니다.
k-겹 교차 검증 접근법
k-겹 교차 검증 접근 방식은 다음과 같이 작동합니다.
1. 데이터를 k개의 “접기” 또는 하위 집합(예: 5개 또는 10개의 하위 집합)으로 무작위로 나눕니다.
2. 하나의 하위 집합만 제외하고 모든 데이터에 대해 모델을 훈련합니다.
3. 모델을 사용하여 제외된 하위 집합의 데이터에 대해 예측합니다.
4. k개의 하위 집합 각각이 테스트 집합으로 사용될 때까지 이 과정을 반복합니다.
5 . k개의 테스트 오류를 평균하여 모델의 품질을 측정합니다. 이것은 알려져 있다
교차 검증 오류로.
예
이 예에서는 먼저 데이터를 5개의 하위 집합으로 나눕니다 . 그런 다음 데이터의 하위 집합을 제외한 모든 데이터를 사용하여 모델을 적합합니다. 그런 다음 모델을 사용하여 제외된 하위 집합에 대해 예측하고 테스트 오류를 기록합니다(R-제곱, RMSE 및 MAE 사용). 각 하위 집합이 테스트 세트로 사용될 때까지 이 프로세스를 반복합니다 . 그런 다음 간단히 5개 테스트 오류의 평균을 계산합니다 .
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets (or "folds") to use train_control <- trainControl(method = "cv", number = 5) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #Summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold) #Summary of sample sizes: 26, 25, 26, 25, 26 #Resampling results: # # RMSE Rsquared MAE #3.095501 0.7661981 2.467427 # #Tuning parameter 'intercept' was held constant at a value of TRUE
이 접근법의 장점과 단점
검증 세트 접근법에 비해 k-겹 교차 검증 접근법의 장점은 매번 다른 데이터 조각을 사용하여 모델을 여러 번 구축하므로 모델을 구축할 때 중요한 데이터를 생략할 가능성이 없다는 것 입니다.
이 접근 방식의 주관적인 부분은 k에 사용할 값, 즉 데이터를 나눌 하위 집합의 수를 선택하는 것입니다. 일반적으로 k 값이 낮을수록 편향은 높아지지만 변동성은 낮아지고, k 값이 높을수록 편향은 낮아지지만 변동성은 높아집니다.
실제로 k는 일반적으로 5 또는 10으로 선택됩니다. 왜냐하면 이 하위 집합의 수는 너무 많은 편향과 너무 많은 변동성을 동시에 방지하는 경향이 있기 때문입니다.
LOOCV(One Out Cross-Validation) 접근 방식 유지
LOOCV 접근 방식은 다음과 같이 작동합니다.
1. 데이터 세트에서 하나의 관측치를 제외한 모든 관측치를 사용하여 모델을 구축합니다.
2. 모델을 사용하여 누락된 관측값을 예측합니다. 이 예측을 테스트할 때 발생한 오류를 기록하세요.
3. 데이터 세트의 각 관찰에 대해 이 과정을 반복합니다.
4. 모든 예측 오류를 평균하여 모델의 품질을 측정합니다.
예
다음 예에서는 이전 예에서 사용된 것과 동일한 데이터세트에 대해 LOOCV 수행을 사용하는 방법을 보여줍니다.
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #specify that we want to use LOOCV train_control <- trainControl( method = "LOOCV" ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Leave-One-Out Cross-Validation #Summary of sample sizes: 31, 31, 31, 31, 31, 31, ... #Resampling results: # # RMSE Rsquared MAE #3.168763 0.7170704 2.503544 # #Tuning parameter 'intercept' was held constant at a value of TRUE
이 접근법의 장점과 단점
LOOCV의 장점은 모든 데이터 포인트를 사용하므로 일반적으로 잠재적인 편향이 줄어든다는 것입니다. 그러나 모델을 사용하여 각 관측값의 값을 예측하므로 예측 오류의 변동성이 커질 수 있습니다.
이 접근 방식의 또 다른 단점은 너무 많은 수의 모델에 적합해야 하므로 비효율적이고 계산이 무거워질 수 있다는 것입니다.
반복적인 k-겹 교차 검증 접근 방식
단순히 k-겹 교차 검증을 여러 번 수행함으로써 반복적인 k-겹 교차 검증을 수행할 수 있습니다. 최종 오류는 반복 횟수의 평균 오류입니다.
다음 예에서는 5겹 교차 검증을 4회 반복하여 수행합니다.
#load dplyr library used for data manipulation library(dplyr) #load caret library used for partitioning data into training and test set library(caret) #make this example reproducible set.seed(0) #define the dataset data <- mtcars[, c("mpg", "disp", "hp", "drat")] #define the number of subsets to use and number of times to repeat k-fold CV train_control <- trainControl(method = "repeatedcv", number = 5, repeats = 4 ) #train the model model <- train(mpg ~ ., data = data, method = "lm", trControl = train_control) #summarize the results print(model) #Linear Regression # #32 samples #3 predictor # #No pre-processing #Resampling: Cross-Validated (5 fold, repeated 4 times) #Summary of sample sizes: 26, 25, 26, 25, 26, 25, ... #Resampling results: # # RMSE Rsquared MAE #3.176339 0.7909337 2.559131 # #Tuning parameter 'intercept' was held constant at a value of TRUE
이 접근법의 장점과 단점
반복된 k-겹 교차 검증 접근 방식의 장점은 각 반복에 대해 데이터가 약간 다른 하위 집합으로 분할되어 모델의 예측 오류에 대한 훨씬 더 편견 없는 추정치를 제공해야 한다는 것입니다. 이 접근 방식의 단점은 모델 피팅 프로세스를 여러 번 반복해야 하기 때문에 계산 집약적일 수 있다는 것입니다.
교차 검증에서 접기 수를 선택하는 방법
교차 검증의 가장 주관적인 부분은 사용할 접기(즉, 하위 집합) 수를 결정하는 것입니다. 일반적으로 접기 수가 작을수록 오류 추정이 더 편향되지만 변수는 줄어듭니다. 반대로, 접기 수가 많을수록 오류 추정의 편향이 줄어들지만 변수는 더 많아집니다.
계산 시간을 염두에 두는 것도 중요합니다. 접을 때마다 새로운 패턴을 훈련해야 하며, 이는 느린 과정이지만 접기 횟수를 많이 선택하면 시간이 오래 걸릴 수 있습니다.
실제로 교차 검증은 일반적으로 5 또는 10겹으로 수행됩니다. 이는 가변성과 편향 사이의 균형을 잘 유지하는 동시에 계산 효율성도 높기 때문입니다.
교차 검증을 수행한 후 모델을 선택하는 방법
교차 검증은 모델의 예측 오류를 평가하는 데 사용됩니다. 이를 통해 예측 오류(RMSE, R-제곱 등을 기반으로 함)가 가장 낮은 모델을 강조 표시하여 두 개 이상의 서로 다른 모델 중에서 선택하는 데 도움이 될 수 있습니다.
최상의 모델을 선택하기 위해 교차 검증을 사용한 후에는 사용 가능한 모든 데이터를 사용하여 선택한 모델에 적합합니다. 최종 모델에 대한 교차 검증 중에 훈련한 실제 모델 인스턴스를 사용하지 않습니다.
예를 들어, 5겹 교차 검증을 사용하여 서로 다른 두 회귀 모델 사이에서 어떤 모델을 사용하는 것이 더 나은지 결정할 수 있습니다. 그러나 어떤 모델을 사용하는 것이 가장 좋은지 확인한 후에는 모든 데이터를 사용하여 최종 모델에 적합합니다. 즉, 최종 모델을 만들 때 접는 부분을 하나도 잊지 않습니다.