카테고리 보관물: 미분류

공짜책 – 케빈 머피의 새 기계학습 책

무료책입니다. 아래 링크를 방문하시면 됩니다.

https://probml.github.io/pml-book/book1.html

기계학습 서적의 저자로 유명한 Kevin Patrick Murphy의 새 책 이라고 합니다.

현재는 Draft 판과 Python 코드를 다운로드 받을 수 있습니다.

저는 아직 읽어 보지는 못했습니다만 목차만 살펴봤을 때는 다른 기계학습 서적과 대동소이한 구성으로 보입니다.

CART – 결정 트리와 회귀 트리 Decision Tree and Regression Tree #1

결정트리(Decision Tree)인 CART 알고리즘에 대해 포스팅합니다.

제 계획대로라면 벌써 몇년전에 포스팅을 했어야 했지만 계획대로 되는 것은 언제나 그렇듯이 없습니다.

CART는 GBDT, Random Forest, XGboost, LightGBM 등의 트리계열 알고리즘의 근간이 되는 매우 중요한 알고리즘입니다. 요즘 트리 계열 알고리즘에서 가장 좋은 성능을 보이는 XGboost에게는 할아버지쯤 되는 알고리즘입니다.

CART에는 결정 트리(Decision Tree)와 회귀 트리(Regression Tree)라는 알고리즘이 2개 들어 있습니다. 한 개가 아닙니다. 그런데 둘은 거의 비슷하기 때문에 1개라고 봐도 무리가 없긴 합니다. 일란성 쌍둥이라고 생각하면 됩니다. CART는 Classification And Regression Trees의 약어인데 여기에도 분류와 회귀를 하는 트리라는 것을 알려주고 있습니다.

어쨌든 이 둘의 차이는 뒤에 설명하겠습니다.

알고리즘의 컨셉

알고리즘의 컨셉은 간단합니다. 학습 데이터를 해석해서 알아서 트리 구조를 자동으로 만든 다음 만들어진 트리를 이용해서 분류, 예측 문제를 해결하는 모델을 만드는 것입니다.

여기서 중요한 것은 트리를 자동으로 만든다는 것입니다. 트리를 사람이 만들어줘야 한다고 상상하시는 분들이 있는데 아닙니다.

분류 트리와 회귀 트리의 차이

분류 트리와 회귀 트리의 차이를 살펴보겠습니다.

결정 트리(Classification Tree)는 클래스(등급) 또는 레이블(표 딱지)을 예측하는 것으로 “남”또는 “여”, “예” 또는 “아니오”, “A”, “B”, “C” 와 같이 어떤 것인 맞추는 것(판별)이고

회귀 트리(Regression Tree)는 연속형 숫자인 1,2,3 123, 28.5와 같은 숫자를 맞추는 것입니다. 사람의 키를 맞춘다거나, 대출 상환 예상액을 맞춘다거나 하는 것(예측)입니다.

CART의 탄생

뭐든 그렇지만 자세한 설명 전에 역사를 조금 살펴보면 이해하는데 도움이 됩니다.

CART는 1980년대에 발표된 것으로 이제 나이가 들대로 든 알고리즘이지만 아직도 현역에서 많이 쓰입니다. 기계학습 알고리즘이 다들 독특한 면이 있긴하지만 CART도 상당히 독특한 기계학습 알고리즘입니다. 이 알고리즘은 학술상의 갈래로 보면 데이터마이닝 계열로 많이 분류됩니다. 비즈니스적인 결정을 과학적으로 해서 가치 창출얼 하기 위한 것. 그러니까 좋은 결정을 내리는 것을 자동화하기 위한 용도로 만들어진 것입니다.

만든 분들의 말에 의하면 통계 분석이나 문제 해결을 할 때 마다 회귀모델같은 통계 모델이나 여러 수리 모델을 매번 디자인하고 적용하는 것이 비효율적이라서 싫었다고 합니다.

데이터마이닝 계열이라고 했지만 이것도 기계학습 알고리즘이고 만들어진 원리를 보면 꽤 깊은 고급 통계 이론과 정보 이론이 함축되어 있습니다. 만만한 알고리즘은 아닙니다. 이 알고리즘의 저자들이 총 4명인데 통계학, 과학, 의학, 경제학, 컴퓨터 공학에 매우 뛰어난 석학들입니다. 이 알고리즘이 이런 분야에 고루 쓸 수 있는 다목적 도구라고 해석해 볼 수 있습니다.

CART의 저자와 논문

보통 알고리즘은 논문으로 많이 발표되는데 CART 알고리즘은 논문이 없습니다. 논문으로 발표된 알고리즘이 아니고 책으로 발표된 알고리즘입니다. 논문을 찾다가 논문이 없고 대신 책이라는 사실에 충격받았던 기억이 있습니다.

