카테고리 없음

LightGBM Metric 확인

카카오그래놀라 2021. 10. 12. 13:48

LightGBM 지원 Metric

https://lightgbm.readthedocs.io/en/latest/Parameters.html?highlight=metric#metric

 

Parameters — LightGBM 3.3.0.99 documentation

objective 🔗︎, default = regression, type = enum, options: regression, regression_l1, huber, fair, poisson, quantile, mape, gamma, tweedie, binary, multiclass, multiclassova, cross_entropy, cross_entropy_lambda, lambdarank, rank_xendcg, aliases: object

lightgbm.readthedocs.io

자주 사용되는 Metric 예시

  • 'l1': absolute loss
    • aliases: mean_absolute_error, mae, regression_l1
  • 'l2': square loss
    • aliases: mean_squared_error, mse, regression_l2, regression
  • 'rmse': root square loss
    • aliases: root_mean_squared_error, l2_root
  • 'auc': area under the ROC curve

 

 

사용 방법

선언한 모델 메소드 fit()을 실행할 때,

eval_set

eval_metric을 지정해주면 됩니다.

 

eval_set 지정 방법

리스트안에 x, y 값을 튜플로 묶어 담아두면 됩니다. 밑의 코드를 보면 이해가 빠릅니다.

 

eval_metric 지정 방법

위에서 알아본, LightGBM 메트릭의 이름('l1', 'l2', 'rmse', 'auc' 등)을 써주면 됩니다. 밑의 코드를 보면 이해가 빠릅니다.

x = data.drop(['target'], axis=1)
y = data['target']

train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=32)

model = lgbm.LGBMRegressor(random_state=32)
model.fit(
    train_x,
    train_y,
    eval_set=[(train_x, train_y),(test_x, test_y)],
    eval_metric='rmse'
    )
pred = model.predict(test_x)

 

 

 

추가 팁: Custom Metric 사용하기

Custom Metric 정의하기

1. y_true, y_pred(실제값, 예측값)을 받는 함수를 정의합니다.

2. 리턴해줘야 하는 값

  - Metric 이름 (string)

  - Metric (Numpy function)

  - Metric 값이 높으면 좋은지? (True or False)

 

예를 들어 설명하면, (아래 코드와 함께 보세요!)

RMSE를 Custome Metric으로 정의하자고 합시다.

1. RMSE의 이름을 정합니다. 'custom_RMSE'라고 이름을 짓겠습니다. (사용자 마음대로 정하면 됩니다.)

2. Metric을 정의합니다. 아래 Numpy 식과 같이 정의합니다.

3. RMSE는 낮을수록 좋기 때문에 False를 지정합니다.

위 3가지 값을 튜플로 묶어 return 하면 됩니다.

 

추가적으로 Acc를 통해 설명드리면,

1. 이름을 짓는다: 'acc' 라고 이름을 지어보겠습니다.

2. Metric을 정의합니다. 아래 Numpy 식과 같이 정의하겠습니다.

3. Acc는 높을수록 좋기 때문에 True를 지정합니다.

위 3가지 값을 튜플로 묶어 return 하면 됩니다.

def custom_rmse(y_true, y_pred):
    # metric 이름, metric, metric 값이 높을수록 좋은지?
    return ('custom_RMSE', np.sqrt(np.mean(np.power(y_pred - y_true, 2))), False)
    
    
def custom_acc(y_true, y_pred):
    # metric 이름, metric, metric 값이 높을수록 좋은지?
    return ('acc', np.mean(y_pred == y_true), True)

 

Custom Metric을 정의 후, 사용하기 위해서는 

model.fit()에서 eval_metric에 함수명을 입력해주면 작동합니다.

x = data.drop(['target'], axis=1)
y = data['target']

train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=32)

model = lgbm.LGBMRegressor(random_state=32)
model.fit(
    train_x,
    train_y,
    eval_set=[(train_x, train_y),(test_x, test_y)],
    eval_metric= custom_rmse
    )
pred = model.predict(test_x)

 

 

 

XGBoost Metric 확인을 알아보고 싶다면 아래 글을 참고하세요!

https://deep-deep-deep.tistory.com/160

 

XGBoost Metric 확인

XGBoost Metric 종류 https://xgboost.readthedocs.io/en/latest/parameter.html#:~:text=too%20much%20effect.-,eval_metric,-%5Bdefault%20according%20to XGBoost Parameters — xgboost 1.6.0-dev documentati..

deep-deep-deep.tistory.com