머신러닝에서 학습한 데이터들을 가지고 학습한 모델의 성능을 학습 데이터로 사용한다면 당연히 
성능은 100% 정확하게 나올 수 있다. 

 

하지만,

실제로는 이미 학습한 데이터를 가지고 하는 것이 아니라, 처음 접한 데이터를 예측을 해야 하기 때문에,
그 성능을 측정하기 위해서는 학습 당시에 사용하지 않은 데이터를 가지고 성능 테스트를 해야 한다. 

 

하지만, 가지고 있는 데이터는 한정적이기 때문에, 가지고 있는 데이터 안에서 학습에 이용할 데이터와 성능 테스트에 이용할 데이터를 분리해야 한다. 

 

이 과정을 수행하는 것이 sklearn.model_selection의 train_test_split이다. 
실제로 거의 모든 머신러닝 과정에서 위 함수를 사용하게 된다. 

 


 

 

train_test_split()

 

 

함수에서는 2가지 파라미터는 필수적으로 입력을 받아야 하고, 그 뒤에 자주 쓰이는 파라미터 2개가 있다. 

필수적으로 입력을 받아야 하는 파라미터는 피처 데이터 세트와, 레이블 데이터 세트이다. 

선택적으로 입력을 받는 함수에는 주로 test_size와 random_state가 있다. 

 

 

(train_size도 있으나, test_size를 정함으로써 자동으로 정해지기때문에, 자주 사용하지는 않는다. 
또한, shuffle이라는 파라미터는 데이터를 학습데이터와 테스트 데이터로 분리하기 전에 데이터를 섞을지에 대한 여부를 결정하는 파라미터이다. 초깃값은 True로 되어있다.)

 

 

 

 

train_test_split()의 반환값은 튜플 형태로,

 

(학습 피처 데이터 세트(X_train), 테스트 피처 데이터 세트(X_test), 학습 레이블 데이터 세트(y_train), 테스트 레이블 데이터 세트(y_test))이다. 

 

일반적으로 

X_train, X_test, y_train, y_test= train_test_split(data.data, data.label, test_size = 0.2, random_state = 121)

이런 형식으로 자주 쓰인다. 

 


 

 

교차 검증 

 

 

이렇게 학습 데이터와 테스트 데이터를 분리한 후 성능 테스트까지 마친 후 어떻게 해야 할까?

 

모델의 성능이 낮을 경우,  성능을 개선 시키기 위해서 반복적으로 학습시키거나, 여러 하이퍼 파라미터들을 수정할 수 있다. 

 

이 과정에서 중요한 문제가 하나 생긴다. 바로 

과적합 (Overfitting)

이다.

 

과적합은, 학습된 머신러닝 알고리즘 모델이 테스트 데이터에서 높은 성능을 내기 위해 지속적인 튜닝을 거친 결과, 너무 테스트 데이터에 적합하게 만들어져, 오히려 실제로 예측해야 하는 데이터에서는 성능이 떨어지는 현상을 의미한다. 

 

이 과적합의 근본적인 원인은 무엇일까? 

바로, 한정된 테스트 데이터를 가지고 성능을 평가하게 된다는 것이다.

 

과적합을 아직 완전하게 해결할수는 없지만,

과적합을 완화하기 위해서 나온 기술이 바로 "교차 검증(Cross Validation)"이다.  

 

 

 

K-fold 교차 검증

 

교차 검증의 가장 보편적으로 사용되는 기법이다.

 

  • 초기에 테스트 데이터를 별도로 분리를 시켜 놓고, 학습데이터를 K개의 폴드(묶음)로 묶는다. 
  • 폴드 K개 중 하나는 검증 폴드가 되고, 나머지는 학습 폴드가 되어 학습 및 검증을 수행한다. 
  • 이 과정을 K번 수행한다.(모든 폴드가 한번씩 검증 폴드가 되도록)

 

 

이런 과정이, 특정 데이터에 대해서 과적합이 되는 것을 방지하고,

한정된 데이터를 가지고, 더 다양한 데이터를 접하는 것처럼 모델을 학습시킬수 있어서 많이 쓰인다. 

따라서 교차 검증은 Overfitting과 Underfitting(데이터가 너무 적어 성능이 낮게 나오는 경우)를 방지할 수 있다.

 

 


 

 

Scikit-learn에서 K-Fold

 

 

Scikit-learn에서 제공하는 K-Fold에는 2가지가 있다. 

1. K-Fold
2. Stratified K-Fold

 

위에서 설명한 개념이 일반적인 K-Fold 교차 검증 기법이다. 

 

Stratified K-Fold 교차 검증은 여기에 한가지가 추가된다. 

바로 원본데이터의 분포와 동일하게 각 폴드 세트의 데이터를 조절한다.
 
이것은 불균형한 분포도를 가진 집합을 위한 K 폴드 교차 검증 방식이다. 

(참고로, 불균형한 분포도를 가진 경우에 대해서 다루는 경우가 많다. 
Ex> 암환자, 금융 사기 등을 찾아내야 하는 경우, 해당하는 사례는 일반적인 사례들보다 매우 낮다. 
이것에 대한 자세한 내용은 이후에 머신러닝 성능 평가에서, 자세히 다룰 예정이다.)

 

※ 일반적으로 분류에서의 교차 검증은 K-Fold가 아닌, Stratified K-Fold로 분할되어야 한다. 
회귀에서는 레이블 값이 연속적인 값들로 구성이 되기 때문에, 비율을 측정할 수 없어 Stratified K-Fold를 사용할 수 없어 K-Fold를 사용한다. 

 

즉, 분류에서는 Stratified K-Fold를 사용하고, 회귀에서는 K-Fold를 사용한다고 생각하면 된다. 

 

from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import KFold

로 K-Fold 교차 검증을 수행할 수도 있지만, scikit-learn에서는 다른 과정들과 합쳐 더욱 간편하게 사용할 수 있는 API를 사용한다. 

 

 

 

cross_val_score()이라는 함수는 

 

1. 폴드 세트를 설정하고, 

2. for 루프에서 반복으로 학습 및 테스트 데이터의 인덱스를 추출한 뒤

3. 반복적으로 학습과 예측을 수행하고 예측 성능을 반환한다.

 

from sklearn.model_selection import cross_val_score

cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

 

cross_val_score의 주요 파라미터는 estimator, X, y, scoring, cv이다. 

 

estimator : 분류 알고리즘 클래스 혹은 회귀 알고리즘 클래스를 인자로 넣어주어야 한다. 
(분류 알고리즘이면 Stratified K-Fold를, 회귀 알고리즘이면 K-Fold가 적용된다.)

X : 피처 데이터 세트
y : 레이블 데이터 세트 

scoring : 예측 성능 평가 지표의 기준

cv : 교차 검증 폴드 수 

 

cross_val_score() 반환 값scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환한다. 요소의 개수는 cv(폴드 수)만큼 들어있다. 그리고 일반적으로 이를 평균한 값을 평가 수치로 사용한다. 

 

cross_validate()는 cross_val_score()가 단 하나의 평가 지표만 가능한 반면, 여러개의 평가 지표를 반환할 수 있고, 성능 평가 지표와 수행 시간도 같이 제공한다. 

일반적인 경우에는 cross_val_score()로 사용한다. 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기