소개
머신러닝에서는 모델의 성능을 평가하기 위해 데이터를 훈련 세트와 테스트 세트로 나누는 경우가 많습니다. 하지만 이러한 평가는 어떤 데이터 포인트가 훈련 세트에 포함되고 어떤 데이터 포인트가 테스트 세트에 포함되는지에 따라 크게 달라질 수 있습니다. 더 강력한 방법은 교차 검증 (Cross-Validation, CV) 입니다.
교차 검증을 사용하는 이유?
- 과적합 (Overfitting) 위험 감소: 여러 데이터 분할을 통해 모델 테스트
- 더 나은 일반화 (Generalization) 추정: 보지 못한 데이터에 대한 더 신뢰할 수 있는 성능
- 데이터 사용 극대화: 모든 샘플이 훈련 및 테스트에 모두 사용됨
교차 검증은 데이터셋을 여러 "폴드 (fold)"로 분할한 다음, 매번 다른 폴드를 테스트에 사용하여 모델을 여러 번 훈련하고 평가하는 과정을 포함합니다. 이를 통해 보지 못한 데이터에 대한 모델 성능을 더 신뢰할 수 있게 추정할 수 있습니다.
이 실습에서는 scikit-learn 의 강력하고 편리한 함수를 사용하여 유명한 Iris 데이터셋으로 분류기 (classifier) 에 대한 교차 검증을 수행하는 방법을 배웁니다. cross_val_score를 사용하여 성능 점수를 얻고, 그 평균과 표준 편차를 계산하여 모델의 안정성과 전반적인 정확도를 더 잘 이해하는 방법을 배우게 됩니다.
sklearn.model_selection 에서 cross_val_score 가져오기
이 단계에서는 교차 검증 수행에 필요한 함수를 가져오는 것부터 시작합니다. cross_val_score 함수는 scikit-learn 에서 이 목적을 위한 주요 도구입니다. 데이터 분할, 모델 훈련 및 여러 폴드에 걸친 모델 점수 계산 과정을 단순화합니다.
먼저 IDE 왼쪽의 파일 탐색기를 사용하여 ~/project 디렉토리에 있는 main.py 파일을 엽니다.
이제 main.py 스크립트에 cross_val_score에 대한 import 문을 추가합니다. 파일 상단의 다른 import 문과 함께 배치합니다.
from sklearn.model_selection import cross_val_score
이제 main.py 파일은 다음과 같이 보일 것입니다.
import numpy as np
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
## Load the iris dataset
iris = datasets.load_iris()
X, y = iris.data, iris.target
## Initialize a Support Vector Classifier (SVC)
## Parameters explained:
## - kernel='linear': Uses a linear kernel for linearly separable data like Iris
## - C=1: Regularization parameter (higher values = less regularization)
## - random_state=42: Ensures reproducible results across runs
clf = SVC(kernel='linear', C=1, random_state=42)
## --- Your code will go below this line ---
스크립트를 실행하여 구문 오류가 없는지 확인할 수 있습니다. IDE 에서 터미널을 열고 다음 명령을 실행합니다.
python3 main.py
아직 출력을 생성하는 코드를 추가하지 않았으므로 예상대로 아무런 출력도 보이지 않을 것입니다.
sklearn.model_selection 에서 n_splits=5 로 KFold 초기화
cross_val_score는 자동으로 분할을 처리할 수 있지만, 내부 메커니즘을 이해하는 것이 좋은 습관입니다. 가장 일반적인 교차 검증 전략은 K-Fold 이며, 이 경우 데이터셋이 'k'개의 폴드로 분할됩니다. 모델은 k-1 개의 폴드로 훈련되고 나머지 폴드로 테스트되며, 이 과정을 k 번 반복합니다.
KFold 매개변수:
n_splits=5: 데이터를 5 개의 동일한 부분 (폴드) 으로 나눕니다.shuffle=False(기본값): 원본 데이터 순서를 유지합니다.random_state:shuffle=True인 경우 무작위성을 제어합니다.
scikit-learn 의 KFold 클래스는 데이터를 분할하기 위한 훈련/테스트 인덱스를 제공하는 교차 검증 이터레이터 (iterator) 입니다. 다음 단계에서는 더 간단한 방법을 사용하겠지만, KFold를 이해하는 것은 기본적입니다.
KFold를 가져와서 초기화하는 방법을 살펴보겠습니다. 다음 줄을 main.py 파일에 추가합니다.
먼저 상단에 import 문을 추가합니다.
from sklearn.model_selection import KFold
그런 다음 초기화할 수 있습니다. 하지만 이 실습에서는 cross_val_score의 cv 매개변수에 의존할 것이며, 이는 더 직접적인 접근 방식입니다. 이 단계의 목적은 KFold 개념을 소개하는 것입니다. 단순성을 위해 그리고 실습 흐름을 따르기 위해 KFold 초기화 코드를 스크립트에 추가하지 않을 것입니다. 다음 단계에서 내부적으로 K-Fold 전략을 사용하는 cv=5를 직접 사용할 것입니다. 이것이 교차 검증을 수행하는 가장 일반적이고 간단한 방법입니다.
실제로 이 개념을 사용할 다음 단계로 진행하겠습니다. 이 단계에서는 코드를 추가하지 않았으므로 "Continue"를 클릭하여 진행할 수 있습니다.
cross_val_score(clf, X, y, cv=5) 로 교차 검증 수행
이제 교차 검증을 수행할 차례입니다. 이전에 가져온 cross_val_score 함수를 사용할 것입니다. 이 함수는 여러 인수를 받습니다.
cross_val_score 매개변수:
estimator: 평가할 모델 (clf분류기)X: 특징 데이터 행렬y: 대상 레이블 배열cv=5: 교차 검증 전략 (정수 = k-fold, 또는 CV 분할기 객체)scoring: 평가 지표 (기본값은 추정기의 점수 메서드 사용)n_jobs: 사용할 CPU 코어 수 (기본값=1, 모든 코어 사용 시 -1)
cv=5로 설정함으로써 scikit-learn 에 5-폴드 교차 검증을 수행하도록 지시하는 것입니다. 데이터가 5 개의 폴드로 자동 분할된 다음, 모델이 5 번 훈련 및 테스트되고 각 실행에 대한 점수를 포함하는 배열을 반환합니다.
다음 코드를 main.py 파일의 끝, 주석 줄 아래에 추가합니다.
## Perform 5-fold cross-validation
scores = cross_val_score(clf, X, y, cv=5)
## Print the array of scores
print("Scores:", scores)
이제 전체 main.py 파일은 다음과 같이 보일 것입니다.
import numpy as np
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
## Load the iris dataset
iris = datasets.load_iris()
X, y = iris.data, iris.target
## Initialize a Support Vector Classifier (SVC)
## Parameters explained:
## - kernel='linear': Uses a linear kernel for linearly separable data like Iris
## - C=1: Regularization parameter (higher values = less regularization)
## - random_state=42: Ensures reproducible results across runs
clf = SVC(kernel='linear', C=1, random_state=42)
## --- Your code will go below this line ---
## Perform 5-fold cross-validation
scores = cross_val_score(clf, X, y, cv=5)
## Print the array of scores
print("Scores:", scores)
이제 터미널에서 스크립트를 실행합니다.
python3 main.py
교차 검증의 각 폴드에 대한 점수를 보여주는 배열이 출력됩니다.
Scores: [0.96666667 1. 0.96666667 0.96666667 1. ]
Mean score: 0.9800000000000001
Standard deviation: 0.016329931618554516
점수는 정확한 분할에 따라 약간 다를 수 있지만 비슷해야 합니다. 이 배열은 모델이 데이터의 다른 하위 집합에서 어떻게 수행되었는지 자세히 보여줍니다.
scores.mean() 으로 평균 CV 점수 계산
점수 배열은 유익하지만, 모델 성능에 대한 빠른 요약을 위해서는 일반적으로 이러한 점수의 평균을 계산합니다. 이 단일 값은 모델의 정확도에 대한 일반적인 아이디어를 제공합니다.
cross_val_score 함수는 NumPy 배열을 반환하며, 여기에는 .mean()을 포함한 많은 유용한 메서드가 있습니다. 이 메서드를 scores 변수에 직접 호출할 수 있습니다.
평균 점수를 계산하고 출력하기 위해 다음 줄을 main.py 스크립트 끝에 추가합니다.
## Compute and print the mean of the scores
mean_score = scores.mean()
print("Mean score:", mean_score)
이제 main.py 파일은 다음 코드를 포함해야 합니다.
import numpy as np
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
## Load the iris dataset
iris = datasets.load_iris()
X, y = iris.data, iris.target
## Initialize a Support Vector Classifier (SVC)
## Parameters explained:
## - kernel='linear': Uses a linear kernel for linearly separable data like Iris
## - C=1: Regularization parameter (higher values = less regularization)
## - random_state=42: Ensures reproducible results across runs
clf = SVC(kernel='linear', C=1, random_state=42)
## --- Your code will go below this line ---
## Perform 5-fold cross-validation
scores = cross_val_score(clf, X, y, cv=5)
## Print the array of scores
print("Scores:", scores)
## Compute and print the mean of the scores
mean_score = scores.mean()
print("Mean score:", mean_score)
스크립트를 다시 실행합니다.
python3 main.py
출력에는 이제 5 개 점수의 평균이 포함되어 단일의 대표적인 성능 지표를 제공합니다.
Scores: [0.96666667 1. 0.96666667 0.96666667 1. ]
Mean score: 0.9800000000000001
scores.std() 로 CV 점수의 표준 편차 계산
평균 점수는 평균 성능을 알려주지만, 그 성능이 얼마나 일관적인지는 알려주지 않습니다. 점수의 표준 편차는 이러한 분산의 척도를 제공합니다.
표준 편차 해석:
- 낮은 표준 편차 (< 0.05): 모든 데이터 하위 집합에 걸쳐 모델 성능이 일관적임
- 중간 표준 편차 (0.05-0.15): 적당한 변동성, 대부분의 경우 허용 가능
- 높은 표준 편차 (> 0.15): 큰 성능 변동, 데이터 문제 또는 모델 불안정성을 나타낼 수 있음
낮은 표준 편차는 모델 성능이 데이터의 다른 하위 집합에 걸쳐 안정적임을 나타내는 반면, 높은 표준 편차는 성능이 더 가변적임을 시사합니다.
.mean()과 마찬가지로 NumPy 배열에는 표준 편차를 계산하는 .std() 메서드도 있습니다.
마지막 코드 조각을 main.py 스크립트에 추가하여 표준 편차를 계산하고 출력합니다.
## Compute and print the standard deviation of the scores
std_dev = scores.std()
print("Standard deviation:", std_dev)
이제 최종 main.py 스크립트가 완성되었으며 다음과 같이 보여야 합니다.
import numpy as np
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
## Load the iris dataset
iris = datasets.load_iris()
X, y = iris.data, iris.target
## Initialize a Support Vector Classifier (SVC)
## Parameters explained:
## - kernel='linear': Uses a linear kernel for linearly separable data like Iris
## - C=1: Regularization parameter (higher values = less regularization)
## - random_state=42: Ensures reproducible results across runs
clf = SVC(kernel='linear', C=1, random_state=42)
## --- Your code will go below this line ---
## Perform 5-fold cross-validation
scores = cross_val_score(clf, X, y, cv=5)
## Print the array of scores
print("Scores:", scores)
## Compute and print the mean of the scores
mean_score = scores.mean()
print("Mean score:", mean_score)
## Compute and print the standard deviation of the scores
std_dev = scores.std()
print("Standard deviation:", std_dev)
스크립트를 마지막으로 한 번 실행합니다.
python3 main.py
최종 출력에는 점수 배열, 평균 및 표준 편차가 표시되어 모델 성능에 대한 포괄적인 평가를 제공합니다.
Scores: [0.96666667 1. 0.96666667 0.96666667 1. ]
Mean score: 0.9800000000000001
Standard deviation: 0.016329931618554516
요약
이 랩을 완료하신 것을 축하드립니다! scikit-learn 을 사용하여 k-fold 교차 검증을 수행하고 해석하는 방법을 성공적으로 학습했습니다.
이 랩에서는 다음을 수행했습니다.
- 강력한 모델 평가를 위한 교차 검증의 중요성을 이해했습니다.
cross_val_score함수를 사용하여 Support Vector Classifier 에 5-fold 교차 검증을 쉽게 수행했습니다.- 교차 검증 점수의 평균과 표준 편차를 계산하고 출력하여 결과를 분석했습니다.
교차 검증 실용 팁:
- 대부분의 시나리오에서는 5-fold 또는 10-fold CV 를 사용하세요.
- 불균형 데이터셋의 경우 계층적 CV(stratified CV) 를 고려하세요.
- 여러 메트릭을 사용하려면
cross_val_score대신cross_validate를 사용하세요. - 재현 가능한 결과를 위해 항상
random_state를 설정하세요.
이 기법은 머신러닝 워크플로우의 기본 부분으로, 모델 성능이 신뢰할 수 있으며 단순히 운 좋은 학습 - 테스트 분할의 결과가 아님을 보장합니다. 이제 이 지식을 적용하여 자신의 머신러닝 모델을 더 큰 확신을 가지고 평가할 수 있습니다.



