본문 바로가기
ML

[ML] 사이킷런 주요 모듈 / Model Selection :: 학습/테스트셋 분리, 교차 검증, GridSearchCV (작성 중)

by hyeeein 2024. 11. 22.

01. 사이킷런 기반 프레임워크

사이킷런은 API 일관성과 개발 편의성을 제공하기 위한 패키지

→ ML 모델 학습을 위해 fit(), 학습된 모델의 예측을 위해 predict() 메서드 제공

 

Estimator 클래스는 분류 알고리즘을 구현한 클래스를 Classifier, 회귀 알고리즘으로 구현한 클래스를 Regressor로 칭하는데 이를 합쳐서 Estimator 클래스라고 부름. 즉, 분류(Classifier) + 회귀(Regression)

 

→ 교차 검증에 활용하는 cross_val_score(), 교차 검증과 하이퍼 파라미터 튜닝을 동시에 수행하는 GridSearchCV.fit() 함수도 이 Estimator의 fit()과 predict()를 호출하여 평가하거나 튜닝을 수행하는 것

 

  • fit() : 학습의 의미가 아니라, 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업
  • transform() : 입력 데이터의 차원 변환, 클러스터링, 피처 추출 등의 실제 작업을 수행하는 것
  • fit_transform() : fit과 transform을 한 번에 결합한 것

Q. 이 3가지의 차이는 뭘까?

 

 

 

 

Estimator 클래스는 학습 fit(), 예측 predict()을 수행. 상세 분류는 아래 두 가지로 나뉨.

 

분류 구현 클래스 (Classifier)

DecisionTreeClassifier, RandomForestClassifier, GradientBoostingClassifier, CaussianNB, SVC

 

회귀 구현 클래스 (Regressor)

LinearRegression, Ridge, Lasso, RandomForestRegressor, GradientBoostingRegressor


02. 사이킷런의 주요 모듈

분류 모듈명 설명
예제 데이터 sklearn.datasets 사이킷런에 내장되어 예제로 제공하는 데이터 세트

[분류와 회귀 연습용 예제 데이터]
* datasets.load_boston() : 미국 보스턴의 집 피처들과 가격에 대한 데이터셋 (회귀)
* datasets.load_breast_cancer() : 위스콘신 유방암 피처 및 악성/음성 레이블 데이터셋 (분류)
* datasets.load_diabetes() : 당뇨 데이터셋 (회귀)
* datasets.load_digits() : 0~9까지 숫자 이미지 픽셀 데이터셋 (분류)
* datasets.load_iris() : 붗꽃에 대한 피처 데이터셋 (분류)

[분류와 클러스터링을 위한 표본 데이터 생성기]
* datasets.make_classifications() : 분류를 위한 데이터셋을 만듦. 높은 상관도, 불필요한 속성 등의 노이즈 효과를 위한 데이터를 무작위로 생성.
* datasets.make_blobs() : 클러스터링을 위한 데이터셋을 무작위로 생성. 군집 지정 개수에 따라 여러 가지 클러스터링을 위한 데이터셋을 쉽게 만듦.
피처 처리 sklearn.preprocessing 데이터 전처리에 필요한 다양한 가공 기능 제공
(문자열을 숫자형 코드 값으로 인코딩, 정규화, 스케일링 등)
sklearn.feature_selection 알고리즘에 큰 영향을 미치는 피처를 우선순위대로 셀렉션 작업을 수행하는 다양한 기능 제공
sklearn.feature_extraction 텍스트 데이터나 이미지 데이터의 벡터화된 피처를 추출

텍스트는 sklearn.feature_extraction.text 모듈
이미지는 sklearn.feature_extraction.image 모듈

