LightGBM(LGBM)

joon_1592·2021년 4월 11일
0

내가 바로 써먹기 위한 LGBM 속성, 야매 글입니다.
자세한 설명은 생략한다

LGBM은 무엇인가?

LGBM은 Light GBM이다. Light하다는 것은 속도가 빠르고, 적은 메모리를 이용한다고 생각하면 된다. 당연히 GPU 가속기를 이용할 수 있다.

GBM은 Gradient Boosting Machine이다. 잔여오차(residual error)에 가중치를 gradient descent로 진행한다

kaggle 코드를 보면, regression과 classification에서 거의 LGBM을 사용하여 높은 LB(Leader Board)에 있는 것을 알 수 있다. 이제까지 배운 linear/logistic regression은 효율이 안좋다.

가끔 시계열 문제(Time series)에서도 회귀로 접근하여 LGBM을 사용하는 것도 볼 수 있다.

예제. 분류 (유방암 진단하기)

Dataset은 이곳에서 다운받을 수 있다. (로그인 하면 다운로드 가능)

1. 데이터 확인 및 EDA (EDA는 생략)

사실 EDA 작업은 정말로 중요하다. 이 글은 야매글이니까....
pandasDataFrame을 이용하여 csv 파일을 읽어오자.
그리고 df.shape, df.info()로 데이터의 크기, 정보를 확인하자.

df.shape로 데이터의 크기가 (569, 6)임을 알 수 있다. 이 데이터는 csv파일이므로 feature가 6인 데이터가 569가 있다고 해석하자.
df.info()로 데이터 자료형을 확인하자. 전체 데이터는 569인데 Non-Null Count역시 569이므로 비어있는 데이터가 없다는 것을 알 수 있다.(매우 좋은 데이터이다. 대부분 비어있는 데이터를 처리하는 작업(e.g. 0이나 False로 채우기)도 필요하다). 데이터 5번 column만 정수이고 나머지는 실수형이다.

df.head()로 데이터 일부분을 확인하자. ()안에 숫자가 없으면 기본적으로 5개를 보여준다.

5번째 column은 diagnosis이므로 column이 0~4까지가 feature임을 알 수 있다. (실제로 어떤 feature는 유방암 진단에 영향을 안 줄 수도 있다. 자세한 데이터 분석은 EDA로 열심히 파악해야 한다. 이부분은 skip)

2. 데이터셋 만들기

이제 이 데이터에서 실제로 유방암과 아닌것의 개수를 확인해보자

질병데이터의 경우, 잘못하면 질병의 데이터가 매우 적어서 학습하기 곤란한 경우가 있는데, 이 경우 데이터셋을 구성할 때 음성인 데이터의 일부만 사용하여 데이터셋을 구성한다.
우리의 경우, 그래도 양성/음성의 개수가 비슷한 편이므로 그대로 데이터셋을 구성하자.
주어진 데이터에서 30%는 test set으로 분리시키자.
(보통 train/test는 8:2로 분리하지만 이 데이터셋이 1000개도 못넘는 작은 데이터라서....)

3. 모델 생성 및 학습


clf.fit()로 모델을 train한다.

4. 결과 확인


test_set에서 약 93%의 정확도를 보여주었다.
overfitting인지 확인해보자

train_set에서 100%, test_set에서 93%이므로 overfitting에서 벗어난 듯 하다.

분류 문제이므로 confusion matrix로 어떤 경우를 잘 분류했는지 확인해보자

12(=8+4)개의 경우를 제외하고 잘 분류한 것을 알 수 있다.
색칠해서 시각화해보자.

model tuning

위에서 모델을 생성할 때 lgb.LGBMClassifier()로 간단히 생성했었다.

원래 LGBM 모델을 생성할때는 다음처럼 생성한다.
링크

import lightgbm as lgb

train_set = lgb.Dataset(X_train, label=y_train)

# X_test 대신에 X_val(for validation)도 가능하다
test_set = lgb.Dataset(X_test, label=y_test)
params = {
    'num_leaves': 80,
    'objective': 'regression',
    'min_data_in_leaf': 200,
    'learning_rate': 0.02,
    'feature_fraction': 0.8,
    'bagging_fraction': 0.7,
    'bagging_freq': 1,
    'metric': 'l2',
    'num_threads': 16
}

model = lgb.train(params, train_set, num_boost_round=MAX_ROUNDS,
test_set, early_stopping_rounds=125, verbose_eval=50)

y_pred = model.predict(X_test)

왜냐하면 params로 hyperparameter를 튜닝할 수 있기 때문이다.
Parameters Documents
params은 dict의 형태이어야 한다.
자세한 parameter tuning은 구글링, document를 보자 (이 글은 야매글이다)

parameter tuning을 해보자
objective는 회귀라면 regression, 분류라면 binary, multiclass를 사용하면 된다.
metric은 분류모델에서 binary_loglossauc를 이용한다.

y_perd는 확률을 나타낸다. y_pred의 threshold를 0.5로 하여 0.5보다 넘으면 1(Treu)로 세팅하자


정확도는 93.5%로 조금 좋아졌다.

Reference

ref.1
ref.2

profile
공부용 벨로그

0개의 댓글