데이터셋을 여러개로 나눠 모델을 반복적으로 학습 및 평가를 해서 모델의 일반화 성능을 측정하는 방법
모델의 과적합을 확인하고, 일반화된 성능 평가를 위해 사용한다
데이터를 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}")
데이터의 불균형 문제의 해결을 위해 주로 범주형 데이터의 범주들의 비율을 유지하면서 나누는 방법
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}")
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}")