본문 바로가기
TIL _Today I Learned/2024.08

[DAY 32] 머신러닝 모델의 검증

by gamdong2 2024. 8. 27.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.08.27

📕 학습 목록

  • 머신러닝 모델의 검증
  • 머신러닝 모델의 성능 지표(정확도의 한계)
  • 과적합 및 과소적합의 문제
  • 모델의 학습 과정에서 이상 현상을 확인하는 법

 

📗 기억할 내용

1. 머신러닝 모델의 검증

  • 목적: 모델의 성능 평가 및 개선

 
1) 머신러닝 모델 평가지표

① 회귀모델에 대한 평가지표
y(실제값, target value), y^(모델이 예측한 값, predicted value)

  회귀모델 평가 지표 
MAE
(Mean Absolute Error)
MSE
(Mean Squared Error)
RMSE
(Root Mean Squared Error)
개념 예측값과 실제값의
차이("오차")의 절대값 평균
오차를 제곱하여 평균 MSE의 제곱근
계산식
장점 직관적이고 이해하기 쉬움 - MAE의 단점을 보완
- 오차가 클수록 더 큰 영향을 주어, 큰 오차를 더 중요하게 평가
MSE의 단점을 보완하기 위해 MSE의 제곱근을 취한 지표
단점 오차의 크기를 동일하게 처리하기 때문에, 큰 오차가 발생해도 그 중요성이 충분히 반영되지 않을 수 있음 오차가 제곱되기 때문에 큰 오차가 너무 과장될 수 있음 이상치(outlier)에 매우 민감하므로, 이상치를 제거한 후 사용해야 함

 

② 분류모델에 대한 평가지표

  •  Confusion Matrix(혼동 행렬) : 모델이 얼마나 정확하게 분류했는지 시각적으로 보여줌
  실제
Positive Negative
예측 Positive TP FP
Negative FN TN
[구성]
- True Positive (TP)
- True Negative (TN)
- False Positive (FP)
- False Negative (FN)

* 대각선(TP, TN) : 모델이 맞춘 정답 개수
  •  Confusion Matrix 활용
  분류 모델 평가 지표(Confusion Matrix 활용)
Accuracy
(정확도)
Precision
(정밀도)
Recall
(재현율)
Specificity (특이도) F1 Score Error Rate (에러율) Fallout
(위양성률)
모델의
올바른
예측 비율
Positive로
예측한 것 중 실제 Positive 비율
실제 Positive 중 정확히
예측한 비율
실제
Negative 중 정확히
Negative로 예측한 비율
Precision과 Recall의
조화 평균
모델의 틀린 예측 비율 실제
Negative 중 Positive로
잘못 예측한 비
본질 의미 전체 예측 중에서 얼마나 많은 예측이 맞았는지 얼마나 정확하게 Positive를 예측했는지 실제로 Positive인 경우를 얼마나 잘 포착했는지 Negative를 정확하게 예측했는지 Precision과 Recall 간의 균형을 평가 - Accuracy와 상호보완적
- 이 값이 낮을수록 모델의 예측이 정확함을 의미
특이도(Specificity)와 상호보완적
계산식
활용 사 전체적인 모델 성능 평가에 사용, 데이터가 균형 잡힌 경우 유용 - 잘못된 Positive 예측이 중요한 경우
- 예: 스팸 필터링
- Positive 사례를 놓치지 않는 것이 중요한 경우
- 예: 질병 진단
Negative 사례를 정확히 예측하는 것이 중요한 경우에 사용 - 정밀도와 재현율 간의 균형을 평가하는 데 사용 - 한쪽으로 치우친 데이터에서 유용 모델이 전체적으로 얼마나 잘못된 예측을 하고 있는지 파악 특정 모델이 얼마나 잘 Negative 클래스를 구별하는지 평가할 때 사용

 

③ 추천시스템에 대한 평가지표

  추천시스템 평가 지표 
