티스토리 뷰

사이킷런의 model_selection 모듈은 학습/테스트 데이터 세트를 분리하거나 교차 검증 분할 및 평가, Estimator의 하이퍼 파라미터를 튜닝하는 다양한 API를 제공합니다. model_selection이 제공하는 API를 알아봅시다.

 

 

 

 

 

 

 

이전에도 설명했듯이, train_test_split() 메서드는 학습/테스트 데이터를 분리합니다. shuffle 파라미터가 있는데, 이는 데이터를 분리하기 전에 데이터를 미리 섞을지에 대한 파라미터입니다. 디폴트는 True이며, 데이터를 분산시켜 효율적인 분리를 위해 사용됩니다.

 

 

 

iris 데이터 세트의 테스트 데이터는 총 45개입니다. 이러한 적은 수의 테스트 데이터로 모델의 예측 성능을 판단하는 것은 적절하지 않습니다. 학습 데이터의 양을 보장하는 것도 중요하지만, 모델 평가에 다양한 데이터를 사용하는 것도 매우 중요합니다.

 

 

 

예측 성능을 평가하기 위해 테스트 데이터만을 사용하는 것은 과적합(Overfitting)에 취약합니다. 고정된 데이터에만 과적합될 수 있기 때문입니다. 이러한 문제점을 개선하기 위한 교차 검증은 더 다양한 학습과 평가를 수행합니다.

 

 

 

본 고사가 테스트 데이터 세트에 대한 평가라면, 모의 고사는 많은 학습/검증 세트에서 모델 학습과 평가를 수행하는 것입니다. 각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝 등 모델 최적화를 더욱 쉽게 할 수 있습니다. 보통 학습 데이터 세트와 테스트 데이터 세트를 먼저 나누며, 학습 데이터 세트에서 검증 데이터 세트를 한 번 더 분리합니다.

 

 

 

K 폴드 교차 검증은 가장 보편적인 교차 검증 기법입니다. K개의 데이터 폴드 세트를 만든 후, K번만큼 각 폴트 세트에 학습과 검증 평가를 반복적으로 수행합니다.

 

 

 

 

 

 

 

 

위와 같이, 데이터 세트를 K등분 한 뒤 각 반복마다 학습/검증 데이터 세트를 바꿔가면서 학습과 검증을 수행합니다. 모든 반복에서의 퍼포먼스의 평균을 최종 퍼포먼스로 해석합니다.

 

 

 

사이킷런에선 K 폴드 교차 검증을 위해 KFold와 StratifiedKFold 클래스를 제공합니다. 먼저 KFold 클래스를 이용해 붓꽃 데이터 세트를 교차 검증하고 예측 정확도를 구해봅시다.

 

 

 

 

 

 

 

 

KFold 객체는 split()을 호출하면 학습용/검증용 데이터로 분할할 수 있는 인덱스를 반환합니다. 실제 데이터 추출은 해당 인덱스로 직접 해야 합니다.

 

 

 

 

 

 

 

각 반복마다 검증 데이터 세트의 인덱스가 계속 바뀌는 것을 볼 수 있습니다.

 

 

 

Stratified KFold는 불균형한 데이터 분포도를 가진 레이블 데이터 집합을 위한 K 폴드입니다. 전체 데이터 세트의 레이블 분포를 각 폴드의 학습/검증 데이터에도 동일하게 유지하도록 데이터를 분리합니다. 만약 전체 데이터 세트의 레이블 분포를 고려하지 않고 학습/검증 데이터를 분리한다면, 특정 레이블은 특정 폴드에서 아예 학습 데이터에 포함되지 않을 수 있기 때문에 제대로 된 학습/검증이 수행되었다고 할 수 없을 것입니다.

 

 

 

사이킷런에서 Stratified KFold를 이용하기 위해선 KFold() 메서드에 피처 데이터 뿐만 아니라 레이블 데이터도 함께 전달해야 합니다. 전체 데이터의 레이블 분포를 먼저 고려하고, 그것을 바탕으로 폴드의 학습/검증 데이터를 뽑기 때문입니다.

 

 

 

 

 

 

 

붓꽃 품종 예측 데이터 세트에서 레이블이 각각 0, 1, 2인 데이터가 50개씩 있는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

