파이썬 2와 파이썬 3 중 무엇을 써야할까?

파이썬의 주요 버전은 크게 버전 2와 버전 3 두 가지로 나뉩니다. 버전 3이 최신이지만 버전 2가 여전히 과학 분야에서 가장 흔하게 사용되고, 여러 운영체제에서 기본적으로 채택하고 있는 버전입니다. 버전 3이 릴리즈됐을 때 대부분의 과학용 패키지는 이를 지원하지 않았기 때문에 버전 2를 고수해왔지만, 이후 파이썬 3과 호환이 불가능한 일부를 제외하고는 거의 모든 패키지들이 업데이트 되었습니다.

최근에는 파이썬 3에 대한 인기가 늘어나고 있지만, 여전이 데이터 사이언티스트들과 데이터 분석가 사이에서 널리 사용되는 버전은 파이썬 2입니다. 하지만, 파이썬 3을 사용한다고 해서 문제될 것은 없습니다. 파이썬 3 사용자라면 파이썬 2에서 구현된 코드를 파이썬 3로 변환하는 것이 어렵지 않기 때문입니다.


Python Packages in ML

Numpy

트라비스 올리펀트(Travis Oliphant)가 개발한 Numpy는 파이썬 언어를 기반으로 하는 모든 분석용 솔루션의 핵심입니다. Numpy는 다차원 배열과 이 배열을 대상으로 여러 가지 수학적 연산을 수행하는 많은 함수들을 제공합니다. 배열은 다차원으로 배열된 데이터 블록으로서 벡터와 행렬을 구현합니다. 배열은 데이터 저장뿐만 아니라 빠른 행렬 연산(벡터화, Vectorization)에 유용하며, 특별히 데이터 과학 분야의 문제를 해결하려고 할 때 반드시 필요한 패키지 입니다.


Scipy

Scipy는 본래 트라비스 올리펀트, 페루 피터슨, 에릭 존슨이 시작한 프로젝트로, 선형 대수, 희소행렬, 신호 및 이미지 처리, 최적화, 급속 퓨리에 변환(Fast Fourier Transformation)등 다양한 종류의 과학용 알고리즘을 제공하면서 Numpy의 기능을 보완합니다.


Pandas

Pandas는 Numpy와 Scipy로 불가능한 모든 기능을 지원합니다. 특히 Pandas 특유의 객체 데이터 구조, 데이터 프레임(DataFrame), 시리즈(Series) 덕분에 서로 다른 데이터 타입으로 구성된 복잡한 테이블과 시계열 데이터를 처리할 수 있습니다. 데이터의 분할, 정제, 유실 데이터 처리, 추가, 재명명, 병합, 변환을 지원해 결국 사용자 의도에 따라 시각화가 가능하도록 합니다.


Scikit-Learn

Scikits(Scipy Toolkit)의 일부로 시작된 Scikit-learn은 파이썬을 사용하는 데이터 과학 연산의 핵심 패키지입니다. Scikit-learn은 데이터 전처리, 지도 및 비지도 학습, 모델 선택, 검증, 오차 기준에 필요한 모든 기능을 제공합니다.

  • 웹 사이트 : http://scikit-learn.org/stable/
  • 데이터 처리 : sklearn.preprocessing, sklearn.feature_extraction)
  • 모델 선택 및 검증 : sklearn.cross_validation, sklearn.grid_search, sklearn.metrics)
  • 목표 값 에측 : sklearn.linear_model

Matplotlib

Matplotlib는 배열로부터 고품질 도표(Plots)를 생성하고 그 도표를 대화형으로 시각화하기 위해 제작된 블록 모두를 포함하는 라이브러리입니다. PyLab 모듈 안에 포함된 MATLAB 방식의 도표 프레임워크를 모두 사용할 수 있습니다.


Gensim