Precision@k Recall@k Hit Rate
(Hit@k)
Average
Prediction
AP@k
(Average
Precision at k)
MRR
(Mean
Reciprocal
Rank)
개념 상위 k번 추천에서 실제 선호하는 아이템의 비율 전체 선호하는 아이템 중 k번 추천된 아이템 비율 k번 추천된 아이템 중 적어도 하나의 선호 아이템 포함 여부 추천된 예측값의 평균 상위 k개의 추천 리스트에서 각 위치의 Precision 평균 추천된 아이템 목록에서 첫 번째 선호 아이템의 순위 기반 평가
계산식
장점 사용자가 선호하는 아이템을 얼마나 정확하게 추천하는지 평가할 수 있음 전체 선호 아이템 중 중요한 아이템을 놓치지 않는지를 평가할 수 있음 추천 리스트가 최소한 하나의 선호 아이템을 포함하고 있는지 확인 가능 추천 시스템이 얼마나 일관되게 좋은 예측을 제공하는지 평가 가능 추천된 아이템의 순서까지 고려하여 정확도를 평가할 수 있음 사용자가 선호하는 첫 번째 아이템의 순위를 고려하여 추천 성능을 평가 가능
단점 k의 값에 따라 성능 평가가 달라질 수 있으며, 아이템의 순서를 고려하지 않음 k의 값에 민감하며, 순위나 정확도를 동시에 평가하지 않음 단순히 아이템의 존재 여부만 평가하므로 세밀한 추천 성능 평가에는 한계가 있음 평균 예측값만을 고려하므로, 개별 아이템의 순위나 정확도 반영 부족 아이템의 순위에 따른 정확도를 평가하지만, 전체적인 맥락을 반영하지 않음 첫 번째 선호 아이템의 순위만을 고려하므로, 나머지 아이템들의 기여도 반영 부족

 
2) 모델의 과적합/과소적합 평가

① 과적합/과소적합 징후

  • 과적합 징후
- 훈련 Loss ↓,  검증 Loss ↑
- 훈련 정확도 ↑, 검증 정확도 ↓
  • 과소적합 징후
- 훈련/검증 Loss/정확도 모두 낮은 수준에서 변동 적음
[TIP] Error vs Loss?
- 손실(Loss) : 모델의 예측 오류를 수치화한 값으로, 모델 학습의 핵심 지표
- 에러(Error) : 손실의 결과를 바탕으로 모델의 성능을 평가하는 데 사용

ex1 : MSE (Mean Squared Error) :
ex2 : Cross-Entropy Loss : 

 
② 과적합 발생 원인

  • 훈련 데이터의 크기가 적을 때: 모델이 특정 패턴을 과도하게 학습
  • 특정 클래스가 적거나 없을 때: 특정 클래스에 대한 과도한 학습
  • 피처의 관련성 부족: 불필요한 정보 학습
  • 모델의 복잡도가 지나칠 때: 노이즈까지 학습
  • 데이터셋의 편향성: 새로운 데이터 예측 성능 저하

과적합/과소적합 평가 지표

평가 지표 설명 파이썬 패키지*/함수**
훈련 손실
Training Loss
훈련 데이터에 대한 모델의 손실을 측정 *Keras
**history.history['loss']
검증 손실
Validation Loss
검증 데이터에 대한 모델의 손실을 측정 *Keras
**history.history['val_loss']
훈련 정확도
Training Accuracy
훈련 데이터에 대한 모델의 정확도를 측정 *Keras
**model.score()
**history.history['accuracy']
검증 정확도
Validation Accuracy
검증 데이터에 대한 모델의 정확도를 측정 *Keras
**model.score()
**history.history['val_accuracy']
학습 곡선
Learning Curve
학습 데이터 크기에 따른 모델 성능 변화를 시각화 *Scikit-learn
**learning_curve
검증 곡선
Validation Curve
하이퍼파라미터 값에 따른 모델 성능 변화를 시각화
*하이퍼파라미터 : 모델의 성능에 영향을 미칠 수 있는 요소 (ex: 결정 트리‘s 깊이, 신경망‘s 학습률,...)
*Scikit-learn
**validation_curve
잔차 플롯
Residual Plot
실제 값과 예측 값의 차이를 시각화하여 모델의
적합성을 평가
*Seaborn
**residplot
# [과적합/과소적합 평가를 위한 파이썬 함수/패키지 사용 예]

