본문 바로가기

Study/Introduction to ML with python - 한빛

[Book] 5. 모델 평가와 성능 향상 - (1)

 

Book Title : Introduction to Machine Learning with Python

- 파이썬 라이브러리를 활용한 머신러닝 -

 

지은이 : 안드레아스 뮐러, 세라 가이도

옮긴이 : 박해선

출판사 : 한빛미디어

 

코드 출처

https://github.com/rickiepark/introduction_to_ml_with_python

 

GitHub - rickiepark/introduction_to_ml_with_python: 도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의

도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의 주피터 노트북과 코드입니다. Contribute to rickiepark/introduction_to_ml_with_python development by creating an account on GitHub.

github.com


5. 모델 평가와 성능 향상

  • 모델이 훈련 세트에 잘 맞는 것보다, 학습 과정에 없던 데이터에 대해 예측을 얼마나 잘하느냐가 중요한데 이 관점에서 평가 방법을 확장 설명

5.1 교차 검증(cross-validation)

  • 일반화 성능을 재기 위해 훈련 세트와 테스트 세트로 한 번 나누는 것보다 더 안정적이고 뛰어난 통계적 평가 방법
  • 데이터를 여러번 반복해서 나누고 여러 모델 학습
  • K-겹 교차검증(k-fold)가 가장 널리 사용

K-fold 교차 검증 과정(5겹)

  1. 데이터를 폴드(거의 비슷한 크기의 ‘부분 집합’ 5개로 나눔
  2. 일련의 모델 생성
  3. 1 번째 모델 :  1 번째 폴드를 테스트 세트로 사용,  2~5번째 폴드를 훈련 세트로 학습
  4. 2 번쨰 모델 :  2 번째 폴드를 테스트 세트로 사용, 1, 3, 4, 5를 훈련 세트로 학습
  5. 3,45번째 모델 반복

5.1.1 scikit-learn 교차 검증

1. model_selection 모듈의 cross_val_score사용,   cross_validate 함수도 사용 가능

iris = load_iris()
logreg = LogisticRegression(max_iter = 1000)

# 5 겹 교차검증
scores = cross_val_score(logreg, iris.data, iris.target)
print("교차 검증 점수", scores)
print("=" * 100)
scores = cross_val_score(logreg, iris.data, iris.target, cv =10)
print("10겹 교차 검증 점수", scores)

print("=" * 100)
print("cross_validate")
# cross_validate : 훈련과 테스트에 걸린 시간이 포함된 딕셔너리
res = cross_validate(logreg, iris.data, iris.target, return_train_score=True)
display(res)

  • 하지만 k개의 폴드로 나누는 것이 항상 좋은 건 아님
  • 단순한 k-겹 교차 검증에 문제가 있는 경우, 계층별 k-겹 교차 검증(stratified k-fold cross-validation)을 사용

2.OOCV(Leave-One-Out cross-validation)

  • 폴드 하나에 샘플 하나만 들어 있는 k-겹 교차 검증이라고 생각할 수 있음
  • 각 반복에서 하나의 데이터 포인트를 선택해 테스트 세트로 사용
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv =loo)
print("교차 검증 분할 횟수:", len(scores))
print("평균 정확도 :", scores.mean())

############
교차 검증 분할 횟수: 150
평균 정확도 : 0.9666666666666667

 

3. 임의 분할 교차 검증(shuffle-split cross-validation)

  • train_size 만큼의 포인트로 훈련 세트를 만듦
  • test_size만큼의 포인트로 테스트 세트를 만들도록 분할
  • 분할은 n_splits 횟수 만큼 반복
  • 반복 횟수를 훈련 세트나 테스트 세트의 크기와 독립적으로 조절해야 할 때 유용

4. 그룹별 교차 검증

  • 데이터 안에 매우 연관된 그룹이 있을 떄도 교차검증 사용