[Capstone Study] 머신러닝 완벽 가이드

[머신러닝] 섹션 1.5 사이킷런 (1)

wlalsu_u 2023. 11. 6. 06:02

1.5.1 사이킷런 소개와 특징

 

 

 

 

 

사이킷런(Scikit-learn)은 파이썬 머신러닝 라이브러리 중

 

가장 많이 사용되는 라이브러리이다.

 

 

 

사이킷런은 머신러닝을 위한 쉽고 효율적인 개발 라이브러리를 제공하는데,

 

사이킷런의 특징을 정리하면 다음과 같다.

 

 

 

 

 

 

[ 사이킷런의 특징 ] 

1)  가장 파이썬스러운 API를 제공하며, 쉽고 편리함

2) 머신러닝을 위한 다양하고 편리한 프레임워크와 API 제공


3) 오랜 기간 실제 환경에서 사용되며 검증된 라이브러리

 

 

 

 

 

 

사이킷런은 아나콘다 설치 시 자동으로 설치되므로,

 

별도의 설치 과정이 필요하지 않다.

 

 

 

 

실습의 경우 사이킷런 1.0.2 버전을 사용하였다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

1.5.2 첫 번째 머신러닝 만들어보기 - 붓꽃 품종 예측하기

 

 

 

 

 

붓꽃 데이터 세트를 이용하여

 

붓꽃의 품종을 분류하는 머신러닝 모델을 만들어보자.

 

 

 

 

 

분류(Classification)는 지도학습(Supervised Learning)의 한 방식이다.

 

학습을 위한 다양한 피처와 분류 결정 값인 레이블을 바탕으로

 

명확한 답이 주어진 데이터를 먼저 학습한 후, 미지의 정답을 예측한다.

 

 

 

 

 

이를 위해서는

 

데이터 세트 분리 > 모델 학습 > 예측 수행 > 평가

 

의 과정이 필요하다.

 

 

 

 

 

아래에서 각 과정에 대해 세세하게 알아보기 전에,

 

전체적인 개요에 대해 먼저 살펴보자.

 

 

 

 

 

 

붓꽃 데이터의 피처 값 / 레이블 값 확인하기

 

 

 

 

 

먼저 새로운 주피터 노트북을 생성한 후,

 

사이킷런에서 사용할 모듈을 import 해보자.

 

 

 

 

 

 

 

 

 

 

 

- sklearn : 사이킷런 패키지 내의 모듈이름의 시작

- sklearn.datasets : 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈


- sklearn.tree : 트리 기반 ML 알고리즘을 구현한 클래스 모임

- sklearn.model_selection : 학습 데이터, 검증데이터, 예측 데이터 분리 또는 최적의 하이퍼 파라미터 평가 모듈

( * 하이퍼 파라미터 : 최적의 학습을 위해 직접 입력하는 파라미터로 성능을 튜닝 )

 

 

 

 

 

 

 

 

다음으로 load_iris() 함수로 붓꽃 데이터 세트를 load 하고,

 

DataFrame을 통해 피처와 데이터 값을 확인해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

결과 값을 확인해보면

 

피처 값으로는 sepal length, sepal width, petal length, petal width가 있고,

 

레이블 값은 0 (Setosa 품종), 1 (Versicolor 품종), 2 (Virginica 품종) 이 있는 것을

 

확인할 수 있다.

 

 

 

 

 

 

 

 

train_test_split() API - 학습 데이터와 테스트 데이터의 분리

 

 

 

 

 

그렇다면 학습데이터와 테스트데이터를 구분하는 방법을 알아보자.

 

 

 

 

학습 데이터로 학습된 모델의 성능을 평가하기 위해

 

테스트 데이터 세트가 반드시 필요하므로,

 

학습용 데이터와 테스트 데이터를 구분하는 것은 매우 중요하다.

 

 

 

 

 

이를 위한 train_test_split() API 의 사용법은 다음과 같다.

 

 

 

 

 

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label,
						test_size = 0.2, random_state=11)

 

 

 

 