# 1.Training Loss "Keras"
loss = model.evaluate(X_train, y_train)

# 2.Validation Loss "Keras"
val_loss = model.evaluate(X_val, y_val)

# 3.Training Accuracy "Keras"
accuracy = model.evaluate(X_train, y_train)

# 4.Validation Accuracy "Keras"
val_accuracy = model.evaluate(X_val, y_val)

# 5.Learning Curve "Scikit-learn"
train_sizes, train_scores, val_scores = learning_curve(model, X, y)

# 6.Validation Curve "Scikit-learn"
train_scores, val_scores = validation_curve(model, X, y, param_name='C', param_range=param_range)

# 7.Residual Plot "Seaborn"
sns.residplot(x=y_test, y=predictions)

 
④ 과적합 방지 방법

과적합 방지법 설명 목적 및 특징
조기 종료
Early Stopping
검증 성능이 개선되지 않으면 학습을 중단하여 과적합을 방지 - 학습 시간을 단축
학습률 조정
Learning Rate Adjustment
학습률을 조정하여 과적합을 방지하고 최적의 가중치를 찾음 - 적절한 학습률 설정으로 모델 성능 최적화
규제 기법
Regularization
라쏘(Lasso), 릿지(Ridge) 회귀와 같은 규제 기법을 사용하여 과적합을 방지 - 모델의 복잡도를 제어
- 불필요한 피처의 가중치 감소 또는 제거
데이터 증강
Data Augmentation
훈련 데이터를 변형하거나 증강하여 데이터의 다양성을 확보 - 데이터 부족 문제 해결
앙상블 방법
Ensemble Methods
여러 개의 학습기를 결합하여 예측 성능을 향상하고 과적합을 방지 - 모델의 안정성 향상
프루닝
Pruning
중요하지 않은 기능이나 파라미터를 제거하여 모델을 간소화
* 결정 트리와 같은 모델에서 사용되는 기법으로, 모델이 복잡해지는 것을 방지하기 위해 불필요하거나 덜 중요한 노드(branches)를 제거
- 모델의 복잡도 감소
교차 검증
Cross-Validation
데이터를 여러 폴드로 나누어 각각의 폴드를 검증 데이터로 사용하여 평가 - 모델이 특정 데이터셋에 과도하게 맞추지 않도록 함
- 모델의 일반화 성능 향상
피처 엔지니어링
Feature Engineering
불필요한 피처 제거, 중요한 피처 선택, 파생 피처 생성 등을 통해 모델 성능 최적화 - 모델의 복잡도 감소
- 데이터의 품질 향상
    • 교차 검증 (Cross-Validation)
교차 검증 기법 데이터 분할 방식 클래스 비율
유지
특징
KFold 데이터를 K개의 폴드로 무작위로 나눔 X - 각 폴드의 데이터 분포가 무작위로 결정됨
- 클래스 불균형 가능성 있음
StratifiedKFold 데이터를 K개의 폴드로 나누되,
각 폴드에서 클래스 비율을 유지
O - 클래스 비율을 유지하며 데이터를 나누므로 불균형 클래스 문제를 해결할 수 있음
ShuffleSplit 전체 데이터셋을 무작위로 섞고,
지정된 비율로 트레이닝/테스트 세트 분할
X - 각 반복에서 테스트 세트와 트레이닝 세트의 비율이 일정하게 유지되며 무작위로 샘플링
- 여러 번 반복 가능

 

