관리 메뉴

귀퉁이 서재

머신러닝 - 16. NGBoost 본문

머신러닝

머신러닝 - 16. NGBoost

데이터 파수꾼 Baek Kyun Shin 2019. 11. 1. 00:43

앤드류 응 교수가 속해있는 스탠퍼드 ML Group에서 최근 새로운 부스팅 알고리즘을 발표했습니다. 머신러닝의 대가인 앤드류 응 교수의 연구소에서 발표한 것이라 더 신기하고 관심이 갔습니다. 2019년 10월 9일에 발표한 것으로 따끈따끈한 신작입니다. 이름은 NGBoost(Natural Gradient Boost)입니다. Natural Gradient이기 때문에 NGBoost지만 Andrew Ng의 NG를 따서 좀 노린 것 같기도 하네요.. 엔쥐부스트라 읽어야 하지만 많은 혹자들이 앤드류 응 교수의 이름을 따서 응부스트라 읽을 것 같기도 합니다.

어쨌든 다시 본론으로 넘어가면, 지금까지 부스팅 알고리즘은 XGBoost와 LightGBM이 주름잡았습니다. 캐글의 많은 Top Ranker들이 XGBoost와 LightGBM으로 좋은 성적을 내고 있습니다. NGBoost도 그와 비슷한 명성을 갖게 될지는 차차 지켜봐야겠죠.

이번 글은 NGBoost 논문홈페이지 그리고 Towards Data Science의 글을 참고하여 작성했습니다.

State of the art

XGBoost Gihub의 Star는 17.6k 개인데 비해 NGBoost Github의 Star는 아직 196개입니다. 제가 Star를 하나 눌러서 197개가 됐습니다. 커밋 이력도 3,929개와 194개로 비교가 되는군요. NGBoost는 이 글을 쓰는 시점을 기준으로 불과 2일 전에 커밋된 것도 있습니다. 아직도 모델을 개발 중이라는 것을 알 수 있습니다. 기본적으로 GBM에 있는 early_stopping, random_state 옵션이 NGBoost에는 아직 없습니다. 이 글을 쓰는 시점에는 없지만 머지않아 업데이트가 될 거라 생각합니다.

XGBoost Github
NGBoost Github

유튜브에서 검색해볼까요?

NGBoost 유튜브 검색 결과

관련 없는 영상 하나만 검색될 뿐 NGBoost가 전혀 검색이 되지 않습니다. 조만간 NGBoost 관련 영상이 많이 올라오겠죠.

NGBoost 특징

1. NGBoost는 XGBoost나 LightBoost보다 성능이 조금 더 좋습니다. 

Kaggle의 집값 예측 데이터를 활용하여 테스트해봤을 때 NGBoost가 XGBoost나 LightGBM보다 성능이 조금 더 좋았습니다. (Reference1)

출처: Towards Data Science

2. 확률적인 예측을 해줍니다. (예측의 불확실성을 측정해줍니다.)

확률적 예측이란 말그대로 예측을 확률에 기반해서 한다는 뜻입니다. 여러 feature를 기반으로 집 값을 예측한다고 합시다. 일반적인 모델을 활용하면, '집의 위치, 주변 환경, 평수, 건축 연도 등을 고려해 5억이다'라고 예측을 할 것입니다. 예측은 언제나 불확실성을 내포합니다. 사용한 모델이 5억이라고 예측했을 때 신뢰성이 얼마나 되는지 알 수 없습니다. 하지만 NGBoost는 예측의 불확실성까지 알려줍니다. '집의 위치, 주변 환경, 평수, 건축년도 등을 고려해 5억 일 확률은 75%다'라고 말이죠. 예측의 불확실성을 측정하는 것은 의료나 날씨 분야에 있어 중요합니다.

출처: Standford ML Group

기존의 모델에게 '내일 날씨가 몇도일 것 같니?'라고 물어보면 '73.4도(화씨)입니다.'라고 대답합니다. 하지만 NGBoost는 응답에 대한 확률 분포를 보여줄 수 있습니다. 73.4도일 확률은 몇 프로고 72.4도일 확률은 몇 프로고.. 등등으로 말입니다.

아래는 NGBoost로 학습시킨 확률 회귀 선입니다.

출처: Standford ML Group

두꺼운 선은 예측 값의 평균이며, 가는 선은 95% 확률 예측 구간입니다. 가는 선 사이에 예측 값이 있을 확률이 95% 이상이라는 것입니다. 앞서 말씀드린 바와 같이 NGBoost는 확률적 예측을 가능케 합니다. 

3. XGBoost, LightGBM보다 컴퓨팅 시간이 오래 걸립니다.

유일한 단점입니다. 성능도 좋고, 결과값에 대한 확률 분포까지 보여주려니 시간이 많이 걸리는 건 당연지사겠죠. 샘플링을 통해 시간을 줄여줄 수 있겠습니다.

NGBoost 구성

출처: NGBoost 논문

NGBoost는 위 그림과 같이 Base Learners, Probability Distribution, Scoring Rule로 구성되어 있습니다.

Base (Weak) Learner

가장 기본적인 학습기는 결정트리(Decision Tree)입니다. 

Probability Distribution

Input을 받아 약학습기(Weak Learner)로 예측한 결과 활용하여 확률 분포를 만듭니다. 확률 분포는 결괏값(Target Value)의 타입에 따라 바뀔 것입니다. 일상생활에 대한 값이라면 정규 분포를, Binary값이라면 베르누이 분포를 따라야 합니다.

Scoring Rule

예측한 확률 분포와 실제 Target Value를 토대로 성능 측정을 합니다. 성능 측정을 위한 알고리즘은 MLE(Maximum Likelihood Estimation)이나 Continuous Ranked Probability Score(CRPS)를 주로 씁니다.