오래된 책인 만큼 표지가 매우 촌스럽습니만 아마존에서 아직도 판매하고 있습니다. 출판일을 보면 1984년 1월 출판이 첫판입니다.

CART의 저자들

앞서 말씀드렸듯이 책 표지에 있는 저자 4명은 모두 각 분야에서 상당히 유명한 분들입니다. 아래의 4명입니다.

  • Leo Breiman – University of California, Berkeley
  • Jerome H. Friedman – Stanford University
  • Richard A. Olshen – Stanford University
  • Charles J. Stone – University of California, Berkeley

책의 저자들까지 나열한 것은 위의 저자들 중에
Leo Breiman (레오 브라이먼)
Jerome H. Friedman (제롬 프리드먼)
이름을 굳이 외우실 필요는 없습니다만 이 두 사람은 알아두는 것이 기계학습을 깊이 공부하신다면 도움이 되기 때문입니다. 이 두 사람은 CART 발표 이후에 Random Forest(랜덤 포레스트)와 GBDT (Gradient Boosted Decision Tree), GBRT(Gradient Boosted Regression)를 만든 사람들입니다. 아마 기계학습을 조금이라도 공부하신 분들은 이 알고리즘들의 이름을 알고 있을 것입니다. 특히 랜덤포레스트는 너무도 유명하지요. 그리고 부럽게도 위키피디아에도 이 분들 이름이 등록되어 있습니다.

CART와 유사한 알고리즘

ID3, C4.5, C5.0 이라는 결정 트리(Decision Tree)알고리즘이 있습니다. 나열한 순서대로 개량된 버전인데 C4.5가 가장 많이 알려져 있습니다. CART와 유사하다고 하는데 동일한 시대에 발표된 것이지만 관련은 없다고합니다. 구조도 서로 비슷하다고 알려져 있습니다만 제가 이 알고리즘은 잘 알지 못합니다.

CART가 현재는 라이센스가 없이 무료인 반면 C4.5 구현체가 판매되었던 알고리즘이라서 사용자가 많지는 않습니다. 성능은 꽤 좋다고 하며 CART와 C4.5의 성능은 비슷하다고 알려져 있습니다.

CART의 개량형, 강화형

CART의 개량형, 강화형 또는 영향을 받은 것은 다음과 같은 것들이 있습니다.

  • Random Forest
  • Gradient Boosted Decision Tree / Gradient Boosted Regression Tree
  • XGboost
  • lightGBM
  • CatBoost
  • Isolation Cut Forest
  • Robust Random Cut Forest

앞서 말했듯이 요즘 각광받는 XGboost, lightGBM도 모두 CART 계열입니다. 현재 결정 트리 계열 중에 가장 주목받는 것은 lightGBM 입니다. 그래서 요즘은 CART를 사용하지 않고 바로 lightGBM이나 XGboost를 사용하는 경우도 많습니다. 다만 CART만 앙상블 모델이 아니고 다른 알고리즘은 모두 앙상블 모델입니다. 앙상블 모델은 여러 모델을 합쳐서 하나의 모델로 만든 것을 말합니다.

위의 알고리즘 중에서 저는 개인적으로 lightGBM을 매우 좋아합니다만 그 이유는 XGboost이 비해서 가볍고 범주형 변수를 지원하기 때문입니다. 자세한 얘기는 다음 기회에 하기로 하겠습니다.

Decision Tree와 Regression Tree의 차이

Decision Tree(결정 트리, 분류 트리)와 Regression Tree(회귀 트리)는 매우 유사합니다. Decision Tree가 남,녀와 같이 클래스 또는 레이블로 된 것을 분류해주는 Classification(분류) 문제 해결이라면 Regression Tree는 몸무게, 키, 확률 등의 연속형 수치값을 추정해주는 Regression 입니다.

참고로 Regression Tree에는 흔히 말하는 Linear Regression과 같은 회귀 모델이 들어 있지 않습니다. 연속형 값을 추정하는 것을 넓은 의미로 Regression(회귀)라고 하는데 Regression Tree는 종단 노드에서 평균을 사용해서 결과값을 추정합니다. 평균을 사용해서 추정하는 것은 넓은 의미에서 회귀라고 말 할 수 있습니다.

설명이 어려워졌는데 쉽게 말하자면 Regression Tree에서 말하는 Regression은 Linear Regression(선형회귀)나 Logistic Regression(로지스틱 리그레션)에서 말하는 그 회귀(Regression)이 아닙니다.

CART의 원리

복잡한 수식 같은 것을 적으려면 시간과 지면이 많이 필요합니다. 우선 원리만 적고 자세한 것은 나중에 업데이트하도록 하겠습니다.

