본문 바로가기

데이터 사이언스 공부

00. LightGBM, XGBoost에서의 eval_set 파라미터

앙상블 중 Boosting에 대해 공부중에 eval_set 파라미터의 정확한 사용법과 그 내용이 의미하는 바를 정리하기 위해 포스트를 남긴다.

 

 

eval_set 파라미터는 XGBoost, LightGBM에서 모델을 학습할 때 검증 데이터셋을 지정하는 데 사용된다.

 

이 파라미터는 모델 학습과정에서 훈련 데이터와 함께 검증 데이터를 사용하여 모델 성능을 평가할 수 있도록 한다.

 

이를 통해 모델이 과적합되는지, 성능이 개선되고 있는지를 실시간으로 확인할 수 있다.

 


사용법

XGBoost, LightGBM에서는 eval_set을 통해 훈련 데이터 외에 추가적인 검증 데이터를 제공할 수 있다.

 

eval_set은 다음과 같은 형식으로 사용된다.

eval_set = [(X_val, y_val), (X_val2, y_val2)] # 여러 개의 검증 데이터를 지정할 수도 있음

 

여기서

  • X_val, y_val은 검증 데이터의 특성(features)과 레이블(labels)이다.
  • eval_set에는 여러 개의 검증 데이터셋을 넣을 수 있으며, 각 튜플은 (X, y) 형식이다.

역할

  1. 모델 성능 평가: eval_set을 사용하면 훈련 데이터뿐만 아니라 지정한 검증 데이터에 대해서도 모델 성능을 주기적으로 평가할 수 있다. 이 평가 결과는 훈련 중에 출력되며, 성능 지표(metrics)를 추적할 수 있게 된다.
  2. 조기 중단(Early Stopping): eval_set을 지정하면 조기 중단을 사용할 수 있다. 조기 중단은 검증 데이터셋에서 성능이 더 이상 향상되지 않으면 학습을 중단하는 방법이다.
  3. 출력 정보: eval_set을 사용하면 학습 과정에서 검증 성능에 대한 정보를 출력할 수 있습니다.
import lightgbm as lgb
from sklearn.model_selection import train_test_split 

# 데이터 준비 
X_train, X_val, y_train, y_val = 
	train_test_split(X, y, test_size=0.2, random_state=42) 
    
# LightGBM 데이터셋 생성 
train_data = lgb.Dataset(X_train, label=y_train)
val_data = lgb.Dataset(X_val, label=y_val, reference=train_data) 

# 파라미터 설정 
params = { 'objective': 'binary', 
			'metric': 'binary_error', # 예시로 binary classification에서 error를 사용 }

# 모델 학습 
evals = [(val_data, 'valid')] 
bst = lgb.train(params, train_data, num_boost_round=1000, 
				valid_sets=evals, early_stopping_rounds=50, # 50 라운드 동안 성능이 개선되지 않으면 중단 
                verbose_eval=10) # 10 라운드마다 평가 결과 출력

 

 
 

 

eval_set = [(X_val, y_val), (X_val2, y_val2)]는 LightGBM에서 모델을 학습할 때 여러 개의 검증 데이터셋을 동시에 사용하는 방법이다.

 

이 코드를 함수 내에서 어떻게 사용하는지 예시를 통해 구체적인 흐름을 보도록 하자.

 

예시 코드: 여러 개의 검증 데이터셋을 사용하는 방법

 
import lightgbm as lgb 
from sklearn.model_selection import train_test_split 

# 예시 데이터 생성 (임의의 X, y) 
import numpy as np 
X = np.random.rand(1000, 10) # 1000개의 샘플, 10개의 특성 
y = np.random.randint(0, 2, 1000) # 이진 분류 레이블 

# 훈련 데이터와 검증 데이터로 분리 
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) 
X_val2, y_val2 = X_val[:200], y_val[:200] # 또 다른 검증 데이터셋

# LightGBM 데이터셋 생성 
train_data = lgb.Dataset(X_train, label=y_train) 
val_data1 = lgb.Dataset(X_val, label=y_val, reference=train_data)
val_data2 = lgb.Dataset(X_val2, label=y_val2, reference=train_data) 

# 파라미터 설정 
params = { 'objective': 'binary', 'metric': 'binary_error',
	# 예시로 binary classification에서 error를 사용 
    }
    
# 모델 학습 
evals = [(val_data1, 'valid1'), (val_data2, 'valid2')] 

# 여러 검증 데이터셋을 튜플로 묶음 
bst = lgb.train(params, train_data, num_boost_round=1000, valid_sets=evals, 
	# 여러 검증 데이터셋을 eval_set으로 전달 
    early_stopping_rounds=50, # 50 라운드 동안 성능이 개선되지 않으면 중단 
    verbose_eval=10) # 10 라운드마다 평가 결과 출력