- 첫번째 파라미터 값 : 피처 데이터 세트

- 두번째 파라미터 값 레이블 데이터 세트


- test_size
 : 전체 데이터 세트 중 테스트 데이터 세트의 비율


- random_state : 같은 데이터 세트를 생성하기 위해 주어지는 난수 발생 값

 

 

 

 

 

 

위의 코드의 경우 테스트 데이터가 20% / 학습 데이터가 80% 이고,

 

random_state를 11이라는 일정한 값으로 부여하였다.

 

 

 

 

train_test_split() 에 의해 분리된 데이터는

 

학습용 피처 데이터 세트는 X_train에,

 

테스트용 피처 데이터 세트는 X_test에,

 

학습용 레이블 데이터 세트는 y_train에,

 

테스트용 레이블 데이터 세트는 y_test에 반환된다.

 

 

 

 

 

 

 

 

DecisionTreeClassifier - 의사결정트리를 이용한 학습과 예측

 

 

 

 

 

앞서 분리한 데이터를 사용하여

 

의사 결정 트리를 이용한 학습과 예측을 진행해보자.

 

 

 

 

 

먼저 데이터 학습을 위해

 

사이킷런의 의사 결정 트리 클래스인 DecisionTreeClassifier를 객체로 생성한 후,

 

객체의 fit() 메서드에 학습용 데이터 속성과 결정값 데이터 세트를 입력하였다.

 

 

 

 

 

 

# DecisionTreeClassifier 객체 생성
dt_clf = DecisionTreeClassifier(random_state = 11)

# 학습 수행
dt_clf.fit(X_train, y_train)

 

 

 

 

 

 

이제 학습데이터를 기반으로 학습이 완료되었으니, 예측을 수행해보자.

 

이때 예측은 학습데이터가 아닌 새로운 데이터를 사용해야 함을 유의하자!

 

(테스트 데이터 세트 이용)

 

 

 

 

객체의 predict() 메서드에 테스트용 데이터 세트를 입력하였다.

 

 

 

 

 

# 학습이 완료된 객체에서 테스트 데이터 세트로 예측 수행
pred = dt_clf.predict(X_test)

 

 

 

 

 

 

 

 

 

 

마지막으로 DecisionTreeClassifier의 예측 성능을 평가해보자.

 

 

 

 

accuracy_score() 함수를 이용하여 정확도를 측정한다.

 

실제 레이블 데이터 세트와 예측 레이블 데이터 세트를 각각 파라미터로 입력한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

예측 정확도를 확인해보면 대략 93% 정확도가 도출되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 


 

 

 

 

 

 

1.5.3 사이킷런의 기반 프레임워크 익히기

 

 

 

 

 

Estimator 이해 및 fit(), predict() 메서드

 

 

 

 

 

앞서 살펴보았듯이,

 

사이킷런 클래스는 fit()과 predict()만을 이용하여

 

간단한 학습과 예측 결과를 반환한다.

 

 

 

 

이때 지도학습의 주요 두 축은 크게

 

분류(Classification)과 회귀(Regression)으로 나눌 수 있다.

 

 

 

 

사이킷런의 분류 알고리즘을 구현한 클래스는 Classifier,

 

회귀 알고리즘을 구현한 클래스는 Regressor 가 있는데,

 

이 둘을 합쳐 Estimator 라고 이야기한다.

 

 

 

 

즉, Estimator 클래스 내에서 fit() 과 predict() 함수를 구현하고 있는 것이다.

 

 

 

 

 

 

 

 

사이킷런의 주요 모듈

 

 

 

 

 

사이킷런의 주요 핵심 모델은 아래와 같다.

 

사이킷런 패키지는 머신러닝 모델 구축을 위한 주요 프로세스를 지원하는

 

매우 편리하고 유연한 모듈을 지원한다.

 

 

 

 

 

출처 : https://casa-de-feel.tistory.com/3

 

 

 

 

 

 

 

 

