model_selction모듈: 학습데이터·테스트데이터 세트 분리하거나 교차검증 분할 및 평가, Estimator의 하이퍼 파라미터를 튜닝하기 위한 다양한 함수와 클래스를 제공
train_test_split() 파라미터
피처 데이터 세트
레이블 데이터 세트
(선택)
test_size: 전체 데이터 중 테스트 데이터 세트 %, 디폴트는 0.25
train_size: 전체 데이터 중 학습용 데이터 세트 크기. (test_size를 통상적으로 사용. 잘 안씀)
shuffle: 데이터 분리 전 데이터 미리 섞을지, 디폴트 True
random_state: 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값, 지정 안하면 매번 다른 학습/테스트용 데이터 세트
반환값은 튜플 형태 - 순차적으로 학습용데이터의 피처데이터세트, 테스트용데이터의 피처데이터세트, 학습용데이터의 레이블데이터세트, 테스트용데이터의 레이블데이터세트

학습/테스트 분리해도 과적합Overfitting 위험성
Overfitting: 모델이 학습 데이터에만 과도하게 최적화되는 것. 다른 데이터로 예측 수행하면 성능이 과도하게 떨어짐
-> 교차 검증을 이용해 더 다양한 학습과 평가를 수행->데이터 편중 막음
교차 검증: 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것
테스트 데이터 세트 외에 별도의 검증 데이터 세트를 둬 최종 평가 이전에 학습된 모델을 다양하게 평가하는데 사용
대부분의 ML모델 성능평가- 교차 검증 기반으로 1차평가 뒤에 최종으로 테스트 데이터에 적용해 평가
K개의 데이터 폴드 세트를 만들어 K번만큼 각 폴트 세트에 학습과 검증 평가를 반복적으로 수행

사이킷런에서 KFold와 StratifiedKFold 클래스 제공
생성된 KFold 객체의 split() 호출해 전체 붓꽃데이터를 5개의 폴드 데이터 세트로 분리, 학습용/검증용 데이터로 분할할 수 있는 인덱스 반환 -> 추출은 직접 개발 코드로 수행
학습용 데이터는 4/5인 120개, 검증데이터 세트는 1/5인 30개

불균형한 분포도(특정 레이블 값이 특이하게 많거나 매우 적음)를 가진 레이블 데이터 집합을 위한 K폴드 방식
ex. 대출 사기 데이터 예측- 데이터세트 1억건 중 0.0001% 대출 사기 레이블 1 -> 랜덤으로 학습/데이터 세트 인덱스 골라도 레이블 값 0,1의 비율의 반영 어려움
대출사기 레이블이 1인 레코드는 건수 작지만 중요함->원본 데이터와 유사한 대출 사기 레이블 값의 분포 유지해야함
=>원본데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터를 분배
i) 붓꽃 데이터세트 레이블 값의 분포도 확인
레이블 값별 레코드 개수 동일
ii) 3개의 폴드 세트를 KFold로 생성, 각 교차검증시마다 생성되는 학습/검증 레이블 데이터값 분포도 확인
각 폴드 세트마다 같은 레이블 값별로 묶임-> 예측정확도 0
iii) StratifiedKFold로 해결: 전체 레이블 값의 분포도 반영
->split()메서드 인자로 피처데이처 세트 뿐만아니라, 레이블 데이터 세트도 필요
iv) StratifiedKFold 반영해서 학습, 테스트 수행

+ 분류Classification에서의 교차검증은 Stratified K폴드로 분할, 회귀Regression의 결정값은 연속된 숫자값이라 결정값별 분포는 무의미
KFold :
1) 폴드 세트를 설정
2) for 루프에서 반복으로 학습/테스트 데이터 인덱스 추출
3) 반복적으로 학습과 예측을 수행, 예측 성능을 반환
cross_val_score()는 이 일련의 과정을 한꺼번에 수행해주는 API
cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit params=None, pre_dispatch='2*n_jobs')
estimator: 사이킷런 분류 알고리즘 클래스 Classifier or 회귀 알고리즘 클래스 Regressor
X: 피처 데이터 세트
y: 레이블 데이터 세트
scoring: 예측 성능 평가 지표 (1개)
cv: 교차 검증 폴드 수
반환값: scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환
classifier입력 -> Stratified K 폴드 방식 진행, Regressor입력->K 폴드 방식

StratifiedKFold와 결과 동일
+ cross_validate(): 여러 개의 평가 지표 반환 가능
하이퍼 파라미터 값을 조정해 알고리즘 예측 성능 개선 가능
GridSearchCV API로 Classifier나 Regressor에서 사용하는 하이퍼 파라미터 순차적으로 입력해 편리하게 최적의 파라미터 도출 방안 제공
교차검증 기반
ex. 결정트리알고리즘의 하이퍼 파라미터들 변경하며 최고 성능 가지는 파라미터 조합 찾기:
파라미터의 집합 만들고 순차적으로 적용
grid_parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}
총 6회 실행
GridSearchCV 파라미터:
estimator: classifier, regressor, pipeline
param_grid: key+리스트 딕셔너리. estimator 튜닝을 위한 파라미터 지정
scoring: 예측 성능 평가 지표
cv: 교차 검증을 위해 분할되는 학습/데이터 세트 개수 지정
refit: default True->최적의 파라미터 찾은 뒤 estimator객체를 해당 파라미터로 재학습
cv_results_ 딕셔너리 형태의 결과 세트
best_params_ 최고의 성능을 나타낸 하이퍼 파라미터
best_score_ 그때의 평가 결과

