일반적으로 모델을 학습시킬 때 데이터를 train set과 test set으로 나누어 train set을 가지고 학습을 수행합니다.
교차검증이란 여기서 train set을 다시 train set과 validation set으로 나누어 학습 중 검증과 수정을 수행하는 것을 의미합니다.
# 데이터셋 로드
def make_dataset2():
iris = load_breast_cancer()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
return df.drop('target', axis=1), df['target']
X, y = make_dataset2()
일반적으로 사용되는 교차 검증 기법
# KFold
from sklearn.model_selection import KFold
model = DecisionTreeClassifier(random_state=0)
kfold = KFold(n_splits=5)
for train_idx, test_idx in kfold.split(X):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(accuracy_score(y_test, pred))
불균형한 타겟 비율을 가진 데이터가 한쪽으로 치우치는 것을 방지
# Stratified Kfold
from sklearn.model_selection import StratifiedKFold
model = DecisionTreeClassifier(random_state=0)
kfold = StratifiedKFold(n_splits=5)
for train_idx, test_idx in kfold.split(X, y):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
model.fit(X_train, y_train)
pred = model.predict(X_test)
print(accuracy_score(y_test, pred))
사이킷런 내부 API를 통해 fit(학습) - predict(예측) - evaluation(평가)
# 교차검증
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=3) # 데이터를 3개로 쪼갬
scores
# 평균 점수
scores.mean()
# 교차검증 Stratified Kfold
kfold = StratifiedKFold(n_splits=5)
scores = cross_val_score(model, X, y, cv=kfold)
scores
# 평균 점수
scores.mean()