내장된 예제 데이터 세트

 

 

 

 

 

datasets 모듈의 API를 호출하면

 

외부 웹사이트에서 데이터 세트를 내려받을 필요 없이,

 

간단한 데이터 세트를 사용할 수 있다.

 

 

 

사이킷런에 내장된 데이터 세트는 보통 딕셔너리 형태로 구성되어 있으며,

 

data, target, target_names, feature_names, DESCR 키를 갖고 있다.

 

 

 

 

 

 

[ 참고 ] 내장 예제 데이터 세트 키 값

- data 
피처 데이터 세트 (ndarray)

- target : 분류일 때에는 레이블 값, 회귀일 때에는 숫자 결과값 데이터 세트 (ndarray)


- target_names
: 개별 레이블의 이름 (ndarray 또는 list)


- feature_names : 피처의 이름 (ndarray 또는 list)

- DESCR : 데이터세트 설명, 각 피처의 설명 (String)

 

 

 

 

 

 

 

붓꽃 데이터 세트를 생성하고,

 

key 값을 지정하여 피처의 데이터 값을 반환받아보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

생성한 붓꽃 데이터 세트의 타입은

 

sklearn.utils.Bunch 클래스 임을 확인할 수 있다.

 

 

이는 파이썬 딕셔너리 자료형과 유사하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

피처들의 데이터 값인 데이터 키는 위의 결과값과 같다.

 

 

 

피처 데이터 값을 추출하기 위해서는

 

(데이터 세트).data 를 이용하게 되는데,

 

이와 유사하게 객체의 키를 사용하여 특정 값을 추출할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

1.5.4  Model Selection 모듈 소개

 

 

 

 

 

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

 

 

 

 

 

먼저 학습 데이터와 테스트 데이터를 분리하지 않았을 때의

 

문제점에 대해 알아보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

데이터세트가 분리되지 않으면

 

이미 학습된 데이터 세트를 기반으로 예측을 진행하게 되므로,

 

예측 정확도가 100%로 도출된다.

 

 

 

 

 

따라서 train_test_split() 을 이용하여

 

원본 데이터 세트를 학습 / 테스트 데이터 세트로 분리하는 과정이 필요하다.

 

 

 

 

 

테스트 데이터 세트를 30%, 학습 데이터 세트를 70%로 설정하면

 

약 95%의 정확도를 얻을 수 있다.

 

 

 

 

 

 

 

 

 

 

 

- 첫번째 파라미터 값 피처 데이터 세트

- 두번째 파라미터 값 레이블 데이터 세트


- test_size
: 전체 데이터 세트 중 테스트 데이터 세트의 비율 (디폴트는 0.25)

- train_size : 전체 데이터 세트 중 학습용 데이터 세트의 비율 (잘 사용되지 않음)

- shuffle : 데이터를 분리하기 전에 데이터를 미리 섞을지 결정 (디폴트는 True)


- random_state : 같은 데이터 세트를 생성하기 위해 주어지는 난수 발생 값

 

 

 

 

 

 

 

 

 

교차 검증

 

 

 

 

 

앞선 학습 데이터와 테스트 데이터를 분리하는 방식은

 

과적합(Overfitting) 에 취약하다는 문제점이 있다.

 

 

 

 

과적합이란 모델이 학습 데이터에만 최적화되어서,

 

다른 데이터로 예측을 수행하는 경우 성능이 과도하게 떨어지는 것을 의미한다.

 

 

 

 

즉 모델이 테스트 데이터에 대해서는 최적의 성능을 발휘하게 된다는 뜻이다.

 

 

 

 

이러한 문제는 많은 학습과 검증 세트로

 

알고리즘을 학습과 평가하는 교차 검증 방식을 통해 해결할 수 있다.

 

 

 

 

 

 

[ 교차 검증 이란? ]

- 데이터 편증을 막기 위해, 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트로 학습/평가를 수행

- 대부분의 ML 모델은 교차 검증 기반의 1차 평가를 수행

