카테고리 보관물: 미분류

쉽게 이해하는 XGboost

요약

XGboost는 기계학습에서 사용하는 결정 트리(Decision Tree)라는 계열의 알고리즘 중 하나입니다. 중요한 특징으로는 분산 컴퓨팅으로 기계학습 모델을 빌드 할 수 있습니다.

즉 어려대의 서버로 대량의 학습데이터를 사용해서 결정트리 기계학습 모델을 만들 수 있게 해주는 기계학습 프레임워크(알고리즘)입니다.

결정 트리 (Decision Tree)

결정나무라고도 번역하는데 이게 느낌이 너무 이상해서 대부분 디씨젼트리 또는 결정트리라고 부릅니다.

결정트리 (Decision Tree)의 계보는 CART부터 시작해서 밑에 그림과 같습니다. 뒤에 LightGBM아 몇개가 더 있습니다만 XGboost까지의 계보는 저렇습니다.

여기서 아마 역사적으로 가장 잘 알려진 것은 “랜덤포레스트”일 것입니다.

랜럼포레스는 결정트리에 배깅 기법을 추가한 것이고
GBM은 결정트리에 부스팅 기법을 추가한 것입니다.

GBM은 분류 알고리즘이라면 어떤 알고리즘이라도 사용할 수 있지만 결정트리가 가장 쓰기 편하고 좋기 때문에 GBM은 결정트리를 주로 씁니다.

XGBoost: A Scalable Tree Boosting System

개요

  • XGBoost = eXtream Gradient Boosting
  • Gradient Boosted Decision Tree의 분산 컴퓨팅을 위한 새 구현체
  • 정확히 설명하면 GBM(Gradient Boosting Machine)의 분산 환경을 구현체

잘 알려지지 않았지만 GBRT (Gradient Boosting Decision Tree)는 정말 성능이 좋은 알고리즘이지만 모델 빌드속도가 매우 느리고 분산 노드를 이용해서 빌드 속도를 단축시키는 것이 가능하지 않다는 문제가 있습니다. GBRT는 정확도를 쥐어짜듯이 끌어내면서도 과적합(오버피팅)이 심하게 되지 않는 장점이 있습니다.

GBRT의 문제점은 학습데이터가 많아지고 자질(feature)가 많아질 수록 빌드속도가 늘어나고 한대의 컴퓨터에서 처리할 수 없는 메모리를 사용해야 하면 빌드를 하지 못합니다.

XGboost는 그 문제를 해결해놓은 것입니다.
이 문제를 해결했기 때문에 GBRT를 이용해서 대량의 학습데이터로 성능을 최대한 뽑아내는 모델을 빌드할 수 있게 되었습니다.

논문 Paper

읽어보면 좋습니다만 좀 어렵습니다.
https://arxiv.org/abs/1603.02754

유용한 정보

XGboost는 monothonic 제약을 지원합니다. 예측값이 항상 과거 보다는 미래의 값이 크거나 같아야 하는 경우를 말합니다.

사용상 문제 Issue

아직 몇 가지 문제도 있고 그렇습니다만 일반적으로 쓰는 데는 큰 문제가 없습니다.

그리고 카테고리 변수를 사용하지 못하는 큰 문제가 있습니다.

참조

다른 자료들도 참조하세요.

https://brunch.co.kr/@snobberys/137

LightGBM

LightGBM은 결정 트리(Decision Tree) 계열의 알고리즘 중에서는 현재까지의 가장 좋은 알고리즘입니다. 그렇다고 해서 이 알고리즘이 xgboost나 gbdt에 비해서 항상 성능이 좋다는 말은 아닙니다.

마이크로소프트(Microsoft)에서 만들었습니다.

GBM은 Gradient Boosting Machine의 약자이고 Light는 가볍고 빠르다는 뜻입니다.
그러면 “GBDT (GBRT)나 XGboost는 무겁운가?” 라고 묻는다면.

네. 그렇습니다. 하지만 XGBoost가 쓸모 없다는 말은 아닙니다.

lightGBM의 대략의 특징입니다.

특징

  1. 범주형 변수를 차원으로 올리는 더미 변환 또는 피폿(캐스팅)을 하지 않아도 된다.
  2. XGboost 보다 적은 데이터로 더 정확한 모델을 만들 수 있다.
  3. XGboost 보다 더 모델 빌드가 빠르다.

기존의 다른 알고리즘의 문제점과 개선한 방법

  • 느린 모델 빌드 속도
    • GBDT(Gradient Boosted Decision Tree; 또는 GBRT) 계열은 직렬 연산 알고리즘으로 병렬처리가 불가능하다.
    • GBDT는 엔트로피 계산(Information gain)을 위한 변수의 구간 탐색이 매우 빈번하다. 
    • 여러 개의 트리가 필요하지만 Gradient boosting(그래디언트 부스팅)을 하기 위해서는 병렬 처리를 할 수 없다. 어차피 트리를 병렬로 생성할 수 없기 때문에 가능하지 않다.
  • 모델 빌드 속도 개선 방법1
    • XGboost와 같이 변수에 대해서 히스토그램 색인을 만들고 학습 데이터를 병렬 분산, 중복 적재해서 연산력을 위해서 데이터 탐색 속도를 줄인다.
    • 즉 병렬처리를 하지 못하므로 직렬 처리에서 시간 소모가 가장 많은 부분에 연산자원을 과투입하고 데이터 전처리를 해둔 뒤 빌드 시간을 줄인다.
  • 모델 빌드 속도 개선 방법2
    • 학습데이터를 샘플링하는데 Gradient가 급격한 구간의 데이터들의 샘플 수를 줄이고 완만한 구간의 샘플을 늘려서 샘플의 능력 발현을 최대로 활용한다.
  • 범주형 변수 지원의 문제점
    • XGboost가 범주형 변수를 지원하지 못하기 때문에 문제가 많은데 범주형 변수를 지원하기 위해서 어쩌고저쩌고 하는 알고리즘(알고리즘이 매우 어려워서 여기서는 이름도 쓰지 않겠음)을 개발해서 적용했다.

