1. 오버피팅(overfitting)
1.1 오버피팅
오버피팅이란 머신러닝에서 모델이 훈련 데이터에 지나치게 잘 맞춰져 있어, 새로운 또는 보이지 않는 데이터에 대해 일반화 하는 능력이 떨어지는 현상을 말합니다.
즉, 모델이 훈련 데이터의 패턴뿐만 아니라 노이즈까지 학습해버려, 실제 세계의 복잡성과 변동성을 반영하는데 실패하는 상태입니다.
오버피팅은 머신러닝 모델의 성능을 저하시키는 주요 원인 중 하나이며, 모델이 너무 복잡하거나 훈련데이터가 너무 적을때 자주 발생합니다.
1.2 오버피팅의 발생 원인
1) 모델의 복잡도가 너무 높은 경우
모델의 복잡도는 모델이 가질 수 있는 학습능력의 정도를 의미합니다.
복잡도가 높은 모델은 많은 수의 파라미터를 가지며, 더 복잡한 패턴을 학습할 수 있습니다.
그러나 이러한 모델은 훈련 데이터에 있는 미묘한 패턴과 잡음까지 학습할 위험이 있습니다.
결과적으로 이러한 모델은 훈련데이터에는 높은 정확도를 보이지만, 새로운 데이터에는 잘 일반화하지 못하는 오버피팅이 발생할 수 있습니다.
2) 훈련데이터의 양이 충분하지 않은 경우
훈련데이터의 양이 충분하지 않을 때, 모델은 제한된 데이터에서 패턴을 학습하게 됩니다.
이 경우 모델은 사용 가능한 소수의 데이터 포인트에 과도하게 의존하여 학습하며, 이러한 데이터 포인트가 전체 데이터 분포를 대표하지 않을 수 있습니다.
이는 모델이 일반화하는 능력을 저하시키고, 새로운 데이터에 대한 성능이 떨어지게 만듭니다.
3) 데이터에 잡음이 많은 경우
데이터에 잡음이 많은 경우 모델은 유용한 정보와 잡음을 구분하지 못하고 둘 다를 학습할 수 있습니다.
이는 특히 데이터가 복잡하고, 모델이 데이터의 무작위 변동성을 실제 패턴으로 잘못 인식할 때 발생합니다.
4) 모델이 훈련 데이터의 특정 패턴을 지나치게 학습하는 경우
모델이 훈련 데이터의 특정 패턴이나 특징에 지나치게 의존하는 경우, 이는 오버피팅의 또 다른 형태입니다.
이는 특히 훈련 데이터가 한정적이거나, 특정 그룹이나 카테고리에 편향되어 있을때 발생할 수 있습니다.
이러한 경우, 모델은 전체 데이터 분포를 대표하는 일반적인 패턴을 학습하기 보다는, 훈련 데이터 내의 소수의 특징에 과도하게 최적화됩니다.
2. 교차검증
교차검증 방식은 오버피팅을 예방하는 좋은 방법입니다.
다양한 유형의 교차검증 방법이 있지만, 가장 일반적인 방법은 K-겹 교차검증(K-Fold Cross-Validation)입니다.
2.1 K-겹 교차검증(K-Fold Cross-Validation)
데이터를 K개의 동일한 크기의 부분집합(Fold)으로 나눠, 한번씩 돌아가면서 검증데이터로 사용합니다.
2.2 K-겹 교차검증 방법
1) 테스트 데이터 분할: 전체 데이터 세트에서 일정 비율을 테스트 데이터로 분리해놓습니다.
2) 남은 데이터 세트를 K개의 동일한 크기를 갖는 폴드로 나눕니다. K는 하이퍼파라미터로, 일반적인 선택은 5 또는 10입니다.
3) 모델 훈련 및 검증 : 아래의 과정을 K번 반복합니다.
- K개의 폴드 중 하나를 검증 데이터 세트로 선택합니다.
- 남은 K-1개의 폴드를 결합하여 훈련 데이터 세트를 형성합니다.
- 모델을 훈련 데이터 세트에 훈련시킵니다.
- 적합된 모델을 검증데이터 세트에 적용하여 성능을 평가합니다.
2.3 K-겹 교차검증의 장점
1) 데이터 활용 극대화
테스트를 제외한 전체 데이터세트를 훈련과 검증에 모두 사용함으로써, 제한된 양의 데이터를 최대한 활용할 수 있습니다.
2) 모델의 일반화 능력 평가
다양한 훈련과 검증 세트 조합을 사용하여 모델을 평가함으로써, 모델의 일반화 능력에 대한 보다 신뢰할 수 있는 추정치를 얻을 수 있습니다.
3) 오비피팅 감소
모델이 다양한 훈련 세트에 대해 일관된 성능을 보여야 하므로, 특정 훈련 세트에 과적합되는 것을 방지할 수 있습니다.
4) 하이퍼파라미터 튜닝의 용이성
다양한 하이퍼파라미터 설정에 대해 K-겹 교차검증을 반복적으로 수행함으로써, 최적의 모델 구성을 찾는 데 도움이 됩니다.
3. K-겹 교차검증 코드
3-1) 데이터셋 로드
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import numpy as np
# iris 데이터셋 로드
iris = load_iris()
X, y = iris.data, iris.target
# KFold 분할기 인스턴스 생성 (5-겹 교차 검증)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
3-2) KFold클래스와 랜덤 포레스트 모델을 활용해 모델 학습
# 정확도 점수를 저장할 리스트
accuracy_scores = []
# KFold로 데이터를 분할
for train_index, test_index in kf.split(X):
# 분할된 훈련 및 테스트 데이터 생성
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# 모델 생성 및 훈련
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# 예측 및 정확도 계산
predictions = model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
# 정확도 점수를 리스트에 추가
accuracy_scores.append(accuracy)
# 각 폴드에서의 정확도 출력
print("각 폴드에서의 정확도:", accuracy_scores)
# 평균 정확도 계산 및 출력
print("평균 정확도:", np.mean(accuracy_scores))
각 폴드에서의 정확도: [1.0, 0.9666666666666667, 0.9333333333333333, 0.9333333333333333, 0.9666666666666667]
평균 정확도: 0.9600000000000002
3-3) 사이킷런의 cross_val_score 메소드를 사용하여 교차검증
# iris 데이터셋 로드
X, y = iris.data, iris.target
# 모델 초기화
model = RandomForestClassifier()
from sklearn.model_selection import cross_val_score
# 교차 검증 실행
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
# 결과 출력
print("교차 검증 정확도 점수:", scores)
print("평균 정확도:", scores.mean())
교차 검증 정확도 점수: [0.96666667 0.96666667 0.93333333 0.93333333 1. ]
평균 정확도: 0.96
'머신러닝 > 머신러닝: 심화 내용' 카테고리의 다른 글
피처 생성(Feature Generation) 1 : Binning 기법 (0) | 2024.12.23 |
---|---|
분류 모델 하이퍼파라미터 튜닝 (0) | 2024.12.22 |
회귀 모델 하이퍼파라미터 튜닝 (0) | 2024.12.20 |
차원 축소 기법 : LDA (1) | 2024.12.18 |
차원 축소 기법 : PCA (1) | 2024.12.17 |