위 단계를 반복하며 성능을 높여갑니다.

 

NGBoost의 내부적인 알고리즘은 저도 정확히 이해하지 못했습니다. NGBoost의 특징과 간단한 구성요소에 대해서만 알아봤고 시간이 허락할 때 논문 전체를 읽어볼 예정입니다.

References

Reference1: Towards Data Science (NGBoost Explained)

Reference2: Standford ML Group (NGBoost: Natural Gradient Boosting for Probabilistic Prediction)

Reference3: NG Boost 논문 (Natural Gradient Boosting for Probabilistic Prediction)

12 Comments
  • 프로필사진 열심남 2020.01.14 15:21 신고 이제 막 XGboost를 알았는데... 새로운 NGBoost가 있군요. 시간내서 좀더 공부를 해봐야겠네요. 덕분에 알게되었습니다. 감사합니다.
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2020.01.14 15:34 신고 읽어주셔서 감사합니다. 아직까지도 NGBoost가 많이 알려지진 않은 것 같아 실질적으로 쓰이고 있진 않는 것 같습니다. 구독도 감사드립니다 ^^
  • 프로필사진 열심남 2021.01.13 11:16 신고 집값예측 모델을 실거래가 기반으로 새로 만들어 보려는데 이번에 NG부스트를 써보고 xgboost와 바교해봐야겠네요.
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2021.01.13 11:51 신고 오!!! 해보시고 어떻게 다른지 알려주시면 감사드리겠습니다 ㅎㅎ 열심남님은 DIY로 재밌는 분석을 많이 하셔서 본받을 점이 많네요
  • 프로필사진 열심남 2021.01.14 23:14 신고 텀프로젝트로 제가 사는 부산의 해운대구 실거래가 예측모델을 만들어서. xgboost로 한게 가장 좋긴하더라구요. 비교대상이 Randomforest와 회귀모형이아서. ㅋㅋ. NGboost도 해보려는데 python만 지원이라. python으로도 도전해보려구요.
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2021.01.15 01:29 신고 오 대단하시네요 ㅋㅋ
    과거 실거래가 기반으로 향후 거래가를 예측하는 모델을 만드신거죠? 성능측정할 땐 특정 시점 기준으로 예측을 잘했는지 못했는지 1번만 평가하셨나욤? 여러번해서 평균을 내셨나요?
    그리고 회귀 평가지표는 어떤거 쓰셨어요? ㅋㅋㅋ 궁금한 게 많네요 ㅎㅎ xgb로 하셨다면 light gbm으로 해도 성능 좋을 것 같네요 ㅋㅋㅋ 암튼 대단하십니다 재밌겠네요
  • 프로필사진 열심남 2021.01.17 23:04 신고 평가지표는 RMSE나 MAPE등을 이용했습니다. 제가 했던 모델의 데이터는 1년동안 해운대구 아파트 실거래가 데이터 2472건을 가지고 60%로 학습, 40%로 검증을 했습니다. 평가는 수집된 데이터를 가지고 했었구요 1번했었나 봅니다.

    제가 했던 목적이 실거래가 예측이 아니라, 현재 매물로 나온 아파트의 호가와 예측모델의 가격의 차이로 저평가된 아파트를 찾는거였습니다. 지금 다시 보고서를 보니 조금 허접해 보이기도 하네요.

    실거래가와 아파트 기본정보뿐 아니라 여러가지 정보들을 부가적으로 만드어서 했습니다. 역세권, 초품아, 환경(공원), 상권, 경사도(평지여부), 중학교학군, 숲세권(등산로 입구와 거리) 등등... 이런 변수들 정보를 추가로 해서 했던 모델입니다. 나중에 알고보니 이걸 피처엔지니어링이라는 고상한 용어를~ ㅎㅎ... 시간이 되면 블로그에 다시 한번 정리를 해볼까 생각중이긴 합니다.
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2021.01.17 23:30 신고 딱 제가 생각했던 분석이네요!! 저도 실거래가 + 다양한 변수로 부동산가 예측하는 거 해보려고 했었는데 ㅋㅋㅋㅋ 나중에 블로그에 정리해주시면 잘 읽어보겠습니다 ㅎㅎㅎ 멋지십니다!
  • 프로필사진 열심남 2021.01.18 21:56 신고 이게 해보니 어려운건 역시 피처엔지니어링에 대한 변수 하나하나의 데이터를 수집하고 가공하는 부분이었습니다. 그리고 그 변수들이 지역별로 영향도의 차이가 커서. 모델 자체가 특정구를 벗어나기가 어려워 보였습니다. 요즘은 너무 양극화 된다고 해서 해당 구 내에서도 특정 동간의 차이도 커지더라구요. 위치정보(위,경도)와 그 위치에 좋은 영향을 미치는 학군, 환경, 상권등 고려 요소가 꽤 많았습니다.

    지금은 해운대구 말고, 제가 관심있는 연제구쪽 정보들을 수집해 보고 있습니다. 실거래가도 1년이 아닌 10년정도로 모델을 한번 만들어보려구요.
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2021.01.19 22:31 신고 그렇겠네요. 다른 변수를 수집하는 게 힘들겠네요. 전처리도 그렇고요. 나중에라도 블로그 포스팅하면 구경가겠습니다 ㅎㅎ
  • 프로필사진 머린이 2021.07.16 16:02 여전히 ngboost에 대한 글이 별로 없네요,,, 흡
  • 프로필사진 데이터 파수꾼 Baek Kyun Shin 2021.07.17 12:08 신고 2년이 지난 지금까지 별로 없는 거 보면, 별로 쓸모가 없다는 반증 아닐까 싶네요 ㅜㅜ 저의 예측 실패...
댓글쓰기 폼