데이터분석

데이터 분할 시 양이 충분하지 않은 경우

장수우 2024. 11. 8. 20:05

1. 홀드아웃 방법

홀드아웃 방법은 데이터를 두 개 또는 세 개의 세트로 나누어 모델의 성능을 검증합니다:

  1. 훈련 세트: 모델을 학습하는 데 사용.
  2. 테스트 세트: 모델의 성능을 평가하는 데 사용.
  3. 검증 세트 (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번 학습 및 평가를 수행합니다.

    장점:
    1. 안정적 평가:
      여러 번의 검증을 통해 데이터 분할에 따른 성능 변동성을 줄입니다.
    2. 데이터 활용 극대화:
      모든 데이터를 훈련 및 검증에 사용하여, 적은 데이터로도 안정적 평가가 가능합니다.
    단점:
    1. 시간 소모:
      반복적인 학습과 평가로 인해 계산 비용이 많이 듭니다.
    2. 과적합 가능성:
      교차 검증을 위한 하이퍼파라미터 최적화 시, 테스트 세트 성능이 과적합될 수 있습니다.
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) 기법을 통해 과적합을 줄일 수 있습니다.

    장점:
    1. 과적합 방지:
      복잡도가 낮아 과적합 위험이 줄어듭니다.
    2. 간결한 모델:
      해석이 용이하고, 계산량이 줄어드는 간단한 모델을 만듭니다.
    단점:
    1. 제약된 모델링 가능성:
      모델 복잡도가 낮아지면서 데이터의 복잡한 패턴을 잘 포착하지 못할 수 있습니다.
    2. 정규화 조정 필요:
      정규화 하이퍼파라미터를 적절히 조정하지 않으면 성능 저하 가능성이 있습니다.

4. 부트스트래핑 (Bootstrapping)

부트스트래핑은 적은 데이터로 여러 샘플을 생성하는 통계적 기법으로,
데이터를 랜덤하게 복원 추출하여 여러 개의 학습 세트를 만듭니다.
여러 학습 세트로 모델을 학습하면, 데이터가 적을 때도 모델의 안정성을 높일 수 있습니다.

장점:

  1. 불안정성 완화: 적은 데이터에서도 다양한 샘플을 생성하여 모델 성능을 안정적으로 평가할 수 있습니다.
  2. 확률적 추정: 샘플 평균 및 분산 추정에 유리하여 불확실성 분석이 가능합니다.

단점:

  1. 복잡성 증가: 데이터 복원 추출로 인해 많은 학습 세트를 생성하므로 계산 비용이 높아질 수 있습니다.
  2. 노이즈 추가 가능성: 복원 추출로 인해 샘플이 반복될 수 있어, 원본 데이터에 없는 노이즈가 추가될 수 있습니다.
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는 소수 클래스 샘플을 사용해 새로운 소수 샘플을 생성하여 불균형 문제를 완화합니다.

장점:

  1. 불균형 완화: 소수 클래스 샘플을 증강하여 불균형 문제를 해결할 수 있습니다.
  2. 성능 개선: 소수 클래스가 모델 학습에 충분히 반영되어 예측 성능을 높일 수 있습니다.

단점:

  1. 노이즈 위험: 합성 데이터 생성 과정에서 일부 노이즈 데이터가 포함될 수 있습니다.
  2. 고차원 데이터 어려움: 고차원 데이터에서 새로운 샘플을 생성하기 어려워 적용이 제한적일 수 있습니다.
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