매일공부

[Machine Learning] 교차검증 본문

IT/ML

[Machine Learning] 교차검증

aram 2022. 11. 21. 18:01

 

모델 정확도 평가; 오차측정 지표  >> https://dailystudy.tistory.com/95

 

  지도학습 회귀/분류 모형구성 후보모형 성능 평가 최종 모형 튜닝
1. Data Set 수집 2. Feature 추출 3. 학습 Model 선정 4. Model 평가 5. Model 최적화
  비지도학습 세그먼트 분류 세그먼트 통계량 분석 세그먼트 프로파일 정의

 

<분류분석에서 사용되는 측정 지표>

  • 정확도(Accuracy) 
  • 오차 행렬(confusion matrix)
  • 정밀도(precision)
  • 재현율(recall)
  • F1 스코어
  • ROC AUC

 


교차 검증

- 과적합 : 모델이 학습 데이터에만 과도하게 최적화되어, 실제 예측은 다른 데이터로 수행할 경우에는 예측 성능이 떨어지는 것

- 교차 검증
: 데이터를 학습용/평가용 데이터 세트여러 번 나누고 모델을 학습하여 평균적인 성능을 계산, 평가하는 방법
: 한 번 나누어서 학습하는 것에 비해 일반화된 성능을 얻을 수 있기 때문 (안정적이고 뛰어난 통계적 평가 방법)
: 하이퍼파라미터모델최적화 시, 최적의 조건을 찾는 데에 활용
: 모든 데이터를 평가와 학습에 사용할 수 있어 머신러닝 알고리즘의 일반화된 성능을 얻을 수 있다
: 모든 데이터를 평가와 학습에 사용할 수 있어 연산 비용(memory, cpu, 시간)이 증가

 

- K-Fold 교차 검증(KFCV)

  • from sklearn.model_selection import KFold  (n_splits=, shuffle=, random_state=)
  • K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
  • KfoldStratifiedKFold 클래스 제공

  • 데이터를 폴드(fold)라고 부르는 k개의 부분을 나눔
    > k-1개 폴드를 하나의 훈련 세트로 합쳐 모델을 훈련하고 남은 폴드를 테스트 세트처럼 사용
    > 이를 k번 반복마다 다른 폴드를 테스트 세트로 사용
    > k번 반복해서 얻은 모델 성능을 평균하여 최종 성능 산출

  • 각 샘플이 다른 샘플과 독립적으로 생성되었다고 가정하므로,
    KFCV를 사용하여 분류기를 평가할 때, 각 타깃 클래스의 샘플거의 같은 비율로 폴드 구성을 권장
더보기
from sklearn import datasets 
from sklearn import metrics 
from sklearn.model_selection import KFold, cross_val_score 
from sklearn.pipeline import make_pipeline 
from sklearn.linear_model import LogisticRegression 
from sklearn.preprocessing import StandardScaler

digits = datasets.load_digits() # 데이터셋 로드 
features = digits.data # 특성 행렬을 만듭니다.
target = digits.target # 타깃 벡터를 만듭니다.
standardizer = StandardScaler() # 표준화 객체를 만듭니다.
logit = LogisticRegression() # # 로지스틱 회귀 객체를 만듭니다 

# 표준화한 다음 로지스틱 회귀를 실행하는 파이프라인을 만듭니다.
pipeline = make_pipeline(standardizer, logit)

# k-폴드 교차검증을 만듭니다. (10 개의 폴드를 만듦)
kf = KFold(n_splits=10, shuffle=True, random_state=1) 

# k-폴드 교차검증을 수행합니다.
cv_results = cross_val_score(pipeline, features, target, cv=kf, # 교차 검증 기법 
                             scoring="accuracy", # 평가 지표 
                             n_jobs=-1) # 모든 CPU 코어 사용
cv_results.mean() # 평균을 계산 
cv_results ## 10개 폴드의 점수를 모두 확인(평가 점수는 cv_results에 저장)
array([0.97777778, 0.98888889, 0.96111111, 0.94444444, 0.97777778,
          0.98333333, 0.95555556, 0.98882682, 0.97765363, 0.93854749])

 

- StratifiedKFold

: from sklearn.model_selection import StratifiedKFold 
: 불균형한 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한 K 폴드 방식

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=3)

for train_index, test_index in skf.split(iris_df, iris_df['label']):
    label_train = iris_df['label'].iloc[train_index]
    label_test = iris_df['label'].iloc[test_index]
    print('학습데이터 label 분포:', label_train.value_counts())
    print('검증데이터 label 분포:', label_test.value_counts())
    print('-------------------------------')

 

- StratifiedShuffleSplit

: from sklearn.model_selection import ShuffleSplit  ( n_splits=, train_size=, test_size=, random_state= )
: 계층별 교차 검증
: 반복 횟수에 상관없이 훈련 폴드와 테스트 폴드 크기를 임의로 지정할 수 있음
: 반복마다 랜덤하게 분할하기 때문에 하나의 샘플이 여러 번 테스트 폴드에 포함될 수 있음

 

- 정확도와 정밀도를 사용한 교차검증

: from sklearn.model_selection import cross_validate
: cross_validate(logit, X, y, scoring=["accuracy", "precision"])
: scoring 매개변수에 여러 개의 평가 지표를 추가가능

- sklearn.model_selection.cross_val_score(estimator, X, y, cv)
: cv 매개변수를 지정하지 않으면 회귀일 때는 KFold, 분류일 때는 StratifiedKFold 분할기가 사용됨 
: cv 매개변수에 정수를 입력하여 기본 분할기의 폴드 수를 지정할 수 있습니다.

 

-1 * metrics.mean_absolute_error() = neg_mean_absolute_error  로 보정하는 이유? 

사이킷런의 score()는 값이 클수록 좋은 평가 결과로 자동 평가하기 때문

 

※ cross_val_score나 GridSearchCV와 같은 sklean의 Scoring 함수에 회귀 평가 적용시 주의할 점

scoring 함수에 회귀 평가 지표를 적용 할 때는
MAE => 'neg_mean_absolute_error'로,
MSE => 'neg_mean_squared_error'로,
R제곱 => 'r2'
scoring 파라미터에 적어주는데,
sklearn에서는 score값이 클수록 좋은 평가 결과로 자동 평가
>> 실제 값과 예측 값의 오류 차이를 기반으로 하는 회귀 평가 지표의 경우 값이 커지면 오히려 나쁜 모델이라는 의미
>> 이를 사이킷런의 Scoring 함수에 일반적으로 반영하려면 보정 필요 
>> -1을 원래의 평가 지표 값에 곱해서 음수를 만들어 작은 오류 값이 더 큰 숫자로 인식하게 함.

 

Evaluation2. 회귀의 성능 평가 지표(MAE, MSE, RMSE, R제곱)

권철민 강사님의 '파이썬 머신러닝 완벽 가이드'을 학습하고 정리한 것입니다. 배우는 중이라 잘못된 내용이 있을 수 있으며 계속해서 보완해 나갈 것입니다. :)) 머신러닝의 프로세스는 - 데이

libertegrace.tistory.com

 

 

* 내용참고&출처 : 태그에서 수강한 수업을 복습 목적으로 정리한 내용입니다.

Comments