cart algorithm에 대한 이미지 검색결과

CART 위와 같은 트리를 자동으로 만드는 것입니다. 위의 그림은 CART에서도 Decision Tree를 설명한 것인데 남 (Male), 여 (Female)를 구분하는 판별 모형을 만들때 입력 변수(Input variable, feature, 자질)인 키 (Height)와 몸무게 (Weight)를 이용하는 Decision Tree입니다.

입력 변수는 범주형 변수를 넣을 수도 있습니다. 만약 머리색을 입력 변수 중 하나로 추가해서 넣는다고 하면 Black, Brown, Pink 등과 같은 것이 됩니다.
출력 클래스도 남, 여가 아닌 남,여,모름 이렇게 3개 이상을 지정할 수 있습니다. 단 Decision Tree에 해당하고 Regression Tree는 안됩니다.

CART의 신비는 저 “트리를 어떻게 자동으로 만들어 주느냐”입니다.

이 다음 설명은 다음 편으로 짤라서 쓰겠습니다.

데이터과학하려면 R과 Python 중 어떤 걸 배워야 하나?

요즘 추세로 본다면 데이터과학, 데이터분석, 딥러닝, 기계학습 등을 하려면 R과 Python 중 하나를 선택해야 합니다.

R과 Python은 둘 다 모두 스크립트(script) 언어이면서 둘다 대화형 언어(Interpretor)이기도 합니다.

스크립트 언어라는 것은 C++이나 Java 처럼 컴파일을 하거나 중간코드를 빌드하지는 않는 것을 말하는 것이고 대화형 언어라는 것은 코드를 입력하고 그 결과를 즉시 확인할 수 있다는 것입니다.

그래서 가능하다면 R과 Python을 둘 다 하는 것이 훨씬 좋습니다. 하지만 R이 PYthon보다는 학습장벽이 매우 높기 때문에 둘 중에 어떤 것을 먼저해야 하냐고 묻는다면

대답은 Python 입니다.
현재는 Python을 먼저 선택하는 것이 대체로 유리합니다.

그럼 R은 생각할 필요도 없는 것인가? 라고 묻는다면 당연히 그렇지 않습니다. 자신이 어떤 쪽의 일을 할 것인지 하고 있는지, 어떤 스타일로 하는지에 따라 달라질 수 있습니다.

데이터과학 랭귀지를 선택할 때 고려할 것

선택을 할 때 아래와 같은 간단한 체크 리스트를 만들어 봤습니다.

  • 앞으로 통계 분석을 더 많이 하게 될 것 같다. R
  • 시각화가 편하고 빠르면 좋겠다. R
  • 일괄 처리 작업이나 텍스트마이닝 같은 처리도 하고 싶다. Python
  • 기계학습 모델을 자주 만들고 많이 만들것 같다. Python
  • 데이터 전처리와 이관, 자동화 같은 것도 해야 한다. Python
  • 최신 통계 패키지(새 알고리즘, 기법같은 것들)가 많아야 한다. R
  • 최신 기계학습 패키지가 많아야 한다. Python
  • 딥러닝을 해야 한다. Python
  • IOT도 해야 하고 로그 분석도 해야한다. Python
  • 시계열 분석, 수리 통계, 금융 분석 이런 고급 통계나 수학과 관련된 것을 앞으로 할 것이다. R
  • 빅데이터 플랫폼들에 접속해서 비정형 데이터를 가져오거나 처리해야 한다. Python
  • 나는 금융공학에 관심이 있다. Python
  • UI가 있는 웹개발도 좀 해야 한다. Python
  • 웹개발도 해야하긴 하지만 복잡한 것은 안하고 위젯 정도나 간단한 시각화 수준이면 된다. R (Shiny가 있으므로)
  • 주로 연구하고 논문쓰는 일을 많이 할 것 같다. R
  • 나는 의사이고 실험을 많이 한다. R
  • 분석 리포트를 많이 쓰거나 논문을 많이 써야 한다. R
  • 바이오인포메틱스이고 유전자 데이터 이런 일과 관련이 있다. Python
  • 앞으로 클라우드의 자원 활용도 많이 하게될 것 같다. Python
  • 범접할 수 없는 레벨의 과학자처럼 보여지고 싶다. R
  • 데이터과학의 귀재로 보여지고 싶다. Python

대부분 R과 Python 둘다 가능한 것이지만 둘 중에 더 유리한 것 하나를 답으로 적어두었습니다. 경험을 바탕으로 적은 것입니다. 의견의 차이가 있을 수 있지만 무분별한 비난은 사절합니다.

