본문 바로가기

머신러닝/혼자 공부하는 머신러닝

12강 교차 검증과 그리드 서치

이 글은 https://www.youtube.com/watch?v=ZaIKUvHquEQ&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=12 보고 공부한 글입니다.

 

지난시간에 

와인을 성분만으로 구분해본다.

 

로지스틱 회귀로 만들면 특성마다 가중치가 나올 것이다.

 

결정트리로 질문을 던지면서 맞추는 모델이다.

 

sugar 가 -0.239 라고 기준을 정하는 것은 불신도이다.

음성 클래스가 없다면 불신도가 0인 순수한 노드가 될 것이다. 

 

비슷한 샘플이 있다면 불신도가 높다.

 

 

검증 세트 

훈련 세트에서 훈련하고 테스트 세트로 메개변수(max_depth)를 튜닝 할 수 있다.

 

그러면 테스트세트에 잘맞게 튜닝되는것 아닌가?

 

사실은 3개의 세트로 나눈다.

원래 처음 배울 때는 안하다가 중반부 부터 배운다.

 

원래 검증 세트까지 사용하는 것이 올바른 방법이다.

 

테서트 세트는 최종 모델의 서비스 성능을 예측하는대 쓰인다. 그런데 타겟이 없다.

특성을 가지고 예측만 하는 것이다.

 

훈련세트에서 모델을 훈련, 튜닝하고 테스트 세트를 딱 처음봤을 때 

처음 본 데이터(실전에서 쓰이는 데이터)에 어느 정도 성능을 내는지 확인해 보고 싶다. 

 

 

 

검증 세트(개발 세트)를 사용하면 된다.

 

훈련 세트를 한번더 나눠서 매개변수(하이퍼 파라미터) 튜닝을 한다.

 

test_size가 0.2인 것은 20%로 나눈는 것이다.

 

sub_input, target은 모델을 훈련하고

val_input, target은 매개변수를 찾는 것이다.

 

마지막에 테스트 세트를 사용하기 전에 sub_input, sub_target을 더한다

 

모델훈련할 때 데이터가 많을 수록 좋다.

 

검증 세트에서 최적의 파라미터를 찾으면 훈련세트와 묶어서 다시 최종 훈련을 진행한다.

 

그 후 테스트 세트를 사용한다.

 

 

 

교차 검증 

검증 세트를 때어내서 매개변수를 튜닝하는 것

 

훈련 세트가 크지 않다면 20%를 때는 것이 부담스러울 수 있다.

3덩어리로 나눈다 (덩어리 = 폴드)

 

3번째 폴드를 검증세트로 사용해서 모델 평가한다.

2번째 폴드를 검증세트로 사용해서 모델 평가한다.

1번째 폴드를 검증세트로 사용해서 모델 평가한다.

 

모델평가 점수가 3개가 나온다.

이것을 평균하면 검증 세트를 한번만 나눴던 것과 동일하게 나온다.

 

잘라낸 각 폴드를 교대로 사용하면서 검증을 얻는 것이다.

 

사이킷 런에 cross_validate함수가 있다.

처음에 나눴던 train_input,target을 가지고 알아서 검증세트(폴드)를 바꿔가면서 진행한다.

 

기본적으로 5폴드를 사용한다. 

5개의 모델을 만든다. 

test_score = 검증세트점수

 

5개의 값을 numpy.mean하면 평균을 낼 수 있다.

 

여기서 dt(결정트리)를 만들 때 매개변수를 사용해서 만들 탠데 

이 때 매개변수에서 얻을 수 있는 값이 85%구나 라고 알 수 있다.

 

매개변수를 바꿔가면서 검증하면 된다.

 

검증 세트 + 훈련세트 = 교차검증

 

 

분할기를 사용한 교차 검증 

분할기 = spliter

cv가 5개 폴드를 기본적으로 나눈다.

10개의 폴드를 쓰고 싶다하면 cv=10으로 쓰면 된다.

 

spliter라는 객체를 지정해서 나누는 동작을 상세하게 지정할 수 있다.

 

회귀일 때 KFold라는 스플릿을 사용한다.

분류일 때 StratifiedKFold라는 스플릿을 사용한다. 

 

dt가 분류일 때는 자동적으로 StratifiedKFold가 동작된다.

dt가 회귀일 때는 자동적으로 KFold가 동작된다.

 

StratifiedKFlod객체를 만들 때

n_splits로 폴드의 갯수를 정하고 

랜덤하게 섞어서 쓰고다면 shuffle을 True로 만든다.

 

 

그리드 서치 

매개변수 바꿔서 교차검증을 반복하는 것이다.

 

maxdepth

min_impurity_decrease

2개의 값이 있다.

 

maxdepth의 최적값을 변경하려고 찾아봤더니 3이다.

min_impurity_decrease 최적값을 변경하려고 찾아봤더니 0.1이다.

순차적으로 찾을 수 없다.

 

0.1일 때 3이 아닐 수 있다. 

어떤 매개변수를 찾고 그 다음 매개변수를 찾는 것을 못한다.

 

 

매개변수를 딕셔너리로 지정한다. 

 

부모와 자식노드간의 불순도의 차이 = 정보이드

정보이드가 클 수록 좋다.(=분할을 잘했다.)

 

정보이들의 최솟값을 지정한다.

부모와 자식노드간의 불순도가 0.1도 안되면 분할 하지 마 라는 뜻이다. 

 

min_impurity_decrease 매개변수 이름은 문자열로 만들고

원하는 값들을 리스트로 만들어서

딕셔너리로 만든다. 

 

 

교차점증할 때 5개의 폴드를 사용한데 그런데 5개의 매개변수를 주니

25개의 모델이 사용된다. 

 

n_job으로 코어갯수를 지정하는 것이다.

-1은 가능한 모든 코어를 사용하는 것이다.

 

best_estimator에 최적의 값을 넣어준다.

 

최적의 파라미터를 찾으려면

gs.best_params_를 하면 나온다.

5개중에 0.0001이 가장좋다.

 

교차검층은 mean_test_score에 값이 들어가 있다. 

 

 

 

확률 분포 선택 

scipy의 uniform과 randint의 클래스이다.

균등 분포에서 샘플링이다. 

0~10이면 0이 10번 나오면 10도 10번나온다.

 

0~10 까지 범위를 정하고  균등하게 rgen에 넣는다.

rvs = 랜덤 변수 샘플링 

마지막 원소는 포함하지 않는다.

 

unique로 고유한 값의 갯수를 볼 수 있다. 

 

균등하게 랜덤 샘플된것으로 매개변수 탐색을 해본다. 

 

 

랜덤 서치 

0.0001 과 0.001 사이의 랜덤 샘플링 해서 매개변수 찾기

20~ 49 사이의 랜덤 새플링 해서 매개변수 찾기

...

 

이렇게 params 객체를 만든다.

 

 

RandomizedSearchCv로 매개변수를 구해본다. 

 

n_iter가 모델을 만들 갯수이다. = 샘플링 100번 

 

cv_result_['mean_test_score']의 최대값best_params_로 찾은 검증세트의 점수

87%정도 된다.

 

train_input 전체를 훈련한 모델이 best_estimator_

 

여기서 DecisionTreeClassifier를 구하려고 했으니 그에 best가 나올 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

728x90