[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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 |