Python 라이브러리 정리 - BD-SEARCH/MLtutorial GitHub Wiki
인공지능, 딥러닝
Tensorflow
공식 홈 페이지: https://www.tensorflow.org/
딥러닝에 가장 많이 쓰이는 라이브러리. 인공신경망 뿐만 아니라 회귀 분석과 같은 다른 기계학습 기법도 지원한다. Keras API나 scikit-learn 호환 API도 제공한다. 데이터 저장은 Tensorflow 고유의 개념인 tensor(값을 담고 있는 배열 비슷한 것, 텐서라고 읽음)나 Numpy Array를 사용한다.
CPU만 사용하면 일반 tensorflow 라이브러리를 설치하면 되는데 GPU(CUDA)를 사용하려면 tensorflow gpu 버전을 설치해야 한다. 기본 버전은 AVX(SSE, SSE2 포함) 명령어까지 지원하고 더 빠른 AVX2는 지원하지 않는다. gpu 버전은 설치하기 조금 까다롭다. 딥러닝을 빠르게 하려면 GPU를 사용해서 학습을 해야 한다. CPU 사용시 자신의 CPU가 가진 모든 어셈블리 명령어를 사용하도록 컴파일된 바이너리를 사용하면 속도가 올라간다. 예를 들어 인텔 Haswell CPU는 SSE/SSE2/AVX/AVX2를 지원하는데 기본 바이너리는 AVX2를 지원하지 않는다. AVX2도 지원하는 바이너리를 설치하면 학습 속도가 20% 정도 올라간다.(학습 조건에 따라 다를 수 있음)
Keras
공식 홈 페이지: https://keras.io/
딥러닝 모델을 직관적으로 설계할 수 있게 해 주는 라이브러리. High-Level API를 제공하기 때문에 모듈화가 잘 되어 있고 사용하기 쉽다. 빠르게 모델을 설계할 때 사용하면 좋다. 내부적으로 Tensorflow나 Theano 등의 딥러닝 전용 엔진으로 구동된다. 하나의 Layer가 하나의 Class에 대응하기 때문에 직관적인 이해가 가능하다.
입력, 출력이 하나이고 간단한 모델은 Sequantial model, 입력/출력이 여러개이거나 한 layer를 나눴다가 붙였다가 하는 등 복잡한 모델은 Functional model을 사용할 수 있다. Functional model이 Sequantial model보다는 어렵지만 tensorflow를 keras api 없이 쓰는 것 보다는 쉽다.
참고 가능한 자료
- Tensorflow의 Keras 튜토리얼이미지 분류, 텍스트 분류, 회귀분석 등
- (블록과 함께하는) 파이썬 딥러닝 “케라스” 기초
PyTorch
공식 홈 페이지: https://pytorch.org/
직관적으로 딥러닝 모델을 만들 수 있는 라이브러리. Facebook Open Source 후원으로 개발 중이다. Tensorflow와 달리 Define-by-Run 패러다임을 사용하여 코드가 간결하고 이해하기 쉽다.
Scikit-Learn
공식 홈 페이지: http://scikit-learn.org/
Classification(SVM, kNN, Decision Tree 등), Regression, Clustering(K-Means 등)을 비롯하여 주요 머신러닝 기법들이 전부 구현되어 있는 라이브러리. 딥러닝이 아닌 Machine Learning을 다룰 때 추천하는 라이브러리이다. 간단한 인공신경망도 구현되어 있지만, 인공신경망은 다른 라이브러리 이용을 추천한다. Tensorflow 등장 이전에는 Python 머신러닝 라이브러리 중에서 가장 많이 쓰였다. 이 영향으로 tensorflow에서도 scikit-learn 형식의 API를 지원한다.
GluonCV
홈페이지: https://gluon-cv.mxnet.io/
컴퓨터 비전에 관한 딥러닝 모델을 제공하는 라이브러리. 다음과 같은 pre-trained model을 제공한다.
- Image Classification
- Object Detection
- Semantic Segmentation
- Instance Segmentation
수학/과학
Numpy는 인공지능 뿐만 아니라 수학/과학/공학에서 널리 쓰이므로 사용법을 꼭 알아 두는 것이 좋음.
Scipy, Numpy
공식 홈 페이지: https://scipy.org/
수학, 과학, 공학에 많이 쓰이는 기능을 모아 둔 라이브러리. 행렬/배열 처리에 많이 쓰이는 numpy, 과학 계산에 많이 쓰이는 scipy를 비롯해 다양한 라이브러리로 구성되어 있다.
- Numpy: 행렬/배열을 처리하는 라이브러리. 내부적으로 C코드를 이용해 처리해서 속도가 빠르다. 배열/행렬 관리, 푸리에 변환, 산술/수학 연산, 선형대수 등을 할 수 있다.
- Scipy: 과학 연산을 위한 라이브러리. 고급 수학 함수, 수치적 미적분, 미분방정식, 최적화, 신호 처리 등 수학과 과학, 공학에 필수적인 연산을 제공한다. 데이터를 담는 용도로 Numpy를 사용한다. Numpy에서 할 수 없는 복잡한 연산을 처리할 수 있다.
- Matplotlib: 도표를 그리기 위한 라이브러리. 복잡한 그래프와 도표를 쉽게 그릴 수 있게 해 준다.
- IPython: Python Shell 중 하나로 사용하기 편리하다. Jupyter에서 내부적으로 IPython을 사용한다.
- SymPy: 기호 수학을 하기 위한 라이브러리. 수치해석적 방법으로 식을 계산하는 것이 아니라 사람이 손으로 풀듯이 식을 계산하는 라이브러리이다.
- Pandas: 데이터 분석을 위한 라이브러리. Dataframe 자료구조를 사용하고, 통계 분석을 위한 다양한 기능을 지원한다.
이 중에서 특히 Numpy가 많이 쓰인다. Tensorflow나 Scikit-Learn 등 기계학습 라이브러리에서도 행렬 입출력을 위해 Numpy를 사용한다. 단순히 숫자를 담고 있는 배열일 경우 Numpy를 쓰면 Python List보다 속도도 빠르고 기능도 많아 편리하다. 다만 연산량이 적은 경우 Python에서 C로 데이터를 변환하고 넘겨주는 오버헤드 때문에 속도가 느려질 수도 있따.
Matplotlib는 도표를 그릴 때 많이 사용한다. 데이터를 CSV로 내보낸 뒤 MS Excel로 읽어서 그래프를 그려 분석할 수도 있지만, Python만으로도 비슷한 일을 할 수 있다.
이미지 처리
OpenCV
공식 홈 페이지: https://opencv.org/
- 맥에서 설치하기 : 엄청 오래걸린다. 마음의 준비 필요
- OpenCV 한국어 강좌
컴퓨터 비전에 사용되는 수많은 수식이나 기능을 구현해 놓은 라이브러리이다. 색 공간 변환(RGB, YCbCr 등)이나 간단한 머신러닝 알고리즘, 물체 트래킹, 이미지 필터 적용 등 수많은 기능이 구현되어 있다. 간단하게 이미지의 윤곽선을 뽑아내거나 색을 반전시키는 등 이미지 편집 소프트웨어에서 지원하는 필터는 거의 다 제공한다. C++으로 된 라이브러리이나 C, Python, Java 등에서 사용할 수도 있다.
Pillow
공식 홈 페이지: https://pillow.readthedocs.io/en/latest/
Python에서 다양한 이미지를 다룰 수 있게 해 주는 라이브러리. 이미지를 메모리에 올리고, 이미지 파일 형식이나 메타데이터 등을 변경할 수 있다. OpenCV와 달리 이미지를 변경하는 기능은 간단하게만 제공한다.
Pillow로 이미지를 로딩하면 RGB 값을 배열을 통해 접근할 수 있다. 이미지를 로딩해서 RGB 값을 추출할 때 많이 사용한다. 그래서 다른 인공지능 라이브러리 등이 내부적으로 Pillow를 사용하는 경우가 많다.
DB, 데이터 처리
SQLite3
공식 문서: https://docs.python.org/3/library/sqlite3.html
Python에 내장된 sqlite API. 여러 사용자나 세션이 동시 접근하지 않는다면 SQLite도 느리지 않다. 동시 접근시 제약이 많기는 하지만 SQL을 사용하는 DB 중에서 가장 가볍고 가장 사용하기 쉽다.
Elasticsearch
Elasticsearch (서버) 홈 페이지: https://www.elastic.co/kr/ Python 라이브러리 홈 페이지: https://elasticsearch-py.readthedocs.io/en/master/
대용량 데이터를 다룰 때 적합한 프로그램.
텍스트 처리
nltk
공식 홈 페이지 : http://www.nltk.org/
Natural Language Toolkit 패키지. 교육용으로 개발된 자연어 처리 및 문서 분석용 파이썬 패키지이다. 말뭉치 생성, 토큰 생성, 형태소 분석, 품사 태깅(POS tagging) 등의 기능을 제공한다.
gensim
공식 홈 페이지: https://radimrehurek.com/gensim/
자연어 처리에 많이 사용되는 라이브러리. 단어를 벡터 공간에 나타내는 Vector Embedding, 글의 주제를 추출하는 Topic Embedding 기능을 제공한다. 단순히 단어를 벡터로 변환하는 것 뿐만 아니라 단어 간의 유사성 추출, 문장에서의 주제어 추출 등 다양한 처리가 가능하다. 자연어 처리는 Tensorflow보다 사용하기 쉽다.
KoLNPy
공식 홈 페이지: https://konlpy-ko.readthedocs.io/
한국어 형태소 분석기. 형태소와 품사 태깅이 주 기능이다. 내부적으로 여러 형태소 분석기(Hannanum, 꼬꼬마, 코모란 등)를 backend로 사용한다. 사용시 Java가 필요함. 형태소를 잘못 나누거나 품사 태깅을 잘못 할 수 있기 때문에 형태소 분석기의 결과를 100% 의존하는 것은 위험하다.
Afinn
공식 홈 페이지 : https://pypi.org/project/afinn/
영어 단어들의 긍정, 부정적인 정도를 -5 ~ +5 의 정수로 나타내는 감정 분석 라이브러리. 문장의 점수를 매길 때는 해당 문장 내의 모든 단어의 감정 분석 결과를 합하여 산출한다.
단점
- Afinn으로 점수화 할 수 있는 모든 단어를 찾는 find_all 함수가 모든 알파벳을 소문자로 바꾸기 때문에 대문자 이모티콘을 인식할 수 없다. (T_T : t_t)
- negation(not bad), 대문자 강조(COOOOL), sentiment intensity 정도를 조절하는 단어(very, kind of)를 인식할 수 없다.
- emoji 😄 를 인식할 수 없다.
- 따로 추가는 가능하지만 그것을 일일이 다 대조하긴 어렵다.
VaderSentiment
공식 홈 페이지 : https://pypi.org/project/vaderSentiment/
영어 단어들의 긍정, 부정적인 정도를 -1 ~ +1 의 정수로 나타내는 감정 분석 라이브러리. Afinn의 단점을 커버한다.
네트워크, 인터넷, 웹 등
Requests
공식 홈 페이지: http://docs.python-requests.org/en/master/
Python으로 손쉽게 http/https 통신을 할 수 있게 도와 주는 라이브러리. 사용하기 쉬움
BeautifulSoup
공식 홈 페이지: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
html 문서를 파싱하는 라이브러리. 매우 사용하기 쉬움. 내부적으로 Python 내장 라이브러리인 html.parser, 혹은 외부 라이브러리인 lxml이나 html5lib에 의존한다. 사용하기는 쉽지만 오버헤드가 커서 대량의 문서를 파싱하기에는 느리다. 내부적으로 lxml을 사용하도록 지정하는 것이 가장 빠르지만 직접 lxml을 쓰는 것 보다는 훨씬 느리다.
lxml
공식 홈 페이지: https://lxml.de/
html/xml 문서를 파싱하는 라이브러리로 속도가 매우 빠르다. lxml을 써도 느리다면 파싱을 통해 처리하면 안 된다. Regualr Expression이나 단순 스트링 매칭 같이 다른 방법을 찾아 보아야 한다.
기본적으로 xml을 파싱하는 라이브러리라서 html을 파싱하는 방법은 잘 정리가 되어 있지 않다. 홈페이지의 튜토리얼은 xml 문서를 해석하는 것이기 때문에 html 문서로 따라하면 파싱 오류가 발생한다. Xpath나 CSS 선택자를 이용해 파싱된 트리를 접근한다.
Flask
공식 홈 페이지: http://flask.pocoo.org/
간단하게 웹 서버를 만들기 편리한 라이브러리. Django보다 기능이 적어서 배우기 쉽다. 빠르게 시작하기 튜토리얼을 따라하면 쉽게 flask 사용 방법을 익힐 수 있다. HTML로 된 웹 사이트를 만들 수도 있고 JSON이나 XML을 반환하는 API 서버를 만들 수도 있다.
간단하게 웹 페이지를 예쁘게 꾸미고 싶다면 Bootstrap CSS 프레임워크를 사용하는 것이 좋다. 반응형 프레임워크라서 페이지 하나만 만들면 데스크톱/모바일에 모두 대응한다. 이 프레임워크를 이용하면 기본적인 웹 디자인, 버튼, 메뉴 등 기본적인 컴포넌트와 디자인을 제공한다. Customize를 하면 디자인도 바꿀 수 있다.
Scrapy
홈페이지: https://scrapy.org/
Python으로 웹 크롤링을 하기 위한 프레임워크.
시각화
seaborn
공식 홈 페이지: https://seaborn.pydata.org/
Matplotlib을 이용해 통계 시각화를 쉽고 보기 좋게 만들어 주는 라이브러리. 일반적인 막대 그래프, 히스토그램, 밀집도 그래프, heatmap 등을 지원한다.
기타
pip
공식 홈 페이지: https://pip.pypa.io/en/stable/
Python에서 라이브러리를 설치할 때 사용하는 프로그램이다. Python을 설치하면 기본적으로 pip도 설치된다. 혹시 pip이 설치가 안 되어 있다면 Pip 설치 방법을 참고하여 설치할 수 있다.
Anaconda
공식 홈 페이지: https://www.anaconda.com/download/
Python으로 수학/과학/데이터 분석 등을 할 때 필요한 모든 라이브러리를 모아 둔 Python distribution.
Six
공식 홈 페이지: https://pythonhosted.org/six/
Python2와 Python3 간의 차이점을 wrapping해주는 라이브러리. Python2/Python3인지 아닌지 알려주는 변수를 제공한다. Python 버전별로 미묘하게 다른 부분을 six 라이브러리를 통해 호출하도록 해 준다. 제공하는 기능이 많은 것은 아니지만 라이브러리가 가벼워서 Python2/3을 모두 지원할 때 많이 쓰이는 라이브러리 중 하나이다.
Python-Future
공식 홈 페이지: http://python-future.org
Python3으로 작성된 코드를 약간의 변경만으로 Python2에서도 구동할 수 있게 해 주는 라이브러리. Python3에서만 지원하는 기능을 쓴 것이 아니라면 간단한 라이브러리 import와 몇몇 함수 실행, 간단한 소스 코드 변경만으로도 Python3 코드가 Python2에서도 돌아간다. 물론 이 작업이 적은 것은 아니기 때문에 Python 2/3에서만 돌아가는 코드를 두 버전 모두에서 돌아갈 수 있는 도구도 제공한다.
이미 소스 코드가 방대해서 불가피한 경우를 제외하면 Six를 쓰는 것이 더 좋다. 나중에 Python2 지원을 끊고 Python3만 지원하게 소스 코드를 바꾸려면 python-future 라이브러리가 사용된 부분을 수동으로 전부 지워야 한다. 일부 문법이 Python3과 미묘하게 달라서 단순히 라이브러리 import만 지우면 동작하지 않을 수도 있다.
라이브러리 문서 중 Cheat Sheet: Writing Python 2-3 compatible code는 참고할 만 하다.
Cython
공식 홈 페이지: http://cython.org/
Python 코드 중 일부를 C 코드로 변환한 뒤, 컴파일해서 돌리는 라이브러리이다. 연산이 많은 코드라면 기존 Python 코드에 Type 지정 등 약간의 수정만으로 10배 이상의 성능 향상을 이끌어낼 수 있다. Python으로 코드를 만들었는데 속도가 너무 느리다면 선택할 만한 선택지이다.