카테고리 보관물: 미분류

도커(docker)가 뭔가요?

쉽고 빨리 배우는 후루룩 개발 시리즈입니다.

Docker “도커”라는 것이 있습니다.

개발 세계에서 말하는 도커는 배가 정박하는 그 도커가 아닙니다.

도커를 흔히 컨텐이너라고 부릅니다. 화물 실어 나를때 배에 싣는 큰 쇠로된 상자인 컨테이너와 같은 것은 아니지만 개념은 비슷합니다.

1대의 서버에 전혀 다른 소프트웨어를 설치해서 사용하다보면 서로 궁합이 안 맞아서 한쪽이 설치가 안되거나 작동이 안되는 일이 발생합니다.

필요한 소프트웨어들을 버에 설치할 때 같이 필요한 소프트웨어들이 엄청 많이 필요할 수 있습니다.

몇 세트를 설치하다보면 이제 세트들끼리 서로 충돌을 하는 소프트웨어들이 생깁니다. 뭐 이런일들입니다.

세트A: ”b가 설치되어 있으면 나는 작동못해”

세트B: “b는 나한테 꼭 필요해”

이 외에도 여러가지 복잡한 일들이 생깁니다. 이 문제를 해결할 수는 있지만 소프트웨어 세트가 복잡하고 많고 오래될 수록 점점 지옥이 되갑니다.

그래서 하나의 서버에 전혀 다른 서버인 것처럼 환경자체를 가상으로 구별하고 마치 다른 소프트웨어가 설치되어 있지 않은 것처럼 깨끗하게 분리할 수 있는 방법이 개발되었습니다.

이걸 영어로 virtualziation “버추얼라이제이션”이라고 하고 우리말로는 “가상화” 라고 합니다.

도커는 가상화 소프트웨어입니다. 즉 서버의 환경을 분리해주는 것입니다.

물론 가상화는 이것보다는 설명할 것이 더 많습니다만 우선 여기까지만 이해하세요.

도커의 문제

  • 환경 분할해서 쓰는 OS는 리눅스만 가능해요.
  • 완전가상화가 아니기 때문에 OS자체를 전혀 다른 것을 설치할 수 없어요.
  • 완전가상화는 OS자체를 전혀 다른 것으로 바꿀 수 있어요. 하지만 도커는 완전가상화가 아니예요.

도커가 하는일

  • 리눅스 환경을 분리해서 전혀 다른 서버인 것처럼 나눠줘요.
  • 나눠진 환경에 소프트웨어를 설치할 수 있고, 코드를 짜서 넣을 수도 있어요.
  • 환경 자체를 통째로 받아서 저장해 둘 수 있어요. 이걸 도커 이미지로 만든다고 말해요.
  • 만들어진 이미지로 나중에 빵틀에서 빵찍어 내듯이 환경을 그대로 실행해서 작동하도록 만들 수 있어요.

도커를 쓰면 좋은 것

도커를 CI/CD에도 쓰면 좋습니다.

  • 도커로 서비스 소프트웨어를 만들어서 도커 이미지자체를 배포할 수 있습니다. 이게 편한 이유는 소프트웨어를 배포할 때 매번 서버의 환경이 소프트웨어가 구동하는데 필요한 환경과 일치하는지 확인해야 하고 안 앚으면 맞춰주고 해야 하는데 도커를 이용하면 필요가 없어집니다.
  • 매번 환경을 세로 만들기 때문에 환경을 구성하다가 환경구성에 필요한 소프트웨어가 갑자기 설치가 안되거나 오류가 발생했다거나 하면 그 사실을 알 수 있습니다. 소프트웨어가 동작하는 환경을 구성하는것 자체가 잘되는지 배포하기 전에 테스트를 할 수 있습니다.

별것 아닌것 같지 개발자를 편하게 해주는 것입니다.

CI/CD가 뭔가요?

문과능력자, 예능능력자 위한 개발 쉽게 이해하기 시리즈

개발자 용어로 CI/CD 라는 것이 있습니다.

“씨아이 씨디”라고 발음합니다. 콤팩트디스크 아닙니다.

CI/CD는 Continuous Integration / Cotinuous Deployment의 약어입니다.

CI = Continuous Integration 는 지속적 통합

CD = Continuous Deployment 는 지속적 배포

입니다.

용어가 어려워 보이지만 알고보면 별거 아닙니다.

소스코드를 소프트웨어가 실행되도록 구현체를 반드는 것을 빌드라고 합니다. 빌드를 소스코드를 고칠때마다 계속해서 실행해서 언제라도 소프트웨어를 배포할 수 있게 준비하는 것을 CI라고 부릅니다. 소스코드를 고쳐서 저장소에 업데이트할 때마다 자동으로 소프트웨어가 빌드됩니다.

그리고 자동으로 빌드된 소프트웨어가 자동 또는 반자동으로 서비스에 배포되는 것을 CD라고 합니다.

CI의 과정은 이렇습니다.

소스코드 고침 -> 빌드 됨 -> 자동으로 테스트 해줌 -> 빌드에서 오류가 발생하면 경고 메세지가 나타남 -> 다시 빨리 고침

CI를 하는 이유

  • 소스들 고치고 나서 빌드가 잘되는지 개발자가 확인하고 안되면 다시 수정하는 테스트 시간을 줄이기 위해서입니다.
  • 여러 사람이 소스코드를 동시에 편집하거나 같이 작업하기 때문에 각자 맡은 부분에서 자기가 고친 부분은 자기가 책임을 질 수 있게 하기 위한 것입니다.
  • 빈번하게 소스코드를 고치고 기능추가, 버그수정을 짧게 짧게 끊어서 하는 것이 더 효율적이고 관리도 편해서 그렇게 하기 위해서 입니다.

CD의 과정

가상 환경 준비 -> 빌드된 소프트웨어가 잘 작동하는지 테스트 -> 오류이면 경고 -> 패쓰 후에 자동으로 서비스에 적용 또는 제품소프트웨어 배포

CD를 하는 이유

서비스 업체(구글이나 네이버, 페이스북 같은데들)은 소프트웨어를 빌드한 후에 잘 작동하는지 실험하는 것도 큰 일이고 부담이 됩니다. 이것을 자동화해서 소프트웨어가 빌드될때마다 잘 작동하는지 지속적으로 테스트하고 테스트가 완료되면 자동으로 배포해서 최신으로 유지합니다.

다 개발자들 편하고 장애(에러)가 생기는 것을 줄이기 위한 것입니다.

DevOps

이런 일을 해주는 시스템을 만들고, 구축하고, 관리하는 사람을 요즘은 DevOps “데브옵스”라고 부릅니다.

Development Operations의 약어입니다. 즉 개발환경을 운영하는 사람을 말합니다.

그래서 DevOps는?

  • 소프트웨어 엔지니어입니다.
  • 개발도 조금 하지만 제품(판매하는 소프트웨어나 서비스소프트웨어)를 개발하지는 않습니다.
  • 개발환경을 구축하는데 필요한 개발만 합니다.
  • 하드웨어는 관리하지 않습니다.

참고자료

https://www.redhat.com/ko/topics/devops/what-is-ci-cd

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

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

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의 신비는 저 “트리를 어떻게 자동으로 만들어 주느냐”입니다.

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