본문 바로가기
public void static main/AI

[DataModeling] 검증(Validation)과 데이터 분할(Data Split)

by 햄리뮤 2025. 1. 27.
반응형

앞에서 다뤘지만 조금더 자세히 공부해보았다.

https://businessanalystmentor.com/data-modelling-for-business-analysts-training/

검증(Validation)

검증은 우리가 만든 모델의 성능이 얼마나 좋은지 평가하는 과정이다.

검증을 통해 모델이 데이터를 얼마나 잘 이해했는지 확인할 수 있다.

그렇다면 왜 중요할까?

  • 분류의 정확도: 분류 문제(예: 스팸 메일 여부)에서 모델이 얼마나 올바르게 분류하는지 확인한다.
  • 예측의 정확성: 예측 문제(예 내일의 주가)를 얼마나 정확히 맞추는지 평가한다.
  • 결과의 신뢰성: 모델이 새로운 데이터에서도 일관되고 신뢰할 만한 결과를 제공하는지 확인한다.

왜 훈련 데이터만 사용하며 안될까?

훈련 데이터만 사용해서 모델을 평가하면 실제 성능보다 과대 평가될 가능성이 높다.

  1. 훈련 데이터에는 두 가지 패턴이 포함됨
    • 실제 효과(실제 관계): 데이터에 존재하는 진짜 규칙과 패턴.
    • 무작위 효과(우연의 패턴): 데이터가 우연히 나타낸 특징으로, 본질적인 관계가 아님.
  2. 모델은 두 가지를 모두 학습함 (훈련 데이터로 모델을 학습시켰다고 가정하자)
    • 실제 패턴은 새로운 데이터에서도 유용할 수 있다.
    • 무작위 패턴은 새로운 데이터에 적용되지 않으므로, 쓸모없는 정보까지 학습한 셈이다.
  3. 훈련 데이터로만 성능 평가 시 낙관적인 결과가 나옴
    • 훈련 데이터 자체에서 성능을 평가하면, 모델이 외운 무작위 패턴까지 포함되어 성능이 매우 좋아 보일 수 있다. 실제로는 새로운 데이터를 잘 처리하지 못하는 경우가 많다.

해결 방법: 데이터 나누기

  1. 훈련 데이터(Training Set)
    • 역할: 모델 학습에 사용된다.
    • 설명: 주어진 데이터를 기반으로 모델이 패턴과 관계를 학습한다.
    • 예시: 어떤 변수와 결과가 관련이 있는가? 를 학습
  2. 검증 데이터(Validation Set)
    • 역할: 모델 성능을 평가하고 파이퍼파라미터를 튜닝하는 데 사용, 여러 모델중에서 최적의 모델을 선택하거나, 하이퍼파라미터를 조정하기 위해 사용 된다.
    • 설명: 훈련된 모델이 새로운 데이터에서도 잘 작동하는지 평가 한다.
    • 예시: 모델 A와 모델 B중 어느 것이 더 좋은가? 를 판단 한다.
  3. 테스트 데이터(Test Set): 최종적으로 모델 성능을 확인하는 데 사용.
    • 역할: 모델의 최종 성능을 독립적으로 평가 한다.
    • 설명: 학습이나 검증 과정에서 사용되지 않은 데이터를 통해 일반화 성능을 확인 한다.
    • 예시: 이 모델이 새로운 환경에서도 잘 작동할까? 를 테스트 한다.

데이터 분할 방법(Data Split)

데이터 분할은 모델 평가의 핵심 과정으로, 데이터를 나누는 방식에 따라 분석의 신뢰성과 정확성이 결정된다.

  1. 두 세트로 분할 (단일 모델 사용 시): 단일 모델의 성능을 평가할 때 자주 사용하는 방식이다.
    • 훈련 세트(Training Set): 데이터의 70 ~ 90%를 사용하여 모델을 학습시킨다.
    • 테스트 세트(Test Set): 나머지 10 ~ 30% 데이터를 사용하여 최종적으로 모델의 성능을 평가 한다.
    • 예시: 이 방식은 단일 모델을 훈련시킬 때 간단하고 효과적이다. 하이퍼파라미터 튜닝 등 추가 검증 작업이 필요할 때는 한계가 있을 수 있다.
  2. 세 세트로 분할(여러 모델 비교 시): 여러 모델을 비교하거나 하이퍼 파라미터 튜닝을 위해 사용하는 방법이다.
    • 훈련 세트(Training Set): 데이터의 50 ~ 70%를 사용하여 모델을 학습시킨다.
    • 검증 세트(Validation Set): 데이터의 15 ~ 25%를 사용하여 최종적으로 가장 좋은 모델의 성능을 확인한다.
    • 테스트 세트(Test Set): 데이터의 15 ~ 25%를 사용하여 최종적으로 가장 좋은 모델의 성능을 확인한다.
    • 예시: 여러 모델의 성능을 평가하고 가장 적합한 모델을 선택할 때 유용하다.