코드 설명

  1. 훈련 데이터와 검증 데이터셋 분리:
    • X_train, y_train: 훈련 데이터
    • X_val, y_val: 첫 번째 검증 데이터
    • X_val2, y_val2: 두 번째 검증 데이터 (예시로 200개의 샘플로 추출)
  2. LightGBM 데이터셋 생성:
    • train_data, val_data1, val_data2는 각각 lgb.Dataset 객체로, 훈련 데이터와 두 개의 검증 데이터를 준비한다.
    • 각 검증 데이터셋은 reference=train_data를 통해 훈련 데이터셋에 대한 참조를 설정한다. 이는 LightGBM이 훈련 데이터와 검증 데이터에 대해 동일한 방식으로 특성 데이터를 처리할 수 있게 한다.
  3. eval_set 설정:
    • evals = [(val_data1, 'valid1'), (val_data2, 'valid2')]: 이 부분에서 여러 개의 검증 데이터셋을 제공하고, 각 검증 데이터셋을 식별하기 위한 이름을 지정한다. valid1, valid2는 각 검증 데이터셋의 이름이다.
  4. 모델 학습:
    • lgb.train 함수는 훈련 데이터와 함께 여러 개의 검증 데이터셋(evals)을 사용하여 모델을 학습한다. 이때, 검증 데이터셋에 대해 성능 평가가 이루어지고, 각 데이터셋에 대한 성능 결과가 출력된다.
  5. 조기 중단 (Early Stopping):
    • early_stopping_rounds=50: 검증 데이터셋에서 성능이 50번의 반복 동안 개선되지 않으면 학습을 중단한다.
  6. 성능 평가:
    • 학습이 진행되는 동안 verbose_eval=10에 의해 10번의 반복마다 훈련 성능과 검증 성능을 출력한다.

eval_set의 역할

eval_set에 여러 검증 데이터를 지정하는 주요 목적은 다양한 검증 데이터셋에서 성능을 평가하여 모델의 일반화 성능을 더 정확하게 확인하는 것이다.

 

여러 검증 데이터셋을 사용하면 특정 데이터셋에 대한 과적합을 피할 수 있고, 모델의 성능 안정성을 확인할 수 있다.

eval_set에서 이름을 지정하지 않은 경우

eval_set에 이름을 지정하지 않으면 LightGBM은 해당 검증 데이터셋을 valid_0, valid_1 등으로 자동으로 구분한다.

 

즉, 이름을 지정하지 않아도 기능적으로는 문제가 없지만, 출력 로그에서 각 검증 데이터셋을 식별하는 데 불편할 수 있다.

 

예를 들어, eval_set = [(X_val, y_val), (X_val2, y_val2)]로 정의하면, LightGBM은 이를 자동으로 valid_0, valid_1로 구분하고, 출력되는 로그에서도 valid_0과 valid_1으로 표시된다.

 


 

validation_0-auc와 validation_1-auc 등은 XGBoost 학습 과정에서 각 검증 데이터셋에 대한 AUC (Area Under the Curve) 값을 나타낸다.

 

이 값들은 모델이 학습되는 동안 각 검증 데이터셋에 대해 실시간으로 계산된 AUC 점수이다. (roc_auc 외에 다른 eval_metric을 적용하면 그에 맞는 방식으로 로그가 출력된다)

 

여기서 validation_0과 validation_1은 eval_set에 지정된 검증 데이터셋을 식별하는 이름이다.

 

코드에서 eval_set 파라미터로 지정된 두 개의 데이터셋이 각각 validation_0과 validation_1으로 구분된다.

 

xgb_clf.fit(X_tr, y_tr, early_stopping_rounds=100, eval_metric='auc', eval_set=[(X_tr, y_tr), (X_val, y_val)])
  • X_tr, y_tr: 훈련 데이터셋
  • X_val, y_val: 검증 데이터셋

위 코드에서 eval_set은 두 개의 데이터셋을 포함하고 있다:

  1. (X_tr, y_tr) → 훈련 데이터
  2. (X_val, y_val) → 검증 데이터

따라서, XGBoost는 훈련 데이터와 검증 데이터 각각에 대해 AUC 점수를 계산하고, 그 결과를 validation_0-auc와 validation_1-auc라는 이름으로 출력한다.

  • validation_0-auc: 훈련 데이터셋 (X_tr, y_tr)에 대한 AUC 점수
  • validation_1-auc: 검증 데이터셋 (X_val, y_val)에 대한 AUC 점수
 
 

 

따라서 eval_set 안의 튜플 데이터는 훈련 데이터와 검증 데이터를 라벨링하여 따로 학습하고 검증하는 일련의 과정을 한 번에 수행할 수 있게 만든다고 볼 수 있다.