모델을 학습시키기 위해 데이터를 어떻게 나눌지에 대한 여러 방법이 있습니다. 각 방법은 데이터의 특성에 따라 다르게 적용할 수 있습니다. 아래는 주요 데이터 분할 방법에 대한 설명입니다.
랜덤 샘플링은 데이터를 무작위로 섞어서 훈련 데이터와 테스트 데이터를 나누는 방법입니다.
from sklearn.model_selection import train_test_split
# 데이터 예시 (X: 특성, y: 타겟)
X = [[i] for i in range(100)] # 0~99
y = [i for i in range(100)]
# 훈련 데이터와 테스트 데이터 나누기 (80% 훈련, 20% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("훈련 데이터:", X_train)
print("테스트 데이터:", X_test)
K-겹 교차 검증은 데이터를 K개의 폴드로 나누고, 각 폴드가 한 번씩 테스트 데이터로 사용되도록 학습하는 방법입니다.
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
# 모델 생성
model = RandomForestClassifier()
# 5-겹 교차 검증
scores = cross_val_score(model, X, y, cv=5)
print("교차 검증 점수:", scores)
계층화 샘플링은 클래스 비율을 유지하며 데이터를 나누는 방법으로, 불균형한 데이터셋에서 유용합니다.
from sklearn.model_selection import train_test_split
# 클래스 비율을 유지하며 훈련 데이터와 테스트 데이터 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
print("훈련 데이터:", X_train)
print("테스트 데이터:", X_test)
시간 순서대로 나누기는 시계열 데이터에서 시간 순서를 고려하여 훈련 데이터와 테스트 데이터를 나누는 방법입니다.
# 시간 순서대로 데이터를 나누기
X_train, X_test, y_train, y_test = X[:80], X[80:], y[:80], y[80:]
print("훈련 데이터:", X_train)
print("테스트 데이터:", X_test)
슬라이딩 윈도우는 시계열 데이터에서 훈련 데이터의 크기를 일정하게 유지하고, 테스트 데이터를 계속해서 이동시키며 예측하는 방법입니다.
# 슬라이딩 윈도우로 학습/테스트 데이터 분리
window_size = 30
horizon = 5
for start in range(0, len(X) - window_size - horizon + 1, window_size):
# window_size만큼 늘어
end = start + window_size
# 훈련 데이터와 테스트 데이터 생성
X_train = X[start:end]
y_train = y[start:end]
X_test = X[end:end + horizon]
y_test = y[end:end + horizon]
# 학습과 테스트 데이터 확인
print("훈련 데이터:", X_train, y_train)
print("테스트 데이터:", X_test, y_test)
Time Series Split은 시계열 데이터를 점진적으로 훈련 데이터에 추가하면서, 점차적으로 테스트 데이터를 이동시켜 모델을 평가하는 방법입니다.
from sklearn.model_selection import TimeSeriesSplit
# 시간 기반 교차 검증
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print("훈련 데이터:", X_train, y_train)
print("테스트 데이터:", X_test, y_test)
데이터를 분할할 때는 데이터의 특성에 맞는 방법을 선택하는 것이 중요합니다. 시계열 데이터의 경우 시간 순서를 고려해야 하고, 불균형한 클래스에서는 계층화 샘플링을 사용하는 것이 좋습니다. 각 방법을 적절히 사용하여 모델을 학습하고 평가하는 것이 성능을 높이는 데 도움을 줍니다.