교차검증(Cross Validation)

leegahee·2025년 1월 14일

개념정리

목록 보기
11/17

교차검증(Cross Validation) 이란?

데이터셋을 여러개로 나눠 모델을 반복적으로 학습 및 평가를 해서 모델의 일반화 성능을 측정하는 방법
모델의 과적합을 확인하고, 일반화된 성능 평가를 위해 사용한다

K-Fold Cross Validation

데이터를 k개로 나누어 k개중 하나만 test 데이터로 잡고 K번 반복해서 학습을 진행하는 방법

from sklearn.model_selection import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 데이터 준비
X = np.random.rand(100, 5)  # 100개의 샘플, 5개의 특성
y = np.random.randint(0, 2, 100)  # 클래스 0 또는 1

# K-Fold 설정
kf = KFold(n_splits=5, shuffle=True, random_state=42)

# 모델 학습 및 평가
model = LogisticRegression()
accuracy_list = []

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.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracy_list.append(accuracy)

print(f"K-Fold 평균 정확도: {np.mean(accuracy_list):.2f}")

Stratified K-Fold Cross Validation

데이터의 불균형 문제의 해결을 위해 주로 범주형 데이터의 범주들의 비율을 유지하면서 나누는 방법

from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 데이터 준비
X = np.random.rand(100, 5)  # 100개의 샘플, 5개의 특성
y = np.random.randint(0, 2, 100)  # 클래스 0 또는 1

# Stratified K-Fold 설정
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 모델 학습 및 평가
model = LogisticRegression()
accuracy_list = []

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)
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracy_list.append(accuracy)

print(f"Stratified K-Fold 평균 정확도: {np.mean(accuracy_list):.2f}")

Leave-One-Out Cross Validation (LOOCV)

K-Fold Cross Validation 를 데이터 개수만큼 반복하는 방법

from sklearn.model_selection import LeaveOneOut
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as np

# 데이터 준비
X = np.random.rand(10, 5)  # 10개의 샘플, 5개의 특성
y = np.random.randint(0, 2, 10)  # 클래스 0 또는 1

# LOOCV 설정
loo = LeaveOneOut()
model = LogisticRegression()
accuracy_list = []

for train_index, test_index in loo.split(X):
    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)
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracy_list.append(accuracy)

print(f"LOOCV 평균 정확도: {np.mean(accuracy_list):.2f}")

0개의 댓글