Gensim은 병렬 분산 온라인 알고리즘을 사용하는 대형 문자 집합 분석용 오픈소스 패키지입니다. 잠재 의미 분석(Latent Semantic Analysis, LSA), 잠재 디리클레 할당(Latent Dirichlet Allocation, LDA)에 의한 주제 모델링, 구글의 지도 및 비지도 머신 러닝에서 사용하기 위해 텍스트를 벡터 특징으로 변환하는 알고리즘인 word2vec을 구현할 수 있습니다.


H2O

H2O는 빅데이터 분석용 오픈소스 프레임워크입니다. R, Python, Scala, Java 프로그래밍 언어로 사용할 수 있으며, 단독 머신 혹은 하둡 클러스터를 쉽게 사용할 수 있도록 하였습니다. 스케일 업과 스케일 다운 기능을 지원합니다.


XGBoost

XGBoost는 확장과 이식이 가능한 분산형 경사 부스팅(Gradient Boosting) 라이브러리입니다. Python, R, Java, Scala, Julia, C++를 지원하며, 단일 머신 뿐만 아니라 하둡과 스파크 클러스 모두에서 동작 가능합니다.


Theano

Theano는 다차원 배열을 포함한 수학적 표현식을 효율적으로 정의하고, 최적화하며, 평가할 수 있도록 하는 파이썬 라이브러리입니다. 기본적으로 심층 신경망(Deep Neural Networks)를 만들기 위해 필요한 모든 빌딩 블록을 제공합니다.


TensorFlow

TensorFlow는 배열이 아닌 데이터 플로 그래프를 사용해 수치 연산을 하는 오픈소스 소프트웨어 라이브러리입니다. 그래프 표현에서 노드(Node)는 수학적 연산을 나타내고, 그래프 엣지(Edge)는 노드들 사이를 이동하는 텐서라는 다차원 데이터 배열을 나타냅니다.


sknn library

sknn 라이브러리는 Pylearn2 래퍼(Wrapper)로서, Theano의 전문가가 아니더라도 심층 신경망 네트워크를 구현할 수 있도록 하였습니다.


Theanets

Theanets 패키지는 파이썬으로 작성된 딥러닝 및 신경망 툴킷으로, Theano를 사용해 연산을 가속화한다. sknn처럼 딥러닝 모델 생성을 위해 Theano 기능이 쉽게 연결될 수 있도록 합니다.


Keras

Keras는 고수준으로 최소화된 단위 신경망 라이브러리로, 파이썬으로 작성되었으며 Tensorflow 혹은 Theano상에서 사용할 수 있습니다.


확장성이란 무엇인가?

엄청난 양의 데이터는 언제나 과학자들과 데이터 분석가들이 당면하는 도전 과제였습니다. 훈련 객체의 개수를 n이라 할 때 최근 머신 러닝 알고리즘의 계산 복잡도는 O(n²), 심지어 O(n³)에 이르는데, 과거에 과학자들과 데이터 분석가들은 좀 더 효율적인 데이터 알고리즘에 의존함으로써 그런 대용량 데이터세트와 관련된 문제를 처리했습니다.

데이터 세트는 사례가 많거나 변수들이 많은 경우, 아니면 이 둘 모두가 많은 경우 크기가 커질 수 있는데, 확장 가능한 알고리즘은 문제의 크기에 따라 실행 시간이 거의 선형으로 증가하므로 이런 데이터세트를 효율적으로 처리할 수 있습니다. 따라서 이는 더 많은 시간을 더 많은 데이터와 1:1로 교환하는 문제일 뿐입니다. 하지만, 어떠한 머신 러닝 알고리즘은 대용량 데이터를 다뤄야 하는 상황에서 확장되지 않습니다. 단순히 작업이 멈춘다거나 실행 시간이 지수 함수처럼 비선형적인 형태로 증가해서 학습이 불가능한 경우가 있습니다.