예) Count Vectorizer, Tf-idf Vectorizer
피처 처리 & 차원 축소 sklearn.decomposition 차원 축소와 관련된 모듈 지원 (PCA, NMF, Truncated SVD)
데이터 분리, 검증 &
파라미터 튜닝
sklearn.model_selection 교차 검증을 위한 학습용/테스트용 분리
GridSearch로 최적의 파라미터 추출하는 등 API 제공
평가 sklearn.metrics 성능 평가 방법 제공
(Accuracy, Precision, Recall, ROC-AUC, RMSE 등 제공)
ML 알고리즘 sklearn.ensemble 앙상블 알고리즘 제공
(랜덤 포레스트, 에이다 부스트, 그래디언트 부스팅 등 제공)
sklearn.linear_model 선형 회귀, 릿지, 라쏘 및 로지스틱 회귀 등 회귀 모델 지원
SGD 관련 알고리즘도 제공
sklearn.naive_bayes 나이브 베이즈 알고리즘, 가우시안 NB, 다항 분포 NB 등
sklearn.neighbors 최근접 이웃 알고리즘, K-NN
sklearn.svm 서포트 벡터 머신 알고리즘
sklearn.tree 의사 결정 트리 알고리즘
sklearn.cluster 비지도 클러스터링 알고리즘 (K-평균, 계층형, DBSCAN 등)
유틸리티 sklearn.pipeline 피처 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 함꼐 묶어서 수행할 수 있는 유틸리티 제공

 


03. Model Selection :: 학습/테스트 데이터 세트 분리, 교차 검증, GridSearchCV

Model Selection 모듈

  • 학습 데이터와 테스트 데이터 세트를 분리
  • 교차 검증 분할 및 평가
  • Estimator의 하이퍼 파라미터 튜닝을 위한 다양한 함수와 클래스를 제공

 

학습/테스트 데이터 세트 분리 : train_test_split()

  • test_size : 전체 데이터에서 테스트 데이터 크기를 얼마로 샘플링 할 것인가. 디폴트는 0.25
  • train_size : 전체 데이터에서 학습용 데이터 크기를 얼마로 샘플링 할 것인가.
    → test_size 파라미터를 통상적으로 사용하므로 거의 사용되지 않음
  • shuffle : 데이터 분리 전, 데이터를 미리 섞을지 결정. 디폴트는 True.
  • random_state : 호출할 때마다 동일한 학습/테스트용 데이터 세트를 생성하기 위해 주어지는 난수 값. train_test_split()는 호출 시 무작위로 데이터를 분리하므로, random_state를 지정하지 않으면 수행할 때마다 다른 학습/테스트용 데이터를 반환함. 동일한 데이터셋으로 분리하고 싶으면 random_state를 일정 값을 부여해주면 됨!
  • train_test_split() : 반환 값은 튜플 형태 → 순차적으로 X_train, y_train, X_test, y_test에 저장
    (학습용 데이터의 피처 데이터 세트, 테스트용 데이터의 피처 데이터 세트, 학습용 데이터의 레이블 데이터 세트, 테스트용 데이터의 레이블 데이터 세트)
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 모델 및 데이터 선언
dt_clf = DecisionTreeClassifier()
iris_data = load_iris()

# 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.3, random_state=12)

# 모델 학습 후 예측
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)

 

Q. 학습용 데이터와 테스트 데이터셋은 반드시 분리해야 하는 이유?

 

 

교차 검증

교차 검증을 해야 하는 이유는 과적합(Overfitting)의 위험이 있기 때문. 과적합은 모델이 학습 데이터에만 과도하게 최적화되어, 실제 예측을 다른 데이터로 수행할 경우 예측 성능이 과도하게 떨어지는 것을 의미. 그런데 고정된 학습 데이터와 테스트 데이터로 평가를 하다보면 결국, 테스트 데이터에만 최적의 성능을 발휘할 수 있는 편향된 모델이 생성됨.

 

이러한 데이터 편증을 막기 위해서 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것 → 각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝 등 모델 최적화를 더 손쉽게 할 수 있음.

 

(교차 검증 사진 첨부)

 

  • 장점: 모든 데이터셋을 훈련, 평가에 활용함으로써 정확도 향상, 과적합 및 과소적합 방지
  • 단점: 모델 훈련 및 평가 소요 시간 증가

교차 검증의 종류는 크게 3가지

 