- 학습 / 검증 / 테스트 데이터 세트로 나누어 검증 데이터 세트를 최종 평가 이전의 평가에 사용

 

 

 

 

 

 

 

K 폴드 교차 검증

 

 

 

 

 

- 가장 보편적으로 사용되는 교차 검증 기법

 

- K개의 데이터 폴드 세트를 만들고, K번 만큼 학습과 검증 평가를 수행

 

 

 

 

 

 

예를 들어 5 폴드 교차 검증의 경우 (k=5)

 

데이터 세트를 5등분 한 후, 

 

4개는 학습 데이터, 1개는 테스트 데이터로 사용하게 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

학습 데이터 세트와 테스트 데이터 셋을 점진적으로 5번 변경하면서 평가한 후,

 

(처음에는 마지막 데이터만 테스트용, 두번째는 4번째 데이터만 테스트용...)

 

5개 평가의 평균 값으로 예측 성능을 평가하게 된다.

 

 

 

 

 

사이킷런에서는 KFold 와 StratifiedKFold 클래스를 이용하여

 

K 폴드 교차 검증을 수행할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

결과값을 확인해보면 전체 붓꽃 데이터는 150개인 것을 확인할 수 있다.

 

이때 우리는 n_splits = 5로 설정하였으므로,

 

학습용 데이터 세트는 120개 (4/5), 테스트 데이터 세트는 30개 (1/5) 가 된다.

 

 

 

 

 

KFold 객체로 5개의 폴드 세트를 생성하고,

 

교차 검증을 수행할 때마다 예측 정확도를 측정해보자.

 

 

 

 

 

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
import numpy as np

iris = load_iris()
features = iris.data
label = iris.target

# 5개의 폴드 세트로 분리하는 KFold 객체와 폴드 세트별 정확도를 담을 리스트 객체 생성
kfold = KFold(n_splits=5)
cv_accuracy = []