위의 목록을 쭉 훑어보면 대체로 PYthon이 답인 경우가 많으니 그냥 Python 선택하면 된다는 쪽으로 보여집니다만 위에 열거한 것들에서 선택된 것의 숫자만 보고 그렇게 판단하면 안됩니다.

R의 좋은 점

R을 옹호하는 입장이 되서 장점을 어필해 보겠습니다.

R의 강점은 커뮤니티와 커뮤니티에서 제공되는 패키지가 있습니다. 최신 통계 분석, 알고리즘이나 기법들이 패키지가 가장 빨리 제공되고 있으며 품질도 상당히 좋습니다.

대부분 패키지를 만들어서 제공하시는 분들이 그 분야의 석박사이거나 교수들입니다. 100% 믿을 수 있는 것은 아니지만 보통은 쓰는 사라들보다 그 부분에 대해서는 훨씬 전문적인 분들이라서 믿고 쓸 수 있습니다.

또 패키지가 중앙집중식으로 엄격하게 관리되고 있습니다. 패키지가 등록될 때 절차도 까다롭고 검증도 까다롭습니다. 그래서 패키지가 작동하지 않는다거나 하는일이 거의없고 오래된 패키지들도 비교적 관리가 잘됩니다.

Python의 좋은 점

Python을 옹호하는 입장에서 장점을 어필해보면.

Python을 쓰는 사람이 워낙 많아서 자료를 구하기 쉽고 샘플 코드를 구하기도 쉽습니다. 사용자 층이 두텁다고 하죠. 이제 가장 사용자가 많은 랭귀지가 되었습니다.

Python은 다런 언어에 비해 배우기 쉬운 편입니다. 물론 그렇다고 해서 책 한 권 읽고 바로 할 수 있을 만큼 정말 쉽다는 얘기는 또 아닙니다. 다른 랭귀지에 비해서 비교적 쉽다는 거입니다.

직군별로 간단하게 선택하는 방법

“하는 일” 또는 “하려고 하는 일”의 직군을 보고 간단하게 선택할 때는 이렇게 하면 됩니다.

  • 엔지니어, 개발자 쪽에 가깝다면 Python
  • 분석가, 연구원에 가깝다면 R
  • 그냥 과학자라면 아무렇게나 하세요. 아마 둘 다 안 쓸 가능성이 큽니다.

기획자, 세일즈, 비즈니스 직군인데 분석용 언어를 배워보려면 어떤 것을 써야 하나?

데이터분석이나 데이터과학을 하려고 하는데 그 일이 꼭 컴퓨터랭귀지를 쓰지 않아도 엑셀이나 다른 도구로 할 수 있는 것이 아닌지 먼저 확인해 보세요. 대부분 간단한 것은 다 할 수 있습니다.

그럼에도 불구하고 취미이든, 도전이든, 자기계발이든, 미래를 위해서 이든, 컴퓨터 언어를 하나 배우고 싶다면?

Python을 선택하면 됩니다.

왜냐면 R이 더 안좋아서가 아니라 배우기 더 어렵기 때문입니다.

그다지 궁금하지 않겠지만 이 포스트를 보고 또 Python에 너무 편향된 것이 아니냐고 하실 분들이 있을 것 같아서 마지막으로 말씀드리면 저는 Python 보다는 R을 더 좋아합니다.

Docker proxy 설정

Docker를 사용할 때 docker를 구동시킬 서버가 방화벽 안쪽에 있거나 외부 네트워크(인터넷)에 직접 접속하지 못해서 docker image를 당겨오거나 docker container를 빌드하지 못할 때가 있습니다.

Proxy를 사용해야 하는데 다음과 같이 하면 됩니다.

구동할 서버의 구동할 계정에 디렉토리를 하나 생성하고 파일을 만듭니다.

mkdir ~/.docker
vim ~/.docker/config.json

아래의 내용을 추가해줍니다. proxy 서버의 주소와 port는 각자의 네트워크에 해당하는 것으로 바꾸면 됩니다.

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://proxy.test.com:8080",
     "httpsProxy": "http://proxy.test.com:8080",
     "noProxy": "localhost,127.0.0.1"
   }
 }
}

그리고 나서 다시 docker로 container를 빌드하면 됩니다.

Python 소스 컴파일에서 Error in `python': corrupted size vs. prev_size 에러

리눅스에 문제가 있거나 너무 오래된 버전의 리눅스 배포판을 사용할 때 Python source를 다운로드 받아서 빌드해야 하는 경우가 있습니다

이때 configure를 실행한 뒤 make 를 실행하면 다음과 같은 에러가 나올 수 있습니다.

Error in `python': corrupted size vs. prev_size

해결책은 다음과 같이 하면 됩니다.

sudo apt-get install libtcmalloc-minimal4
export LD_PRELOAD="/usr/lib/libtcmalloc_minimal.so.4"