왜 세개의 세트가 필요할까?

  1. 단일 모델 비교(Training + Test)
    • 훈련 데이터와 테스트 데이터만 사용할 경우, 모델이 훈련 데이터에 과적합(overfitting)될 가능성이 있다.
    • 테스트 데이터만으로 하이퍼파라미터를 조정하면 테스트 데이터에 과적합이 발생할 수 있다.
  2. 다중 모델 비교(Training + Validation + Test)
    • 여러 모델을 비교하거나 하이퍼파라미터를 조정할 때 Validation Set이 필요하다.
    • Validation Set은 테스트 데이터와 독립적이므로, 최적 모델 선택 과정에서 편향을 줄이는 역할을 한다.
  3. Validation 성능이 불확실성
    • Validation 성능은 운에 의해 과대평가될 수 있다.
    • 최종 평가 단계에서 독립적인 Test Set을 활용해야만 모델의 진정한 성능을 확인할 수 있다.

https://www.kdnuggets.com/2020/02/practical-hyperparameter-optimization.html

 

⚠️하이퍼파라미터(Hyperparameter)란?
하이퍼파라미터는 모델 학습 과정에서 사용자가 직접 설정해야 하는 값이다.
이 값들은 모델의 학습 방식이나 구조를 제어하고, 최적의 성능을 내기 위해 매우 중요한 역할을 한다.
특징
- 모델 외부에서 설정: 데이터로부터 자동으로 학습되지 않고, 사람이 직접 설정하거나 최적화 과정에서 결정 한다.
- 학습 과정에 영향을 줌: 학습 속도, 모델 복잡성, 오버피팅 방지 등 여러 측면에서 영향을 미친다.
- 모델마다 다름: 머신러닝 알고리즘마다 사용되는 하이퍼파라미터가 다르다.

검증 프로세스 흐름

  1. Training Data -> Model Building (모델 학습)
    • 훈련 데이터를 사용하여 모델이 데이터를 학습한다.
    • 학습 결과로 가중치 또는 규칙을 생성 한다.
  2. Validation Data  -> Model Selection (모델 선택)
    • 검증 데이터를 사용하여 여러 모델을 평가하고 최적의 모델을 선택한다.
    • 이 과정에서 하이퍼파라미터를 조정할 수 있다.
  3. Test Data -> Final Performance Evaluation(최종 성능 평가)
    • 테스트 데이터를 사용하여 모델의 일반화 성능을 독립적으로 평가 한다.
    • 이 데이터를 통해 모델이 실전에서 얼마나 잘 작동할지를 확인한다.

데이터 분할 방식

  1. 무작위 분할(Random Split)
    • 설명: 데이터를 무작위로 나누어 Training, Validation, Test 세트를 만든다.
    • 장점: 간단하고 빠르며, 편향 없이 다양한 데이터 포인트를 포함할 가능성이 높다.
    • 단점: 클래스가 불균형한 경우, 세트 간 데이터 분포가 달라질 수 있다.
  2. 순환 분할(Rotation Split)
    • 설명: 데이터를 체계적으로 나누어 Training, Validation, Test 세트를 구성한다.
    • 장점: 데이터 분포를 일정하게 유지할 수 있다.
    • 단점: 특정 규칙에 따라 분할되기 때문에 데이터의 편향이 생길 가능성이 있다.

무작위 분할

# install.packages("caret")
library(caret)

set.seed(123)
data <- iris

# 무작위로 데이터 분할 (훈련 70%, 테스트 30%)
trainIndex <- createDataPartition(data$Species, p = 0.7, list = FALSE)
trainData <- data[trainIndex, ]
testData <- data[-trainIndex, ]

# 결과 확인
cat("훈련 데이터 크기:", nrow(trainData), "\n")
cat("테스트 데이터 크기:", nrow(testData), "\n")

결과

> # 결과 확인
> cat("훈련 데이터 크기:", nrow(trainData), "\n")
훈련 데이터 크기: 105 
> cat("테스트 데이터 크기:", nrow(testData), "\n")
테스트 데이터 크기: 45

순환 분할

set.seed(123)
data <- iris

# 데이터 순서를 기준으로 3개 세트로 나누기 (훈련, 검증, 테스트)
data$Index <- seq(1, nrow(data))
trainData <- data[data$Index %% 3 == 1, ]
validationData <- data[data$Index %% 3 == 2, ]
testData <- data[data$Index %% 3 == 0, ]

# 결과 확인
cat("훈련 데이터 크기:", nrow(trainData), "\n")
cat("검증 데이터 크기:", nrow(validationData), "\n")
cat("테스트 데이터 크기:", nrow(testData), "\n")

결과

> # 결과 확인
> cat("훈련 데이터 크기:", nrow(trainData), "\n")
훈련 데이터 크기: 50 
> cat("검증 데이터 크기:", nrow(validationData), "\n")
검증 데이터 크기: 50 
> cat("테스트 데이터 크기:", nrow(testData), "\n")
테스트 데이터 크기: 50

분할 시 고려사항

  1. 시간적 패턴 유지
    • 시계열 데이터의 경우, 미래 데이터로 과거를 예측하기 위해 시간 순서를 유지해야 한다.
    • 예: 주식가격 예측, 날씨 예측
  2. 데이터 균형 유지
    • 각 세트에서 클래스 간 데이터의 비율이 동일하게 유지되어야 한다.
    • 데이터가 불균형하면 모델이 특정 클래스를 더 잘 예측하게 되어 성능 평가가 왜곡 된다.
  3. 대표성 확보
    • 각 세트가 전체 데이터의 특성을 잘 대표해야 한다.
    • 너무 작은 데이터 세트를 사용하면 평가 결과의 신뢰성이 낮아질 수 있다.

 

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글