장점

  • 매우 큰 학습데이터를 빌드하는데 시간 소모가 드라마틱하게 줄어들지만 예측 성능은 떨어지지 않는다.
  • 범주형 변수를 지원한다.
  • 사용하기 매우 편하다.
  • Microsoft가 만들었다.

단점

  • GPU로 추가 성능 개선을 할 여지가 없다.
  • Tensorflow를 비롯한 여러 프레임워크중에서 지원하지 않는 것이 많다.
  • 범주형 변수의 오토 레이블링(레벨링)을 지원하지 않는다. 범주형 변수를 모두 integer로 변환해야 한다.
  • Microsoft가 만들었다. 그래서 관리를 잘 해줄 것이라는 기대와 믿음이 있다.

Python패키지가 있으므로 주피터노트북에서 불러써도 됩니다.

메타 (페이스북, 인스타그램)이 정보제공동의 서명을 받는 이유에 대해서

페이스북, 인스타그램은 메타의 소유입니다. 메타는 페이스북이 회사명을 바꾼것이구요.

메타가 최근 자사의 소셜플랫폼에서 사용자에게 정보제공동의 서명을 받고 있습니다.

왜 그럴까?

페이스북과 인스타그램의 주 수익은 광고수입입니다. 광고 수익을 내기 위해서는 사용자의 트래킹 정보가 필요한데 이것은 웹브라우저는 쿠키, 안드로이드앱은 ADID, 애플 IOS는 IDFA를 사용합니다.

웹브라우저의 쿠키로 사용자의 트래킹 정보를 제고하는 것을 3rd party cookie 제3자쿠키라고 합니다. 이 제3자 쿠키를 이용하면 사용자의 트래킹 정보를 페이스북 외부와 내부에 연동해서 추적할 수 있습니다.

사용자가 쇼핑몰에서 본 노트북이 있다면 페이스북에 접속했을 때 그 노트북이 광고로 보이거나 하는 것입니다.

그런데 이게 3자 쿠키와 사용자 트레이싱이 점진적으로 사라지게 되는데 제3자 쿠키는 2023년 말로 크롭라우저에서 차단됩니다. 페이스북에서는 이걸로 인해 광고 노출을 하는 큰 수입이 사라지게 되므로 다른 대안을 찾아야 하는데 그건 사용자의 행적정보를 광고주에게 제공하는 것입니다.

해주면 어떤 일이 일어나는데?

그전에도 이런것을 어느정도 했었지만 정보제공동의 서명을방고 난 후에는 법적인 문제없이 본격저으로 할 수 있고 제3자쿠키나 ADID를 통한 사용자 트래킹이 사라지면서 손실이 발생하는 광고 수익을 대체할 수 있게 됩니다.

즉, 본인의 행적과 일부 데모그래픽 정보를 외부에 제공하고 어떤 형태로 그 댓가를 얻을 수 있게됩니다. 그렇다고 해서 주민등록번호깥은 것이 유출되거나 하지는 않지만 사는 지역, 성별, 연령대, 가입한 그룹들을 통한 성향, 취미, 친구관계를 통한 사회적 지위, 직장, 소득, 쓰는 글 등을 이용한 성향 분석 등으로 정리한 정보를 광고주에게 제공할 가능성이 큽니다.

페이스북 쿠키를 차단하고 ADID를 리셋하면 되는거 아닌가?

페이스북에 로그인한 정보를 사용하기 때문에 쿠키를 차단하는 것과 상관없이 정보는 제공됩니다.

인스타그램도 동일합니다. 즉 트래킹 당한 정보를 제공하지 않고 싶으면 페이서북과 인스타그램에 로그인하지 않으면 됩니다.

페이스북, 인스타그램은 쓰면서 정보를 추적당하지 않는 방법은 없는가?

없습니다. 매체 또는 플랫폼을 쓰는 댓가로 행적 정보를 제공하는 것이고 그걸 기반으로 광고 수익을 얻는 것입니다. 플랫폼에서 광고를 보고 싶지 않거나 추적하는 것을 피하려면 그 플랫폼을 쓰지 않아야 합니다.

이런 구조는 구글, 네이버, 카카오 다음 모두 같습니다. 이들 모두 정보를 수집하고 있고 광고에 이용하고 있습니다. 추적당하지 않으려면 로그인하지 않으면 됩니다. 그럴 수 있다면 말이죠.

윈도우에서 폰트의 영문 이름 알아내기 – Finding the name of the English font in a TTF file

영문처리만 지원하는 소프트웨어에서 폰트를 사용하기 위해서는 TTF 파일 또는 OTF 파일의 영문 이름을 알아야 하는 경우가 있습니다.

이 영문 이름은 폰트관리자, 서체관리자, 폰트포지(FontForge)로 제대로 알아내기 어렵습니다.

Python 스크립트로 알아낼 수 있습니다. 다음의 스크립트를 실행해서 간단히 확인하세요.

import os
import sys
from matplotlib import font_manager

def main(font_path):
    if sys.platform == 'win32':
        font_list = font_manager.findSystemFonts()
        file_path = font_path
        font_attribute = font_manager.FontProperties(fname=file_path)
    return font_attribute.get_name()

if __name__ == '__main__':
    font_path = sys.argv[1]
    font_name = main(font_path)
    print(font_name)
    sys.exit(0)