본문 바로가기
Programming/Python

[ML] Cross Validation(CV; 교차검증), Grid Search

과적합(overfitting) 방지 목적.  <-> 데이터 부족으로 인한 underfitting (이도저도 아닌 부정확상태)

단점: iteration 횟수 多 -> 모델 훈련, 시간 걸림.

 

Cross-validation method varies

Holdout: train set을 9:1 or 7:3 등 임의 비율로 test과 split -> Iteration 1번만 함. (시간 덜 드는 방법)

 

 

 

 

K-fold cross: general method. k개로 분할 및 data set구성. iteration마다 test set 다르게 할당. k번 iteration

                       -> 각 검증 결과들의 평균으로 model 성능 파악.    

                           보통 k 값은 3, 5, 10을 많이 사용한다

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
X = iris.data
y = iris.target  # 기본 데이터 설정

from sklearn.neighbors import KNeighborsClassifier # 특정 알고리즘. k = 개수
model = KNeighborsClassifier(n_neighbors=3) # 이 숫자가 k. 무작위 3개 동일 크기 fold 분할

neighbors: 말 그대로 neighborhood 개념(해석학 느낌). 주변 범위를 설정하는 알고리즘

                  classfier -> 해당 주변범위를 분류하는 model

 

 

 

score: 평가 지표

cross_val_score(모형종류, X, Y, cv = 반복횟수)

                              ↘ 회귀 또는 분류인지 결정

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv = 5)  # cv = 반복 횟수
print(scores, '\n')
print('평균: ', scores.mean())

[0.96666667 0.96666667 0.93333333 0.96666667 1.        ] 

평균:  0.9666666666666668

 

 

 

 

 

Leave - p - out: nCp 개의 test set만큼 iteration. (계산시간 부담 매우 큼)

Leave - one - out(LOOCV; 단일관측치 제거법): p일때보다 더 선호됨.(p=1)인 경우에 해당. 

Namely, fix test samples at every stage.   

데이터(크기) n개 subset 분할 -> n개 중 1개(one,단일 관측치) 테스트용으로 두고 n-1개로 학습 수행

-> n번의 교차검증(CV) 수행

from sklearn.model_selection import LeaveOneOut
scores = cross_val_score(model, X, y, cv = LeaveOneOut()) #cv에 해당 방법 삽입
print(scores, '\n')
print('평균: ', scores.mean())

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1.
 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1.] 

평균:  0.96

 

 

 

 

 

ShuffleSplit(임의분할): data set을 설정한 비율로 무작위 분할 

test size= 0.3 -> test set이 3인 비율.(입력시 train size= 생략해도 알아서 설정) n splits = 분할 반복횟수

정수 입력시 진짜 데이터 개수. 실수입력시 비율로 인식

일부러 test size, train size를 따로 입력하되 전체보다 작게 입력하여 일부 데이터만 사용하는 것도 可

각 size를 독립적으로 조절해서 전체의 일부만 돌리고 싶을 때 유용한 방식

from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=0.3, n_splits=10)
scores = cross_val_score(model, X, y, cv=shuffle_split)
print(scores, '\n')
print('평균: ', scores.mean())

[0.97777778 0.97777778 0.95555556 0.97777778 0.97777778 1.
 0.97777778 0.88888889 0.97777778 0.91111111] 

평균:  0.9622222222222222

 

 

 

 

 

 

cross_validate( ) 사용하기

Regression 모델일 경우 KFold 분할, Classification 모델일 경우 StratifiedKFold방식 사용하는 함수

Stratified K-fold: classification 문제에서 주로 사용. label 분포가 불균형할 때 사용

from sklearn.model_selection import cross_validate

scores = pd.DataFrame(cross_validate(model, X, y, cv = 5))
print(scores, '\n')
print('평균: ', scores.test_score.mean())

   fit_time  score_time  test_score
0  0.000648    0.002018    0.966667
1  0.000000    0.002430    0.966667
2  0.000992    0.001994    0.933333
3  0.000000    0.002501    0.966667
4  0.000000    0.001998    1.000000 

평균:  0.9666666666666668

[딕셔너리 반환]

 - 'fit_time' : 모델 훈련 소요시간

 - 'score_time' : 모델 검증 소요시간

 - 'test_score' : 교차검증의 최종 점수

 

 

 

 

parameter(파라미터): 모형, 데이터에 의해 정의된 모든 값.

Hyper parameter(하이퍼파라미터): 모든 ML 사용자 설정 값. (practitioner;custom value)

 

Grid Search(격자탐색):  find best hy-param for model  https://heytech.tistory.com/389

 

[딥러닝] Grid Search, Random Search, Bayesian Optimization

👨‍💻 들어가며 본 포스팅에서는 딥러닝 분야에서 하이퍼파라미터 최적화 방법 3가지인 Grid Search, Random Search, Bayesian Optimization에 대해 알아봅니다. 📚 목차 1. Grid Search 2. Random Search 3. Bayesian Op

heytech.tistory.com

하이퍼파라미터 최적화 방법 3가지인 Grid Search, Random Search, Bayesian Optimization 있음 (딥러닝에서 특히)

 

이건 나중에 다시 정리하자..

 

 

728x90
반응형