본문 바로가기

파이썬 머신러닝 완벽가이드

2강 - 사이킷런으로 시작하는 머신러닝(1)

본 포스팅은 [파이썬 머신러닝 완벽 가이드 - 권철민]을 참고하여 머신러닝 공부의 목적으로 작성되었습니다!

[스스로 공부하며 작성하는 글이기 때문에 잘못된 내용이 있을 수도 있습니다. 잘못된 부분을 발견하시거나 의견이 있으시면 피드백 부탁드립니다:D]

 

오늘부터는 본격적으로 머신러닝을 다뤄보도록 할텐데요!

사이킷런(scikit-learn) 라이브러리를 이용하여 살펴보도록 하겠습니다.

 

사이킷런은 파이썬 기반의 머신러닝을 위한 가장 쉽고 효율적인 개발 라이브러리를 제공하는 머신러닝 라이브러리입니다. 

 

사이킷런의 대표적인 모듈을 살펴보겠습니다.

 

 

  • sklearn.datasets

외부에서 데이터 세트를 내려받을 필요 없이 사이킷런은 분류, 회귀의 예제로 사용할 수 있는 데이터 세트가 내장되어 있습니다. 

대표적인 데이터 세트인 iris 데이터를 불러왔습니다. 아래와 같은 방식으로 불러오면 됩니다.

(iris 데이터는 다양한 피처들로 붓꽃 데이터의 품종을 예측, 분류하는 데이터 세트입니다.)

-[데이터의 구성]

data : 피처의 데이터 세트

feature_names : 피처의 이름

target : 분류 시 레이블 값, 회귀 시 결괏값

target_names : 레이블 이름

shape에서 알 수 있듯 150개의 피처 데이터세트가 있으나 5개의 데이터만 나타냈습니다.

좀 더 쉽게 보기 위해 DataFrame으로 바꿔보도록 하겠습니다.

 

 

  • sklearn.model_selection

학습 데이터와 테스트 데이터 세트를 분리하거나, 교차 검증, 하이퍼 파라미터를 튜닝하기 위한 다양한 함수와 클래스를 제공합니다.

 

-train_test_split()

테스트 데이터 세트를 이용하지 않고 학습 데이터로만 학습하고 예측한다면, 

이미 학습된 데이터로 예측을 수행하는 것이기 때문에 정확도가 100%가 나오는 문제가 발생합니다. 

이러한 문제를 막기 위해 예측을 수행할 때에는 학습 데이터가 아닌, 전용의 테스트 데이터 세트를 이용해야 합니다.

 

따라서 train_test_split을 이용하여 원본 데이터를 학습 데이터와 테스트 데이터로 나눠줍니다.

 

[파라미터]

1. test_size : 전체 데이터에서 테스트 데이터 크기를 얼마로 할지, 디폴트는 0.25 (25%)

2. train_szie : 전체 데이터에서 학습 데이터 크기를 얼마로 할지, 보통 test_size를 사용하기 때문에 잘 사용하지 않음

3. shuffle : 분리하기 전에 데이터를 미리 섞을지, 디폴트는 True 

               -> 데이터를 분산시켜 좀 더 효율적인 데이터 세트 생성 가능

4. random_state : 데이터 생성시 난수 값으로 수행할 때마다 동일한 데이터 세트 만들도록 사용

 

하지만 고정된 학습 데이터와 테스트 데이터로 평가를 수행하면 해당 테스트 데이터에만 편향된 모델이 만들어져 과적합(overfitting)의 문제가 발생할 수 있습니다. 이를 해결하기 위해 교차검증을 이용합니다.

 

 

-교차 검증 ( Cross Validation)

별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행하는 것

 

참고) Validation set

학습데이터 중 일부를 모델을 평가하는데 이용

1차적으로 검증 데이터 세트(validation set)을 이용하여 모델을 평가하고, (최적의 모델,조건 선택시 평가 기준으로 사용)

테스트 데이터는 최종적으로 한 번만 이용하여 최종 성능을 평가 (선택된 모델을 최종 평가할 때 사용)

