1. 홀드아웃 방법
홀드아웃 방법은 데이터를 두 개 또는 세 개의 세트로 나누어 모델의 성능을 검증합니다:
- 훈련 세트: 모델을 학습하는 데 사용.
- 테스트 세트: 모델의 성능을 평가하는 데 사용.
- 검증 세트 (optional): 하이퍼파라미터 튜닝을 위한 추가 데이터 세트.
- 장점:
- 간단하고 빠름:
홀드아웃 방법은 데이터를 나누고 한 번의 훈련 및 테스트만 수행하므로 빠르게 검증할 수 있습니다. - 대규모 데이터셋에 적합:
데이터 양이 많으면 한 번의 분할로도 신뢰성 있는 성능 평가가 가능합니다.
- 간단하고 빠름:
- 단점:
- 불안정성:
데이터 분할에 따라 성능이 달라질 수 있습니다. 특히 데이터 양이 적을 경우, 테스트 세트가 결과에 큰 영향을 미치게 됩니다. - 과적합 가능성:
테스트 세트에 맞춘 과적합이 발생할 수 있으며, 한 번의 평가로는 모델 성능이 불안정할 수 있습니다.
- 불안정성:
- 장점:
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
# 데이터 로드 및 분할
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 모델 학습
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# 테스트 세트 성능 평가
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"홀드아웃 방법으로 평가한 정확도: {accuracy * 100:.2f}%")
2. 교차 검증 (Cross-Validation)
데이터가 적을 때, 교차 검증을 통해 데이터를 최대한 활용하여 모델의 성능을 안정적으로 평가할 수 있습니다.
교차 검증은 데이터를 여러 개의 폴드로 나누고, 각 폴드를 검증 세트로 사용하면서 학습을 반복합니다.
- k-겹 교차 검증: 데이터를 k개의 폴드로 나누어, 각 폴드가 한 번씩 검증 세트가 되도록 k번 학습 및 평가를 수행합니다.
장점:- 안정적 평가:
여러 번의 검증을 통해 데이터 분할에 따른 성능 변동성을 줄입니다. - 데이터 활용 극대화:
모든 데이터를 훈련 및 검증에 사용하여, 적은 데이터로도 안정적 평가가 가능합니다.
- 시간 소모:
반복적인 학습과 평가로 인해 계산 비용이 많이 듭니다. - 과적합 가능성:
교차 검증을 위한 하이퍼파라미터 최적화 시, 테스트 세트 성능이 과적합될 수 있습니다.
- 안정적 평가:
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
# 데이터 로드
iris = load_iris()
X, y = iris.data, iris.target
# 모델 및 교차 검증 수행
model = DecisionTreeClassifier()
scores = cross_val_score(model, X, y, cv=5) ## 5-겹 교차 검증
print("교차 검증 정확도:", scores)
print("평균 정확도:", scores.mean())
데이터가 적을 때 모델이 얼마나 안정적인 성능을 보이는지 확인할 수 있습니다.
모델 단순화 및 정규화
데이터가 적을 때는 복잡한 모델이 **과적합(overfitting)**에 빠지기 쉽습니다. 과적합을 방지하기 위해 간단한 모델을 사용하거나, 정규화 기법을 적용하는 것이 좋습니다.
- 간단한 모델 선택:
결정 트리, k-최근접 이웃(k-NN), 로지스틱 회귀 등 복잡도가 낮은 모델은 적은 데이터에서도 효과적일 수 있습니다. - 정규화 적용: L1, L2 정규화 또는 드롭아웃(dropout) 기법을 통해 과적합을 줄일 수 있습니다.
장점:- 과적합 방지:
복잡도가 낮아 과적합 위험이 줄어듭니다. - 간결한 모델:
해석이 용이하고, 계산량이 줄어드는 간단한 모델을 만듭니다.
- 제약된 모델링 가능성:
모델 복잡도가 낮아지면서 데이터의 복잡한 패턴을 잘 포착하지 못할 수 있습니다. - 정규화 조정 필요:
정규화 하이퍼파라미터를 적절히 조정하지 않으면 성능 저하 가능성이 있습니다.
- 과적합 방지:
4. 부트스트래핑 (Bootstrapping)
부트스트래핑은 적은 데이터로 여러 샘플을 생성하는 통계적 기법으로,
데이터를 랜덤하게 복원 추출하여 여러 개의 학습 세트를 만듭니다.
여러 학습 세트로 모델을 학습하면, 데이터가 적을 때도 모델의 안정성을 높일 수 있습니다.
장점:
- 불안정성 완화: 적은 데이터에서도 다양한 샘플을 생성하여 모델 성능을 안정적으로 평가할 수 있습니다.
- 확률적 추정: 샘플 평균 및 분산 추정에 유리하여 불확실성 분석이 가능합니다.
단점:
- 복잡성 증가: 데이터 복원 추출로 인해 많은 학습 세트를 생성하므로 계산 비용이 높아질 수 있습니다.
- 노이즈 추가 가능성: 복원 추출로 인해 샘플이 반복될 수 있어, 원본 데이터에 없는 노이즈가 추가될 수 있습니다.
from sklearn.utils import resample
import numpy as np
# 원본 데이터
original_data = np.array([1, 2, 3, 4, 5])
# 부트스트래핑 샘플 생성
bootstrap_sample = resample(original_data, n_samples=10, replace=True)
print("부트스트래핑 샘플:", bootstrap_sample)
5. 합성 소수 샘플링 (SMOTE)
분류 문제에서 데이터가 불균형하거나 적을 때 SMOTE 기법을 사용해 소수 클래스 데이터를 증강할 수 있습니다.
SMOTE는 소수 클래스 샘플을 사용해 새로운 소수 샘플을 생성하여 불균형 문제를 완화합니다.
장점:
- 불균형 완화: 소수 클래스 샘플을 증강하여 불균형 문제를 해결할 수 있습니다.
- 성능 개선: 소수 클래스가 모델 학습에 충분히 반영되어 예측 성능을 높일 수 있습니다.
단점:
- 노이즈 위험: 합성 데이터 생성 과정에서 일부 노이즈 데이터가 포함될 수 있습니다.
- 고차원 데이터 어려움: 고차원 데이터에서 새로운 샘플을 생성하기 어려워 적용이 제한적일 수 있습니다.
from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
# 예시 데이터 생성 (불균형 데이터)
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, weights=[0.9, 0.1], random_state=42)
# SMOTE 적용
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
print("원본 데이터 크기:", X.shape)
print("SMOTE 적용 후 데이터 크기:", X_resampled.shape)
반응형
'데이터분석' 카테고리의 다른 글
분류분석 (0) | 2024.11.09 |
---|---|
오분류 추정 및 확인 (0) | 2024.11.09 |
비모수 검정법 (0) | 2024.11.06 |
데이터 스케일링 및 모델 특성 선택법 (3) | 2024.11.06 |
Jupyter 를 이용한 패키지 및 데이터 관리 (1) | 2024.11.05 |