Python/Scikit-learn

[Python] Scikit-learn에서 cross validation 사용하기

언킴 2022. 1. 14. 20:14
반응형

교차검증법에는 다양한 방법이 존재한다. 일반적으로는 n개의 집단으로 나누어 교차검증을 하지만 LOOCV(Leave-One-Out Cross-Validation)의 경우에는 분할의 수를 데이터의 수 만큼 나누어 평가를 하게 된다. 만약 데이터가 100개라면 데이터를 100개로 나누고 99개는 학습, 나머지 하나로 평가를 하는 형태로 진행된다. LOOCV의 경우 데이터의 수가 적을 때 극한으로 성능을 끌어올리기 위해서 주로 사용된다. 

 

사이킷-런(scikit-learn)에서는 교차검증에 대한 패키지를 제공해주고 있다. sklearn 2.0 버전 이하인 경우에는 아래와 같은 방식으로 호출을한다.

from sklearn import cross_validation

 

하지만 그 이후 버전에서는 아래와 같이 cross_validate와 cross_val_score를 따로 나누어 import 해야지만 불러올 수 있다.

import numpy as np 
import pandas as pd
from sklearn import (
svm, 
datasets
)
from sklearn.model_selection import cross_validate, cross_val_score
from sklearn.model_selection import train_test_split

 

나는 사이킷-런에 내장된 데이터 셋 중에서 iris 데이터를 활용하고 모델은 서포트 벡터 머신 (SVM)을 사용해 교차검증 예시를 보여줄 것이다.

iris = datasets.load_iris()
x = iris.data
y = iris.target


x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 42)

print('x_train : {}, x_test : {}, y_train : {}, y_test : {}'.\
      format(x_train.shape, x_test.shape, y_train.shape, y_test.shape))
      
# x_train : (120, 4), x_test : (30, 4), y_train : (120,), y_test : (30,)

train_set_split은 test_size를 지정해둔 비율만큼 데이터를 분할해준다. 비율값이 아니라 자연수 값이 들어가게되면 그만큼 데이터 수를 test_size로 설정하여 분석을 시행할 수 있다. 추가적으로 random_state를 지정하지 않으면 모델을 돌릴때마다 매번 다른 값의 test를 불러오기 때문에 동일한 결과를 도출하기 위해서는 지정해주어야 한다.

 

svc = svm.SVC(C = 1, kernel = 'rbf', gamma = 0.001)

scores = cross_val_score(svc, x, y, cv = 5) 

print('score : ', scores)
print('-'*70)
print('mean score : ', scores.mean())


# score :  [0.86666667 0.96666667 0.83333333 0.96666667 0.93333333]
# ----------------------------------------------------------------------
# mean score :  0.9133333333333334

 

cv는 5로 설정했지만, 설정을 바꾸어 분할 수를 다르게 해 성능을 비교해보는 것도 좋은 공부 방법이 될 수 있다. 이와 같이 사이킷-런은 단순히 코드 몇줄만 작성해도 구현이 가능하다. 모델을 돌리는 것 보다 이론적 배경이 더욱 중요하다고 생각한다.

 

'Python > Scikit-learn' 카테고리의 다른 글

[Python] logistic regression  (0) 2022.01.17