[이미지 출처 : https://3months.tistory.com/118]

 

1. K 폴드 교차 검증 ( K-Fold cross validaiton)

학습 데이터를 K개의 데이터 폴드 세트로 만들어서 K번만큼 각 폴드 세트에 대해 학습과 검증 평가를 반복적으로 수행하는 것입니다.

 

[이미지 출처:http://blog.daum.net/tomayoon/7098382]

위의 그림은 K=5일 때입니다.

그림과 같이 학습 데이터를 K(여기선 5) 개의 폴드로 나누고

첫 번째 시도에서는 첫 번째 폴드를 검증 데이터 설정, 나머지 폴드(2,3,4,5)로는 학습을 수행 후 검증 데이터(1)로 평가

두 번째 시도에서는 두 번째 폴드를 검증 데이터로 설정, 나머지 폴드(1,3,4,5)로 학습을 수행 후 검증 데이터(2)로 평가

 

이렇게 총 K번 만큼 학습과 평가를 진행 한 후, 각 시도 별로 구한 검증 평가 값들을 평균하여 최종 K폴드 평가 결과로 반영합니다.

 

2. Stratified K Fold

레이블 데이터 분포도에 따라 학습/검증 데이터를 나누는 방식으로 불균형한(값이 한 쪽으로 치우친) 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식입니다.

또한 KFold로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못하는 문제를 해결하기 위해 StratifiedKFold를 사용합니다.

 

iris 데이터를 통해 KFold 방식의 문제점을 확인해보겠습니다.

먼저 기존 iris data의 레이블 분포입니다.

다음은 KFold를 이용하여 학습데이터와 검증 데이터를 생성하고, 분포를 확인한 결과입니다. (n_splits=3)

n_splits=3으로 했지만 첫 번째 결과만 나타냈습니다.

첫 번째 학습 데이터의 레이블 분포를 보시면 레이블이 0인 데이터가 포함되어있지 않습니다. 따라서 0인 경우는 학습하지 못합니다. 그에 반해 검증 데이터에는 레이블이 0인 데이터들만 존재합니다. 이러한 경우 예측 정확도가 0이 될 수 밖에 없습니다.

StratifiedKFold는 KFold의 이러한 문제를 해결하여 레이블 값의 분포를 반영해 학습/검증 데이터를 나눕니다.

StratifiedKFold 이용 결과

이제 0,1,2를 모두 학습할 수 있게 되었습니다.

이 때 주의할 점은 StratifiedKFold는 레이블 데이터 분포도를 반영하여 학습/검증 데이터를 나누기 때문에 split() 메서드에 인자로 피처 데이터 세트뿐만 아니라 레이블 데이터 세트도 입력해주어야 한다는 것입니다.

다른 코드는 위의 KFold 코드와 동일합니다.

 

일반적으로 분류에서의 교차 검증은 Stratified K 폴드로 분할되어야 합니다.

하지만 회귀에서는 Stratified K 폴드가 지원되지 않습니다. 회귀의 결정값은 이산값이 아니라 연속된 숫자값이기 때문에 결정값별로 분포를 정하는 의미가 없기 때문입니다.

 

 

3. cross_val_score()

앞서 설명한 교차검증을 더욱 편리하게 수행할 수 있도록 돕는 API입니다.

estimator 가 classifier이면 StratifiedKFold를 수행하고

                 regressor이면 KFold를 수행합니다. (회귀는 StratifiedKFold가 지원되지 않기 때문입니다.)

 

[주요 파라미터]

-estimator : 분류 알고리즘 classifier 와 회귀 알고리즘 regressor를 지칭합니다.

-X : 피처 데이터 세트

-y : 레이블 데이터 세트

-scoring : 성능 평가 지표

-cv : 교차 검증 폴드 수 (앞의 KFold에서 K)

 

 

4. GridSearchCV

교차검증을 기반으로 Classifier 나 Regressor 의 최적의 하이퍼 파리미터를 찾아줍니다. 

 

[주요 파라미터]

-estimator : classifier 나 estimator

-param_grid : estimator 의 하이퍼 파리미터 후보 값들을 딕셔너리 형태로 넣어준다.

-scoring : 성능 평가 지표

-cv : 교차 검증 폴드 수 (앞의 KFold에서 K)

-refit : True면 가장 최적의 하이퍼 파라미터를 찾은 뒤 해당 파라미터로 estimator를 재학습시킨다. 디폴트는 True 

 

params를 보시면 입력해준 하이퍼 파라미터의 조합이 나와있습니다.

max_depth=[1,2,3] 으로 총 3개, min_samples_split=[2,3] 으로 총 2개 따라서 3X2 = 6의 경우의 수가 가능합니다.

 

그리고 cv=3으로 설정해주었습니다. 앞서 KFold 나 StratifiedKFold에서 폴드 수(K)만큼 평가가 이루어졌습니다.

따라서 split0_test_score, split1_test_score, split2_test_score 총 3번(cv=3)의 평가가 이루어졌음을 알 수 있습니다.

mean_test_score는 이들을 평균한 값들입니다.

 

rank_test_score는 mean_test_score에 따른 순위입니다. index 4,5번이 mean_test_score가 0.975로 가장 높아 1위임을 알 수 있습니다.

 

- best_params_ , best_score_

GridSearchCV 객체의 fit()을 수행하면 최적의 파라미터와 그때의 평가 결과가 best_params_, best_score_ 속성에 저장됩니다.

- best_estimator_

앞서 refit=True이면 최적 성능을 나타내는 (best_params_) 파라미터로 estimator를 재학습시킨다고 하였습니다.

재학습시킨 estimator는 best_estimator_로 저장됩니다.

 

지금까지 사이킷런의 datasets, model_selection 모듈에 대해 알아보았습니다.

다음 포스팅에서는 데이터 전처리와 관련하여 사이킷런의 preprocessing 모듈에 대해 알아보고,

사이킷런을 이용해 타이타닉 생존자 예측을 수행해보도록 하겠습니다. 

'파이썬 머신러닝 완벽가이드' 카테고리의 다른 글

2강 - 사이킷런으로 시작하는 머신러닝 (2)  (0) 2020.09.08
1강-Pandas(2)  (0) 2020.08.26
1강-Pandas (1)  (2) 2020.08.19
1강-Numpy  (2) 2020.08.12