2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/머신러닝

머신러닝] 교차검증으로 평가하기

원당컴1 2023. 12. 13. 14:01

다항 회귀(https://wondangcom.tistory.com/2684) 에서 우리가 과대 적합과 과소적합을 피하는 방법으로 교차검증으로 판단 한다고 언급을 했었다.

여기서는 교차검증은 무엇이고 어떤 원리인지 살펴 보자.

 

1. 교차검증의 원리

교차 검증은 전체 데이터 세트를 훈련세트와 테스트 세트를 8:2로 나눈 다음 훈련세트에 해당하는 부분을 다시 K개의 덩어리로 나눈다.

그런 다음 1개씩을 따로 떼어서 검증에 사용하고 나머지 4개의 덩어리를 훈련에 사용하는 방식이다.

노랑색 부분 1개씩을 따로 떼어 검증에 사용한다.

2. 교차 검증 과정

  • 훈련 세트를 k개의 폴드로 나눈다.
  • 첫번째 폴드를 검증 세트로 사용하고 나머지 폴드(k-1ro)를 훈련 세트로 사용한다.
  • 모델을 훈련한 다음에 검증세트로 평가한다.
  • 차례대로 다음 폴드를 검증 세트로 사용하여 반복한다.
  • k개의 검증세트로 k번 성능을 평가한 후 계산된 성능의 평균을 내어 최종 성능을 계산한다.

 

3. 사이킷런으로 K-폴드 교차 검증하기

유방암 데이터를 가지고 교차 검증을 테스트 해 보자.

먼저 로지스틱 회귀로 모델 훈련하고 평가를 해서 점수를 확인 해 보자.

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

cancer = load_breast_cancer()
x = cancer.data
y = cancer.target
x_train_all, x_test, y_train_all, y_test = train_test_split(x, y, stratify=y, 
                                                            test_size=0.2, random_state=42)

 유방암 데이터를 로딩하여 훈련세트와 테스트 세트로 분류 하였다.

이 데이터를 SGDClassifier 클래스를 이용하여 로지스틱 회귀 모델을 훈련해 보자.

from sklearn.linear_model import SGDClassifier
sgd = SGDClassifier(loss='log_loss', random_state=42)
sgd.fit(x_train_all, y_train_all)
sgd.score(x_test, y_test)

성능을 평가하면 0.83 점 정도 나온다.

loss 와 같은 매개변수는 사용자가 직접 선택하는 하이퍼파라미터로 hinge 등을 사용하여 평가 할 수 있다.

사이킷런의 model_slelection 모듈에는 교차 검증을 위한 cross_validate() 함수가 있다.

cross_validate() 함수를 사용하는 방법은 간단하다. 이 함수의 매개변수 값으로 교차 검증을 하고 싶은 모델의 객체와 훈련 데이터, 타깃 데이터를 전달하고 cv 매개변수에 교차 검증을 수행할 폴드 수를 지정하면 된다. 앞에서 만들었던 SGDClassifier 모델과 동일한 매개변수를 사용하여 모델 객체를 만들고 교차 검증을 수행해 보자

from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import cross_validate
sgd = SGDClassifier(loss='log_loss', penalty='l2', alpha=0.001, random_state=42)
scores = cross_validate(sgd, x_train_all, y_train_all, cv=10)
print(np.mean(scores['test_score']))

0.85점 정도 나온다.

교차 검증의 평균 점수는 85%로 낮은 편이다. 왜 이렇게 낮을까? 

그것은 표준화 전처리를 수행하지 않았기 때문이다.

특성의 스케일은 알고리즘에 영향을 준다.

예를 들면 한가지 특성은 단위가 g 이고 한가지 특성은 단위가 kg 의 데이터 였다면 g 단위의 특성에 많은 영향을 받을 수 밖에 없을 것이다.

이러한 데이터를 전처리 수행 후 작업을 다시 진행해 보자.

 

 

4. Pipeline 클래스를 사용해 교차 검증 수행하기

사이킷런은 검증 폴드가 전처리 단계에서 누설되지 않도록 전처리 단계와 모델 클래스를 하나로 연결해 주는 Pipeline 클래스를 제공한다.

실제로 Pipeline클래스와 SGDCliassifier 클래스는 어떻게 작동할까?  

먼저 표준화 전처리단계(평균,표준편차를 계산)와 SGDClassifier 클래스 객체를 Pipeline 클래스로 감싸 cross_validate() 함수에 전달한다. 그러면 cross_validate() 함수는 훈련 세트를 훈련 폴드와 검증폴드로 나누기만 하고 전처리 단계와 SGDClassifier 클래스 객체의 호출은 Pipelien 클래스 객체에서 이루어진다. 이렇게 하면 검증 폴드가 전처리 단계에서 누설되지 않게 된다. 

make_pipeline() 함수에 전처리 단계와 모델 객체를 전달하면 파이프라인 객체를 만들 수 있다.

사이킷런에서 표준화 전처리를 수행하는 클래스는 preprocessing 모듈 밑에 있는 StandardScaler 클래스이다. StandardScaler 클래스의 객체와 앞에서 만든 SGDClassifier 클래스의 객체(sgd)를 make_pipeline() 함수에 전달하여 파이프 라인 객체를 만든다음 교차검증 점수를 출력해 보자.

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
pipe = make_pipeline(StandardScaler(), sgd)
scores = cross_validate(pipe, x_train_all, y_train_all, cv=10, return_train_score=True)
print(np.mean(scores['test_score']))

0.96점으로 평균 검증 점수가 높아졌다.

 

 

참고)

Do it 정직하게 코딩하며 배우는 딥러닝입문

 

사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기

'강의자료 > 머신러닝' 카테고리의 다른 글

1.3 머신러닝 시스템의 종류  (7) 2024.03.21
1.2 머신러닝을 사용하는 이유  (0) 2024.03.14
1.1 인공지능이란  (0) 2024.03.07
머신러닝 목차  (0) 2024.02.29
[머신러닝 따라하기] 01.데이터 준비  (0) 2022.09.30