과적합(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
하이퍼파라미터 최적화 방법 3가지인 Grid Search, Random Search, Bayesian Optimization 있음 (딥러닝에서 특히)
이건 나중에 다시 정리하자..
'Programming > Python' 카테고리의 다른 글
[ML] KN 분류 알고리즘 (기본편) (0) | 2023.09.11 |
---|---|
[ML] Gradient Descent(경사하강법) (1) | 2023.09.07 |
[ML] 기본 데이터 정리 및 split (iris 예제) (1) | 2023.09.06 |
[ML] Scikit_learn introduction (0) | 2023.09.06 |
데이터 전처리3 (Correlation) (0) | 2023.09.05 |