# Kfold 객체의 split()을 호출하면 폴드별 학습용, 검증용 테스트의 로우 인덱스를 array로 반환
n_iter = 0
for train_index, test_index in kfold.split(features):
    
    # kfole.split()으로 반환된 인덱스를 이용해 학습용, 검증용 테스트 데이터 추출
    X_train, X_test = features[train_index], features[test_index]
    y_train, y_test = label[train_index], label[test_index]
    
    # 학습 및 예측
    dt_clf.fit(X_train, y_train)
    pred = dt_clf.predict(X_test)
    n_iter += 1
    
    # 반복 시마다 정확도 측정
    accuracy = np.round(accuracy_score(y_test, pred), 4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    print('\n#{0} 교차 검증 정확도: {1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'
         .format(n_iter, accuracy, train_size, test_size))
    print('#{0} 검증 세트 인덱스:{1}'.format(n_iter, test_index))
    cv_accuracy.append(accuracy)
    
# 개별 iteration별 정확도를 합하여 평균 정확도 계산
print('\n## 평균 검증 정확도: ', np.mean(cv_accuracy))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5번의 교차 검증 정확도 결과가 0.9로 나오는 것을 확인할 수 있다.

 

 

 

또한 검증 세트 인덱스를 확인해보면, 

 

교차 검증을 수행할 때마다 검증 세트의 인덱스가

 

( 0~29 ), ( 30~59 ), ( 60~89 ) .. 로 달라지고 있음을 확인할 수 있다.

 

 

 

 

 

 

 

 

Stratified K 폴드

 

 

 

 

 

- 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식

 

- 예를 들어 특정 레이블 값이 매우 많거나 매우 적을 때 사용

 

- 원본 데이터의 레이블 분포를 확인한 후, 해당 분포와 동일하게 학습과 검증 데이터 세트에 분배

 

- 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 제대로 분배하지 못하는 문제 해결

 

 

 

 

 

 

 

먼저 다음의 예제를 통해 K 폴드의 문제점을 확인해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

먼저 각 레이블 값의 분포도를 확인해보면

 

3개의 품종이 각각 50개를 동일하게 가지고 있는 것을 확인할 수 있다.

 

 

 

다음으로 3개의 폴드 세트를 KFold로 생성한 후,

 

각 교차 검증에서 생성되는 데이터 값의 분포를 확인해본다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

결과값을 확인해보면

 

교차검증시마다 학습레이블과 검증 레이블이 완전히 다른 값으로 추출되고 있다.

 

이는 검증 예측 정확도를 0으로 만들게 된다.

 

 

 

 

예를 들어 첫번째 교차검증의 경우

 

학습 레이블의 1, 2만 추출되었으므로,

 

0 의 경우에 대해서는 전혀 학습하지 못하는 상태가 된다.

 

 

 

 

이러한 문제는 StratifiedKFold 를 이용하여

 

KFold로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포를 반영하도록 하여

 

해결할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출력 결과를 확인해보면

 

학습/검증 레이블 데이터 값의 분포도가 거의 동일한 것을 확인할 수 있다. 

 

따라서 레이블 값 0, 1, 2를 모든 교차 검증에서 학습할 수 있고, 

 

검증 예측 정확도를 올릴 수 있다.

 

 

 

 

 

StratifiedKFold를 이용한 교차 검증 코드와 결과는 아래와 같다.

 

 

 

 

 

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import StratifiedKFold
import numpy as np

dt_clf = DecisionTreeClassifier(random_state=156)

skfold = StratifiedKFold(n_splits=3)
n_iter = 0
cv_accuracy = []

# StratifiedKFold의 split() 호출 시 반드시 레이블 데이터 세트도 추가 입력 필요
for train_index, test_index in skfold.split(features, label):
    
    # split()으로 반환된 인덱스를 이용해 학습용, 검증용 테슽 데이터 추출
    X_train, X_test = features[train_index], features[test_index]
    y_train, y_test = label[train_index], label[test_index]
    
    # 학습 및 예측
    dt_clf.fit(X_train, y_train)
    pred = dt_clf.predict(X_test)
    
    # 반복 시마다 정확도 츠정
    n_iter += 1
    accuracy = np.round(accuracy_score(y_test, pred), 4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    print('\n#{0} 교차 검증 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'
         .format(n_iter, accuracy, train_size, test_size))
    print('#{0} 검증 세트 인덱스: {1}'.format(n_iter, test_index))
    cv_accuracy.append(accuracy)
    
# 교차 검증별 정확도 및 평균 정확도 계산
print('\n## 교차 검증별 정확도: ', np.round(cv_accuracy, 4))
print('## 평균 검증 정확도: ', np.round(np.mean(cv_accuracy), 4))

 

 

 

 

 

 

 

 

 

 

 

 

 

3개의 Stratified K 폴드를 이용한 교차 검증의

 

평균 검증 정확도는 약 96.67%로 측정되었다.

 

 

 

 

 

 

 

 

 

cross_val_score() - 간편한 교차 검증

 

 

 

 

 

회귀의 경우 결정값이 이산값이 아닌 연속된 값을 가지므로,

 

Statified K 폴드가 지원되지 않는다.

 

 

이러한 교차 검증을 간편하게 제공하는 사이킷런의 API 에 대해 알아보자.

 

 

 

 

 

cross_val_score()은 앞서 KFold로 데이터를 학습하고 예측한

 

아래의 일련의 과정을 한번에 수행한다.

 

 

 

 

1) 폴드 세트를 설정

2) for 루프에서 학습 데이터와 테스트 데이터의 인덱스를 반복해서 추출

3) 학습과 예측을 반복 수행한 후 예측 성능 반환

 

 

 

 

 

 

 

cross_val_score() API 선언 형태는 다음과 같다.

 

 

 

 

 

cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=2, verbose=0, 
		fit_params=None, pre_dispatch='2*n_jobs')

 

 

 

- estimator : Classifier(분류 알고리즘) 또는 Regressor(회귀 알고리즘) 의미

- X : 피처 데이터 세트


