모델을 학습 시켰다면, 검증 과정을 통해 모델이 과적합 혹은 과소적합에 빠지지 않도록 조정해야 한다. 이번 글에서는 K-Fold, Stratified K-Fold, cross_val_score(), GridSearchCV()에 대해 소개한다.
K-Fold
이전 장에서 소개한 train_test_split()은 한 가지 문제점을 가지고 있다. 고정된 train셋과 test셋을 이용하면 특정 test셋에 편향되게 학습될 수 있다. 이러한 현상을 과적합(overfitting)이라고 한다. 학습에 이용한 test셋을 이용하여 평가할 경우 매우 높은 성능을 보이지만 다른 test셋을 이용하면 성능이 현저히 떨어지는 것이다.
K-Fold는 train셋과 test셋을 나누는 과정을 k번 진행하고 k번 학습한다. 그 후 각각의 검증 결과를 평균을 내서 정확도를 산출하게 된다. 따라서 모든 데이터가 한 번씩은 test셋에 포함될 수 있도록 한다. 위의 그림처럼 k=5로 지정할 경우, 총 5번 데이터셋을 나누고 5번 학습하게 된다. 이러한 방식으로 학습하고 성능을 평가하면 특정 test셋에 고정적으로 학습하는 것이 아닌 여러 test셋을 이용하게 되므로 과적합을 피할 수 있게 된다.
Stratified K-Fold
그런데 K-Fold도 한 가지 문제점을 가지고 있다.
폐암 발병을 예측하는 모델을 만든다고 가정하자. 10000개의 데이터로 이루어져 있고 폐암환자의 데이터는 그 중 1%밖에 되지 않는 100개의 데이터를 가진다. K-Fold를 이용하였을 때 만약 test셋에 모든 폐암환자 데이터가 들어가게 된다면 train셋에는 폐암환자 데이터가 1개도 없게 되고 당연히 예측 모델은 학습이 될 수 없다. 모든 데이터를 환자가 아니라고 예측할 수 밖에 없다.
이렇게 각 label의 데이터 개수가 크게 차이가 나게 된다면 특정 label이 골고루 분포하지 못하여 학습이 정상적으로 진행되지 않을 수 있다. Stratified K-Fold는 이러한 문제점을 해결하기 위해 각 label이 train셋과 test셋에 골고루 분포할 수 있도록 설계되어 있다. 이를 이용하면 label이 편중되어 학습이 어려워지는 상황을 피할 수 있다.
따라서 왜곡된 label을 가진 데이터셋에서는 반드시 Stratified K-Fold를 이용해 교차검증 해야한다.
※회귀에서는 Stratified K-Fold가 지원되지 않는다. 회귀의 target은 이산값이 아닌 연속형이기 때문에 target별로 분포를 정하는 것이 의미가 없기 때문이다.
cross_val_score()
사이킷런은 교차검증을 편리하게 수행할 수 있게 해주는 함수를 제공한다.
사용된 인자들은 cross_val_score()에서 필수적으로, 혹은 자주 사용되는 인자들이다.
- 사용할 estimator(Classifier, Regressor 등의 모델)
- X 즉, feature데이터셋
- y 즉, label데이터셋
- scoring = 사용할 성능 평가 지표
- cv = 교차 검증 fold 수
cross_val_score()는 기본적으로 Stratified K-Fold를 이용한다.
scores에는 각 시행의 결과를 리스트 형태로 저장한다. cv=3이었으므로 총 3개의 정확도 값이 저장된 리스트를 반환한다.
GridSearchCV
GridSearchCV 클래스는 교차검증을 기반으로 estimator의 하이퍼 파라미터의 최적값을 찾도록 도와준다.
※하이퍼 파라미터(Hyper parameter): 사용자가 직접 세팅해주는 파라미터
DecisionTreeClassifier(결정트리)를 예로 들어보자. max_depth(최대 깊이), min_samples_split 등은 학습에 큰 영향을 미치는 중요한 하이퍼 파라미터이다. 이를 일일이 입력해보며 결과를 비교하는 것 보다 한 번에 GridSearchCV를 이용하여 비교하면 훨씬 더 간편하게 최적의 하이퍼 파라미터를 찾을 수 있다.
다음과 같이 사용할 하이퍼 파라미터를 key값으로 가지고 그 하이퍼 파라미터의 를 지정해주고, GridSearchCV의 param_grid에 지정해주면 각각의 하이퍼 파라미터를 이용하여 학습한 후 결과를 나타내준다.
GridSearchCV의 주요 생성자는 다음과 같다.
- 사용할 estimator
- param_grid: 딕셔너리 형태의 데이터를 입력받으며, estimator의 튜닝에 사용될 하이퍼 파라미터와 그 값들을 지정한다(결정트리에서는 max_depth, min_samples_split등이 있음).
- scoring = 사용할 성능 평가 지표
- cv = 교차 검증 fold 수
- refit = True일 경우 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 하이퍼 파라미터로 재학습 한다.
#이 글은 권철민 작가님의 [파이썬 머신러닝 완벽가이드]를 통해 공부한 내용을 바탕으로 정리하였습니다.
'Machine Learning > Preprocessing' 카테고리의 다른 글
하이퍼 파라미터 튜닝 기법 (Grid Search, 베이지안 최적화) (0) | 2022.08.05 |
---|---|
타이타닉 생존자 예측 (0) | 2022.05.09 |
피처 스케일링(feature scaling) (0) | 2022.05.08 |
데이터 인코딩 (Data Encoding) (0) | 2022.05.08 |
train_test_split(), fit(), predict() (0) | 2022.05.08 |