머신러닝 (Machine Learning)/python Scikit-learn library

Model Selection 모듈(학습/테스트 분리,교차검증)

DS지니 2021. 2. 10. 16:44
728x90
반응형

사이킷런 Model Selection 모듈

1. 학습데이터와 테스트 데이터 세트 분리(train_test_split())

2. 교차 검증 분할 및 평가

3. 하이퍼 파라미터 튜닝을 위한 다양한 함수와 클래스 제공

 

>> 더 자세한 코드 github
https://github.com/gggggeun/study/blob/main/1.%20%EC%82%AC%EC%9D%B4%ED%82%B7%EB%9F%B0(Scikit_learn)/3.%20Scikit-learn%20Model%20Selection%20%EB%AA%A8%EB%93%88.ipynb
 

gggggeun/study

Contribute to gggggeun/study development by creating an account on GitHub.

github.com


1. 학습/테스트 데이터 세트 분리 - train_test_split()

 

<파라미터>

  • test_size : 전체 데이터에서 테스트 데이터 세트 크기 결정. defalt=0.25 (25%)
  • shuffle : 데이터 분리 전 전체 데이터를 미리 섞는 것. defalt=True
  • random_state : 랜덤으로 나뉜 세트들을 호출할 때마다 동일한 세트들로 생성하기 위해 주어진 난수값.
  • 반환값(튜플) : 학습용 feature, 테스트용 feature, 학습용 label, 테스트용 label

 

 

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
iris = load_iris()
dt_clf = DecisionTreeClassifier
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=1)
view raw gistfile1.txt hosted with ❤ by GitHub

 

 

 

<주의>

학습을 위한 데이터 양이 적을 땐 적절치 않음. -> split하지 않고, 교차검증 사용하기

 

 


 

2.  교차검증 - cross_val_score()

 

 cross_val_score()는 estimator로 분류가 입력되면 Stratified KFold CV 방식으로, 회귀면 KFold 방식으로 분할한다.

 

 

1) 교차검증의 종류

 

1. KFold CV : 가장 보편적인 교차 검증 기법. 회귀분석

   :  k-1개의 train세트와 1개의 test(or 검증)세트로 k번 검증 평가를 해서 평균으로 최종평가를 냄

 

  • 회귀에서 Stratified KFold는 지원하지 않고, KFold만 사용가능. 회귀의 연속된 숫자값을 결정값별로 분포를 정할      필요 없기 때문.
  • 분류에서 사용할 때 문제점 : 레이블 데이터가 불균형일 때 너무 편파적으로 나뉨.

2. Stratified KFold CV : 불균형한 분포도를 가진 레이블에 쓰임. 분류분석

 

  • Stratified Kfold 는 Kfold가 레이블 데이터가 제대로 분배되지 못하는 경우의 문제를 해결해 준다. 
  • 원본 데이터의 레이블 분포를 먼저 고려한뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분배하는 방식
  • 레이블 분포에 따라 학습/테스트 세트를 나눔

 

 

2) 사이킷런에서 교차검증하기

from sklearn.model_selection import cross_val_score
cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_job=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

<파라미터>

  • estimator : regressior or classifier
  • X : 피처 데이터 세트
  • y : 레이블 데이터 세트
  • scoring : 예측 성능 평가 지표
  • cv : 교차 검증 폴드 수
  • 반환 값 : 성능 지표 측정값

 

 

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score, cross_validate
from sklearn.datasets import load_iris
iris_data = load_iris()
dt_clf = DecisionTreeClassifier(random_state=1)
features = iris_data.data
label = iris_data.target
# 성능 지표는 accracy, 교차 검증 세트는 3개
scores =cross_val_score(dt_clf, features, label, scoring='accuracy', cv=3)
print('교차 검증별 정확도',scores)
print('평균 검증 정확도', np.round(np.mean(scores),4))
view raw gistfile1.txt hosted with ❤ by GitHub

 

 


 

3. 교차 검증 + 최적 하이퍼 파라미터 튜닝을 한번에하기- GridSearchCV

 

데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤에 하이퍼 피라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 해준다.

 

GridSearchCV는 사용자고 튜닝하고자 하는 여러 종류의 하이퍼 파라미터를 다양하게 테스트하면서 최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸리는 것에 유념해야 한다.

 

 

<GridSearchCV 주요 파라미터>

  • estimator : classifier, regressor, pipeline 사용가능
  • param_grid : key + 리스트 값을 가지는 딕셔너리가 주어진다. estimator의 튜닝을 위해 파라미터명과 사용될 여러 파라미터 값을 지정합니다.
  • scoring : 평가 방법. 보통 문자열(ex.'accuracy')로 지정하나 별도의 성능 평가 지표 함수도 지정할 수 있습니다.
  • cv : 교차검증을 위해 분할되는 학습/테스트 세트의 개수를 지정
  • refit : defalt=True 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 하이퍼 파라미터로 재학습시킵니다.

 

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
import pandas as pd
#데이터를 로딩하고 학습 데이터와 테스트 데이터 분리
iris_data =load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=1)
dtree = DecisionTreeClassifier()
##파라미터를 딕셔너리 형태로 설정
parameters = {'max_depth': [1,2,3], 'min_samples_split': [2,3]}
# param_grid의 하이퍼 파라미터를 2개의 train, test set fold로 나누어 테스트 수행 설정.
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)
# param_grid의 하이퍼 파라미터를 순차적으로 학습/평가
grid_dtree.fit(X_train, y_train)
print('최적 파라미터 : ',grid_dtree.best_params_)
print('최고 정확도 :{0:.4f}'.format(grid_dtree.best_score_))
view raw gistfile1.txt hosted with ❤ by GitHub

 

 

<GridSearchCV 속성>

  • .cvresults

    • rank_test_score : 성능이 좋은 순위를 나타냄. 이때의 파라미터가 최적의 하이어 파라미터이다.(param)
    • mean_test_score : cv의 폴딩 테스트 세트에 대해 총 수행한 평가 평균값
  • .bestparams : 최적의 파라미터

  • .best_score : 최적의 정확도

  • .best_estimator : GridSearchCV의 refit으로 이미 학습된 estimator 반환

 

 

728x90
반응형