- y
 : 레이블 데이터 세트

- scoring : 예측 성능 평가 지표

- cv : 교차 검증 폴드 수


- random_state : 같은 데이터 세트를 생성하기 위해 주어지는 난수 발생 값

 

 

 

 

 

 

 

cross_val_score()은 cv로 지정된 횟수만큼

 

scoring 파라미터로 지정된 성능 지표 측정값을 반환하며

 

Classifier인 경우에는 Stratified K 폴드 방식으로,

 

Regressor인 경우에는 K 폴드 방식으로 학습/테스트 세트를 분할한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

결과값을 확인해보면 앞서 StratifiedKFold 수행결과와

 

동일한 것을 확인할 수 있다.

 

(cross_val_score() 가 내부적으로 StratifiedKFold를 사용하기 때문)

 

 

 

 

[ 참고 ] cross_validate

- cross_val_score()와 동일하지만 여러 개의 평가 지표 반환 가능

- 성능 평가 지표와 수행 시간을 같이 제공

 

 

 

 

 

 

 

 

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

 

 

 

 

 

하이퍼 파라미터는 머신러닝 알고리즘의 주요 구성 요소로,

 

이 값을 조정하여 예측 성능을 개선할 수 있다.

 

 

 

사이킷런의 경우 Classifier나 Regressor 에 하이퍼 파라미터를 순차적으로 입력할 때

 

GridSearchCV API를 이용한다.

 

 

 

 

 

GridSearchCV

- 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출

- 최고의 성능을 가지는 파라미터 조합을 찾고 싶을 때, 파라미터 집합을 만들고 순차 적용하여 최적화 수행

- 교차 검증을 기반으로 최적 값을 찾음

- 수행시간이 상대적으로 오래 걸린다는 단점이 있음

grid_parameters = {'max_depth':[1,2,3],
		'min_samples_split':[2,3],
            	}


다음과 같은 예시의 경우 (1,2), (1,3), (2,2), (2,3), (3,2), (3,3) 순서대로 최적의 파라미터를 도출하게된다.

이때 만약 cv가 3회라면 (3*6) = 18회의 학습/평가가 이루어지게 된다.

 

 

 

 

 

 

 

train_test_split()을 이용하여 학습/테스트 데이터를 분리한 후

 

GridSearchCV를 이용하여 최적 하이퍼 파라미터를 추출해보자.

 

결정 트리 알고리즘의 max_depth와 min_samples_split의 값을 변화시켰다.

 

 

 

 

 

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

# 데이터를 로딩하고 학습 데이터와 테스트 데이터 분리
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=121)
dtree = DecisionTreeClassifier()

### 파라미터를 딕셔너리 형태로 설정
parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}

 

 

 

 

 

 

다음으로 학습 데이터 세트를 GridSearchCV 의 fit 메서드 인자로 입력한

 

하이퍼 파라미터를 순차적으로 변경하면서 학습/평가 하도록 하였다.

 

결과 값은 cv_results_ 속성에 기록되며,

 

이를 판다스의 DataFrame으로 보기 쉽게 변환하였다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6개의 데이터를 확인해보면,

 

max_depth와 min_samples_split을 순차적으로 6번 변경한 것을 알 수 있다.

 

이때 4번째와 5번째 인덱스의 rank_test_score가 1인 것을 보면,

 

해당 파라미터 조합에서 예측 성능이 가장 높은 것을 확인할수 있다. 

 

 

 

 

 

실제로 best_params_ 와 best_score_ 속성을 통해 확인해보면

 

최적 하이퍼 파라미터 값과 정확도를 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

GridSearchCV 객체의 refit 파라미터의 기본값은 True 인데,

 

최적 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 best_estimator_에 저장한다.

 

 

 

 

best_estimator_를 이용해 에측과 성능을 평가해보면,

 

아래와 같이 대략 96.67%의 정확도가 도출된 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

권철민 '파이썬 머신러닝 완벽 가이드 (개정2판)' 책을 기반으로 작성하였습니다.