1. K 폴드 교차 검증

  • K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
  • 학습 방법
    • K를 5라고 가정했을 때, 데이터 세트를 5등분
    • 총 5번의 반복에서 첫 번쨰 반복은 처음부터 4개 등분을 학습 데이터 세트, 마지막 5번째 등분 하나를 검증 데이터 세트로 설정하고 학습 데이터 세트에서 학습 수행, 검증 데이터 세트에서 평가를 수행 / 두 번째는 다시 비슷한 학습과 평가 작업을 수행. 이번에는 학습 데이터와 검증 데이터를 변경 (1~3, 5번째 등분을 학습 데이터로, 4번째 등분 하나를 검증 데이터로) → 이러한 방식으로 총 5회 반복

출처: https://incodom.kr/k-%EA%B2%B9_%EA%B5%90%EC%B0%A8_%EA%B2%80%EC%A6%9D

  • 구현 예시 코드
d

 

 

2. Stratified K 폴드

  • 불균형한 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한 K 폴드 방식
    (불균형한 분포도 → 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것)
    • 예) 대출 사기 데이터 예측의 경우, 1000건 중 사기인 경우가 극소수 이므로 불균형한 분포도를 지님
  • 이를 위해, 원본 데이터의 레이블 분포를 먼저 고려한 후, 이 분포와 동일하게 학습과 검증 데이터 세트를 분배
    만약 고려하지 않는다면 원본 데이터의 레이블 분포도 특성을 반영한 학습, 검증 데이터 세트를 만들 수 있음

 

Q. K 폴드와의 차이는?

 

레이블 데이터 분포도에 따라 학습/검증 데이터를 나누기 때문에 split() 메서드에 인자로 피처 데이터 세트 뿐만 아니라 레이블 데이터 세트도 반드시 필요 (K 폴드의 경우 레이블 데이터 세트는 split() 메서드의 인자로 입력하지 않아도 무방)

 

 

3. Hold-out Cross-Validation

4, Leave-One-Out CV(LOOCV)

 

 

교차 검증 방법

 

1. cross_val_score()

  • 교차 검증을 조금 더 수월하게 할 수 있는 사이킷런 API
  • KFold의 1) 폴드 세트 설정, 2) for 루프에서 반복으로 학습 및 테스트 데이터의 인덱스 추출, 3) 반복적으로 학습과 예측을 수행하고 예측 성능 반환까지 ▷ 이 일련의 과정을 한번에 수행해주는 API
  • 학습, 예측, 평가까지 한 번에 수행.
    내부적으로 StraifiedKFold를 활용하므로, 해당 알고리즘 수행 결과와 동일하게 반환.
  • 사용방법
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, X, y, scoring, cv
    • estimator : 사이킷런 분류 알고리즘 클래스 Classifier 또는 회귀 알고리즘 클래스 Regressor 의미
    • X : 피처 데이터 세트
    • y : 레이블 데이터 세트
    • scoring : 예측 성능 평가 지표
    • cv : 교차 검증 폴드 수
  • 비슷한 API : cross_validate() → 여러 개의 평가 지표 반환 가능

 

2. GridSearchCV

  • 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에 수행 → 교차 검증을 기반으로 하이퍼 파라미터 최적 값을 갖게 함
  • 데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 함.
  • 장단점
    • 장: 사용하고자 하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하여 최적의 파라미터 찾기 가능
    • 단: 순차적으로 테스트 하므로, 수행시간이 오래 걸림
  • 주요 파라미터
    • estimator
    • param_grid
    • scoring
    • cv
    • refit

 

참고: https://velog.io/@heidi/%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D

 


 

✔️ 참고: 붓꽃 데이터 세트 분류 예측 프로세스

1) 데이터 세트 분리 : train_test_split

2) 모델 학습: DecisionTreeClassifier 알고리즘 적용 후 fit

3) 예측 수행: 테스트 데이터셋에 대하여 predict

4) 평가: 예측값과 실제 값을 비교하여 모델 성능 평가 accuracy_score

 

✔️ 참고서적: 머신러닝 완벽 가이드 (권철민 지음)