머신러닝 데이터세트 분할 방법(How to split your dataset?, train_test_split, KFold, StratifiedKFold)

Posted by

데이터세트 분할은 머신 러닝 모델을 학습시키기 위한 중요한 단계 중 하나이다.

머신러닝 모델 학습에 있어서 데이터세트를 학습용(train), 검증용(validation), 테스트용(test)으로 나누는 것은 매우 중요하다. 이를 통해 모델이 학습된 데이터에만 지나치게 적합(fitting)되는 것을 방지하고, 더욱 일반화(generalization)된 모델을 만들 수 있다. 이러한 데이터세트 분리 기법 중에서 train_test_split, k-fold cross-validation, stratified k-fold cross-validation에 대해서 확인해보고자 한다.


train_test_split

train_test_split은 데이터를 무작위로 두 개의 그룹으로 분할하는 가장 간단한 방법 중 하나이다. 이 방법은 모델을 학습시키기 위한 데이터(train set)와 모델의 성능을 평가하기 위한 데이터(test set)로 데이터를 나누며, 일반적으로 데이터세트의 70%를 train set으로, 30%를 test set으로 분할한다.

장점

  • 데이터세트가 큰 경우, 빠르게 모델을 학습 시키고 평가할 수 있다.
  • 분할 방법이 무작위이므로, 모든 데이터가 모델 학습 및 평가에 사용된다.

단점

  • 분할 방법이 무작위이므로, 데이터세트의 특성을 반영하지 못할 수 있다.
  • 데이터세트의 크기에 따라, train set이나 test set의 크기가 작아져서 모델이 일반화(generalization)하지 못할 수 있다.

사용방법

from sklearn.model_selection import train_test_split 

# 데이터세트 분할하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 모델 학습 및 검증
model.fit(X_train, y_train)
score = model.score(X_test, y_test)

X는 feature 데이터, y는 target 데이터이다.
test_size는 데이터세트 중 test set의 비율을 결정하며, random_state는 분할 시 무작위성을 결정하는 시드이다.


k-fold cross-validation

k-fold cross-validation은 데이터를 k개의 그룹(fold)으로 나누고, 각각의 그룹을 test set으로 사용하고, 나머지 그룹을 train set으로 사용하는 방법이다. 이 방법은 train_test_split과 다르게, 데이터를 무작위로 분할하는 것이 아니라, 모든 데이터를 사용하며 모든 데이터를 train set과 test set으로 사용한다.

장점

  • 모든 데이터가 모델 학습 및 평가에 사용되므로, 데이터를 최대한 활용할 수 있다.
  • 모델의 성능을 평가하는 데에 더욱 신뢰성이 있다.

단점

  • 모델을 k번 학습하기 때문에, train_test_split보다 계산 비용이 높다.
  • K-Fold 방법은 모델을 학습하는 데 많은 시간이 걸린다.
  • K-Fold 방법은 데이터세트가 크면 오버헤드가 많이 발생한다.

사용방법

from sklearn.model_selection import KFold

# 데이터세트 불러오기
X, y = load_data()

# KFold 생성
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# KFold 반복문 실행
for train_index, test_index in kf.split(X):
    X_train, X_test = X.iloc[train_index, :], X.iloc[test_index, :]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

    # 모델 학습 및 검증
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)

Stratified k-fold cross-validation

Stratified K-Fold 교차 검증은 K-Fold 교차 검증의 한 종류이다.기본적으로 K-Fold 교차 검증과 비슷하지만 클래스 분포를 유지하는 데 초점을 맞추고 있다. 즉, 각 fold 안에 각 클래스의 비율이 전체 데이터세트의 비율과 동일하도록 하여, 일반적으로 클래스 불균형 데이터세트에서 사용된다.

장점

  • Stratified k-fold는 데이터세트의 불균형성에 대해 민감하다.
    각각의 폴드에서 불균형한 데이터세트가 랜덤으로 선택되는 것을 방지할 수 있다.
  • Stratified k-fold는 일반적으로 일반화 성능을 높이는 데 도움이 된다.
    모델이 한 클래스에만 집중하는 것을 방지하고 다양한 클래스의 샘플을 사용하여 학습하기 때문이다.
  • 데이터세트가 작은 경우, Stratified k-fold는 데이터세트를 더 많은 부분으로 분할하여 과적합을 방지하는 데 도움이 된다.

단점

  • Stratified k-fold는 일반적으로 K-fold에 비해 데이터세트를 K번 분할해야 하기 때문에 더 많은 계산 리소스가 필요하다.
  • 데이터세트의 불균형성이 크게 줄어들 경우, Stratified k-fold는 K-fold와 성능 차이가 없을 수 있다.

사용방법

Stratified k-fold를 사용하려면 scikit-learn의 StratifiedKFold 클래스를 사용합니다. 이 클래스는 다음과 같이 인수를 받습니다.

from sklearn.model_selection import StratifiedKFold

# 데이터세트 불러오기
X, y = load_data()

# tratifiedKFold 생성
skf = StratifiedKFold(n_splits=5)

# tratifiedKFold 반복문 실행
for train_index, test_index in skf.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # 모델 학습 및 검증
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)

n_splits은 데이터를 분할하는 데 사용되는 분할 수 이다.

split: 먼저 split() 메서드를 사용하여 인덱스를 반환하고, 이 인덱스를 사용하여 데이터를 분할할 수 있다.

Image 참고: https://amueller.github.io/

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다