근래에는 저렴한 스토리지, 대용량 RAM, 다중 프로세서 CPU의 도입으로 엄청난 변화의 물결이 있었습니다. 이러한 큰 변화의 주인공은 바로 하둡 분산 시스템(Hadoop Distributed File System) 기반의 오픈소스 프레임워크인 하둡(Hadoop), 맵리듀스(Map Reduce), 그리고 일반적인 컴퓨터 네트워크상의 병럴 처리 기법이 있습니다.

이러한 변화가 규모가 큰 문제를 해결하는 방법에 얼마나 깊고 긍정적인 영향을 미쳤는지 확인하기 위해 대용량 데이터세트의 분석을 방해했던, 방해하고 있는 요인들을 알아보도록 하겠습니다.

  • 분석에 걸리는 시간에 영향을 미치는 연산(Computing)
  • 단위 시간당 스토리지에서 메모리로 이동하는 데이터양에 영향을 미치는 I/O
  • 한 번에 처리할 수 있는 데이터양에 영향을 미치는 메모리

또한, 하드웨어가 가지는 한계는 분석 중인 데이터 유형에 따라 많은 영향을 미치게 됩니다.

  • 긴 데이터(Tall Data) : 사례의 수가 많은 데이터
  • 넓은 데이터(Wide Data) : 특징(Featuress)의 개수가 많은 데이터
  • 길고 넓은 데이터(Tall and Wide Data) : 특징과 사례가 모두 많은 데이터
  • 희소 데이터(Sparse Data) : 0 성분 개수가 많거나, 0으로 변환돌 가능성이 있는 성분 데이터가 많은 데이터

추가적으로, 데이터로 학습을 진행하기 위해서는 사용할 알고리즘이 중요합니다. 각 알고리즘마다 자신만의 특성을 가지는데, 이 특성은 편향(Bias) 혹은 분산(Variance)에 따라 서로 상이하게 영향을 받는 방법을 사용해서 데이터를 매핑하는 방식에 기인합니다. 따라서 지금까지 머신 러닝으로 해결해왔던 문제들에 관해서는 경험 혹은 실증적 검증에 근거해 특정 알고리즘이 다른 알고리즘보다 더 낫다고 판단했습니다. 규모가 큰 문제를 다룰 때는 알고리즘을 결정할 때 이외에 또 다른 사항들을 추가로 고려해야 합니다.

알고리즘이 얼마나 복잡한가?

즉, 데이터에서 행과 열의 개수가 선형 혹은 비선형 비례 관계로 연산 횟수에 영향을 미치는지 살펴봐야 합니다. 대부분의 머신 러닝 기법들은 이차(Quadratic) 혹은 삼차(Cubic) 복잡도를 갖는 알고리즘에 기반하므로 이들을 빅데이터에 적용하는 데에는 많은 제약이 따릅니다.


모델이 얼마나 많은 파라미터를(Parameters)를 갖는가?

이는 단순히 예측값들의 분산에 관한 문제(과적합)가 아닌 그 모두를 계산하는 데 걸리는 시간과 관련된 문제입니다.


최적화 과정이 병렬로 처리될 수 있는가?

다수의 노드들 혹은 CPU 코어들로 연산을 쉽게 분할할 수 있는지? 혹은 순차적인 단일 최적화 과정에 의존해야만 하는가?


해당 알고리즘은 한 번에 모든 데이터로부터 학습을 하는가? 아니면 단일 객체들(Examples) 혹은 작은 배치(Batches) 데이터를 사용할 수 있는가?

위와 같은 문제들은 다음과 같은 접근 방식을 통해 해결할 수 있습니다.

  • 스케일 업(Scale-up) : 소프트웨어 혹은 하드웨어 교체를 통해 단일 머신의 성능을 향상시키는 방법
  • 스케일 아웃(Scale-out) : 주로 스토리지 디스크와 그 외 CPU 같은 외부 자원들을 활용하는 다수의 머신들로 연산을 분산시키는 방법
  • 스케일 업 및 스케일 아웃, 최적의 스케일 업 기법과 스케일 아웃 기법을 함께 활용하는 방법


+ Recent posts