[TIP] KFold

- 기본 개념 : KFold는 데이터를 K개의 폴드로 나눈 후, 각 폴드를 테스트 세트로 사용하고 나머지 폴드들을 트레이닝 세트로 사용하는 방식. 이 과정을 K번 반복하여 모델의 성능을 평가
- 특징 : 데이터를 무작위로 분할하므로, 클래스나 그룹의 비율을 고려하지 않음. 따라서, 불균형한 데이터셋에서는 특정 클래스가 한 폴드에 치우칠 수 있음
- 사용 사례 : 데이터셋이 비교적 균형 잡혀 있고, 클래스 간 비율이 크게 중요하지 않은 경우에 일반적으로 사용
[TIP] StratifiedKFold

- 기본 개념 : StratifiedKFold는 KFold와 유사하지만, 각 폴드가 전체 데이터셋의 클래스 분포를 반영하도록 분할함. 이를 통해 각 폴드 내에서도 클래스의 비율이 전체와 유사하게 유지됨
- 특징 : 데이터셋이 불균형할 때 유용하며, 모델이 모든 클래스에 대해 고르게 학습할 수 있도록 함. 이는 특히 클래스 간의 비율이 중요한 문제에서 유용함
- 사용 사례 : 클래스 불균형 문제가 있는 데이터셋에서 모델 성능을 평가하거나, 각 클래스가 고르게 분포되도록 하고자 할 때 사용
[TIP] ShuffleSplit

- 기본 개념 : ShuffleSplit은 데이터셋을 무작위로 섞은 후, 학습 데이터와 검증 데이터를 여러 번 반복해서 나누는 방식. 각 분할에서 데이터가 임의로 섞여 학습 셋과 검증 셋이 구성되며, 이를 통해 모델의 성능을 여러 번 평가할 수 있음
- 특징 : 데이터를 무작위로 분할하기 때문에 데이터셋의 특정 순서나 패턴에 의존하지 않고 모델을 평가할 수 있음. 또한, 각 분할에서 학습 셋과 검증 셋의 크기를 유연하게 설정할 수 있어, 데이터셋의 크기나 분포에 따라 적절하게 조정할 수 있음
- 사용 사례 : 데이터셋이 작거나 특정한 분포가 없는 경우에 모델 성능을 평가할 때 사용. 또한, 모델이 특정 데이터 패턴에 과적합되는 것을 방지하고자 할 때, ShuffleSplit을 통해 데이터의 다양한 샘플링을 활용하여 보다 일반화된 성능을 평가
  • 피처 엔지니어링 (Feature Engineering)
기법 설명 목적 및 특징
불필요한 피처 제거 중요하지 않거나 관련 없는 피처를 제거하여 모델의 복잡도를 줄임 - 과적합 방지
- 모델의 해석 가능성 향상
중요한 피처 선택 피처 중요도 평가를 통해 모델 성능에 중요한 피처만 선택 - 모델의 성능 향상
- 불필요한 피처로 인한 노이즈 감소
파생 피처 생성 원본 데이터를 변형하여 새로운 유의미한 피처를 생성 - 모델의 학습 능력 향상
- 도메인 지식을 활용한 피처 추가

*  프루닝은 모델 내부의 구조를 단순화하는 과정이라면, 피처 제거는 데이터셋 자체를 간소화하는 과정

 

📙 내일 일정

  • xAI 학습

 
 

 

 

 

'TIL _Today I Learned > 2024.08' 카테고리의 다른 글

[DAY 34] Machine Learning 심화  (0) 2024.08.29
[DAY 33] xAI  (0) 2024.08.28
[DAY 31] Machine Learning 실습  (0) 2024.08.26
[DAY 30] 추천 시스템, 최적화  (1) 2024.08.23
[DAY 29] Machine Learning 실습  (0) 2024.08.22