Stratified KFold를 수행한 결과, 각 폴드의 학습/검증 데이터가 전체 레이블 데이터의 분포를 그대로 따르고 있는 것을 볼 수 있습니다. 

 

 

 

 

 

 

 

 

Stratified KFold를 이용하여 학습/검증을 진행 한 결과 평균 검증 정확도가 KFold를 이용한 학습/검증 결과보다 높은 것을 확인 할 수 있습니다. 이처럼 왜곡된 레이블 데이터 세트에 대해선 반드시 Stratified KFold를 이용해 교차 검증을 해야 하며, 사실 일반적인 분류 문제에서 교차 검증으로 대부분 Stratified KFold를 사용합니다. 회귀에선 Stratified KFold가 지원되지 않는데, 그 이유는 회귀의 결정값은 이산형이 아닌 연속형이기 때문에 결정값 별로 분포를 정하는 의미가 없기 때문입니다.

 

 

 

사이킷런은 교차 검증을 좀 더 쉽게 수행할 수 있는 API를 제공합니다. 대표적으로 cross_val_socre() 메서드가 있습니다.

 

 

 

 

 

 

 

cross_val_score() 메서드에는 estimator 객체, 피처 데이터, 레이블 데이터, 예측 성능 평가 지표, 교차 검증 폴드 수 등을 인자로 받습니다. 메서드의 반환값은 각 폴드에 대한 지정된 성능 지표 측정값을 담은 배열입니다. 교차 검증은 자동으로 Stratified KFold로 진행됩니다. 회귀의 경우 KFold로 진행됩니다.

 

 

 

이와 비슷한 API로 cross_validate() 메서드가 있으며, 단 하나의 평가 지표만 가능한 cross_val_score() 메서드와 달리 여러 개의 평가 지표에 대한 결과를 반환할 수 있고, 수행 시간도 같이 제공합니다. 그러나 자주 사용되진 않습니다.

 

 

 

사이킷런에서는 GridSearchCV API를 이용해 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적 파라미터를 구할 수 있습니다. 각 하이퍼 파라미터 세트에 대해 교차 검증을 수행하여 가장 평가 지표가 높은 하이퍼 파라미터가 무엇인지를 찾습니다. 예를들어, 하이퍼 파라미터 풀의 크기가 6이고 폴드 개수가 3이라면 총 6*3 = 18번의 학습/평가가 이루어집니다.

 

 

 

 

 

 

 

 

메서드의 주요 파라미터로는 estimator, 하이퍼 파라미터 풀을 정의한 딕셔너리, 예측 성능 평가 지표, 교차 검증 폴드 수, reflt=True/False가 있습니다. refit 인자가 True일 경우 최적의 파라미터로 estimator를 재학습시킵니다. GridSearchCV 객체를 정의하고, 해당 객체의 fit() 메서드 인자로 학습 데이터를 제공해야 합니다. 학습 데이터를 폴드의 수를 바탕으로 분리하여 교차 검증을 수행하고, 그 결과를 cv_result_ 속성에 기록합니다. 해당 속성은 딕셔너리 형태이며, 판다스의 DataFrame으로 변환하여 내용을 한 눈에 파악할 수 있습니다.

 

 

 

 

 

 

 

cv_result_를 DataFrame 객체로 변환한 후, 주요 칼럼만 뽑아봅시다. rank_test_score 칼럼은 각 하이퍼 파라미터의 순위입니다. mean_test_score는 모든 폴드에서의 평가 성능의 평균값이며, 이를 기반으로 순위가 매겨진 것을 볼 수 있습니다. 또한, 각 폴드마다의 평가 성능도 함께 제공됩니다.

 

 

 

 

 

 

 

GridSearchCV 객체의 fit()이 수행되면 최고 성능을 기록한 하이퍼 파라미터와 그 때의 평가 결과가 각각 best_params_, best_score 속성에 기록됩니다. refit=True 이라면, best_estimator_ 속성에 최적의 하이퍼 파라미터로 학습시킨 estimator를 저장합니다. best_estimator_로 테스트 데이터에 대한 예측 성능을 평가했을 때 약 0.96의 결과가 나왔습니다.

 

 

 

이처럼, GridSearchCV로 학습 데이터를 교차 검증하며 하이퍼 파라미터를 튜닝한 뒤, 별도의 테스트 세트에서 최적의 모델을 평가하는 프로세스가 일반적인 머신러닝 모델 적용 방법입니다.

 

 

 

«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31