해당 카테고리에 작성되는 글은 Introduction to Machine Learning with Python(파이썬 라이브러리를 활용한 머신 러닝)을 기반으로 작성되었습니다.
머신 러닝은 자료(data)에서 지식(knowledge)을 추출하는 것을 다룹니다. 머신 러닝은 통계학, 인공지능, 컴퓨터 과학이 교차하는 연구 분야이며 예측 분석학(predictive analytics) 또는 통계적 학습(statistical learning)이라고도 불립니다. 어떤 영화를 볼지, 어떤 음식을 주문할지, 또 어떤 물건을 사야할 지 추천해주는 것 등 많은 현대의 웹사이트와 기기는 그 핵심에 머신 러닝 알고리즘을 가지고 있습니다.
이러한 상업적 적용 이외에, 머신 러닝은 데이터 중심(data-driven) 연구에도 어마어마한 영향을 미치고 있습니다. 실제로 항성에 대한 이해, 멀리 떨어진 행성을 찾기, 새로운 입자의 발견, DNA 시퀀스 분석 및 개인 맞춤형 암 치료에 이르기까지, 머신 러닝은 과학/기술 분야에서도 그 다양한 응용을 찾아볼 수 있습니다.
왜 머신 러닝이어야 하는가?
기존의 지능형 어플리케이션은 if와 else 구문을 이용하여 데이터 처리 및 사용자 인풋을 조정해왔습니다. 예를 들어 스팸 메일을 자동으로 걸러 스팸 메일함으로 보내버리는 프로그램을 생각해봅시다. 메일을 받을 때 ‘스펨 메일’로 의심할 만한 단어, 또는 이전에 스팸 메일을 보낸 적이 있던 보낸 사람임을 메일 내에서 검색하여 해당되면 스팸 필터에 걸러지도록 하는 프로세스를 거치면 됩니다. 이렇듯 모델링하고자 하는 프로세스에 대한 인간의 이해도가 높다면 전통적인 if & else 덩어리의 소스 코드로도 충분히 지능형 어플리케이션을 만들 수 있을 겁니다.
그러나 모델링하고자 하는 프로세스가 너무 복잡하여 인간의 이해를 뛰어 넘는다면?
사진 속에서 얼굴 인식을 하는 프로그램을 생각해봅시다. 이는 if & else의 코드로 불가능한데, 그 이유는 인간이 얼굴을 인식하는 방식과 컴퓨터가 픽셀을 인식하는 방식이 다르기 때문입니다. 즉, 디지털 이미지에서 ‘얼굴’을 구성하는게 무엇인지 설명하는 일련의 규칙 모음을 인간은 만들어낼 수 없습니다. 하지만 머신 러닝을 이용한다면 ‘얼굴’을 식별하는데 필요한 특징들을 결정하는 알고리즘을 얼굴 이미지를 갖고 있는 다량의 데이터와 단순한 프로그래밍이면 충분히 만들 수 있습니다.
머신 러닝이 풀 수 있는 문제들
머신 러닝 알고리즘의 가장 성공적인 응용은 알려진 예를 일반화하여 의사 결정 프로세스를 자동화 하는 것입니다. 지도 학습(supervised learning)이라 알려진 환경에서 사용자는 입력(input)과 그에 따른 바람직한 출력(output) 한 쌍을 알고리즘에 제공합니다. 알고리즘은 주어진 입력에서 사용자가 원하는 출력을 만들어내기 위한 방법을 찾습니다. 이 과정을 거치면 알고리즘은 인간의 도움 없이 이전에 한 번도 학습/경험하지 못했던 입력으로부터 출력을 만들어낼 수 있습니다. 이렇게 입/출력 쌍으로부터 학습하는 알고리즘을 지도 학습(supervised learning) 알고리즘이라 부릅니다. 지도 학습의 예로는 다음과 같은 것들이 있습니다.
- 편지 봉투에 손 글씨로 쓰여진 우편 번호 식별
- 진단 이미지로부터 종양이 양성인지 악성인지 식별
- 신용 카드 거래에서 사기 행위인지 아닌지 식별
지도 학습이 있다면 비지도 학습(unsupervised learning) 알고리즘도 있습니다. 비지도 학습에서는 입력(input) 데이터만이 알려져 있으며 출력(output)에 대한 정보는 알고리즘에 제공하지 않습니다. 이 방법에 대한 많은 성공적인 응용이 존재하지만 이에 대한 이해나 평가는 아직 어렵다는 측면이 있습니다. 비지도 학습의 예로는 다음과 같은 것들이 있습니다.
- 블로그 게시물로부터 해당 게시판의 주제 찾기
대량의 텍스트 데이터를 요약하거나 일관된 주제가 있는지, 있다면 무엇인지 찾고 싶을 때 이용할 수 있습니다. 알고리즘 사용자가 요약의 결과나 주제를 모르기 때문에 적절한 출력을 알고리즘에 제공할 수 없습니다.
- 유사 선호도를 갖는 그룹으로 고객들 나누기
소비 기록으로부터 비슷한 소비 경향을 갖는 소비자들을 그룹으로 나눌 때 이용할 수 있습니다. 어떠한 그룹이 있을지, 얼마나 많은 그룹이 있을지 등을 모르기 때문에 적절한 출력을 알고리즘에 제공할 수 없습니다.
- 웹 사이트에 대한 비정상적인 접근 패턴 탐지
정상적이지 않은 접근은 서로 매우 다를 수 있으며, 이런 비정상적인 행위의 모든 순간들을 기록할 수는 없습니다. 예를 들어 트래픽 조회만으로는 해당 접속이 정상인지 비정상적인지 모르므로 비지도 학습 알고리즘에 해당됩니다.
지도 학습/비지도 학습과 같은 학습의 종류에 무관하게, 컴퓨터가 이해할 수 있는 입력 데이터형을 갖도록 데이터를 처리하는 과정이 중요합니다.
문제 상황과 보유한 데이터의 이해
머신 러닝에서 가장 중요한 부분은 자신이 다루고 있는 데이터와 이를 해결하고자 하는 일에 어떻게 관련지을지를 이해하는 것이다. 임의로 머신 러닝 알고리즘을 고르고 데이터를 입력시켜버리는 방식은 효율적이지 않습니다. 모델을 만들기 전데 자신의 데이터셋에서 무엇을 할 지를 이해하는 것이 필요합니다. 각 알고리즘은 데이터의 종류 및 가장 잘 해결할 수 있는 문제의 관점에서 모두 다릅니다.
왜 파이선인가?
파이썬은 많은 데이터 사이언스 분야에서 국제 공용어가 되어가고 있습니다. 파이썬은 사용이 쉽다는 범용 프로그래밍 언어로서의 강력함을 갖고 있으며 데이터 로딩, 시각화(visualization), 통계(statistics), 자연어 처리(natural language processing), 이미지 처리(image processing) 등 많은 분야에 적합한 라이브러리를 가지고 있습니다. 파이썬을 이용하는 것의 또 다른 장점은 코드와 직접 상호작용할 수 있다는 것입니다. 머신 러닝과 데이터 분석은 근본적으로 반복적인 프로세스로 빠른 반복과 쉬운 상호작용이 가능한 도구로서 파이썬이 매우 적합하다는 뜻입니다.
Scikit-learn
scikit-learn은 오픈 소스형 프로젝트로 사용 및 배포가 무료이며 누구든 소스 코드를 얻어 사용시 어떤 일이 일어나는지를 확인할 수 있습니다. scikit-learn 프로젝트는 계속해서 개발되고 개선되고 있습니다. 수많은 최신 머신 러닝 알고리즘을 포함하고 있으며 각 알고리즘에 대한 이해를 돕는 문서도 포함하고 있습니다. scikit-learn은 매우 유명한 툴로 머신 러닝에 가장 뛰어난 파이썬 라이브러리입니다. 머신 러닝 학습에 있어서 scikit-learn 사용자 가이드와 API documentation을 읽어보는 것을 추천드립니다.
필수 라이브러리 & 툴
scikit-learn이 무엇이고 이를 어떻게 사용할 지 이해하는 것도 중요하지만 머신 러닝 학습 경험을 증대시켜 줄 몇 가지 라이브러리들이 있습니다. scikit-learn은 NumPy와 SciPy라는 파이썬 scientific library 위에서 만들어졌습니다. NumPy와 SciPy 이외에 pandas와 matplotlib도 사용합니다.
NumPy
NumPy는 파이썬에서 scientific programming을 위한 기본 패키지입니다. 다차원 배열, 선형 방정식 연산 및 푸리에 변환 같은 고차원 함수 등 다양한 기능을 포함하고 있습니다.
scikit-learn에서 NumPy array는 기본적인 자료 구조입니다. scikit-learn은 NumPy array의 형태로 데이터를 받아들입니다. 사용하는 데이터는 NumPy array의 형태로 변환되어야 합니다. NumPy의 핵심 기능은 ndarray 클래스입니다. 간단한 샘플 코드는 다음과 같습니다.
import numpy as np x = np.array([[1, 2, 3], [4, 5, 6]]) print("x:\n{}".format(x), type(x)) |
결과)
x: [[1 2 3] [4 5 6]] <class 'numpy.ndarray'> |
앞으로 Numpy ndarray 클래스의 오브젝트를 “Numpy array” 또는 “array”라 하겠습니다.
SciPy
SciPy는 Python에서 scientific computing을 위한 기능들을 포함한 라이브러리입니다. 고급 선형 대수 루틴, 수학적 함수 최적화, 신호 처리, 통계 분포 등의 기능들을 제공합니다. scikit-learn은 알고리즘을 구성하는 데 있어 SciPy의 함수에서 시작을 합니다. SciPy의 가장 중요한 부분은 scipy.sparse로 sparse matrice라는 scikit-learn에서 사용될 또 다른 자료 구조를 제공합니다. Sparse matrice는 2D array를 저장하는데 사용됩니다. 샘플 코드는 다음과 같습니다.
import numpy as np from scipy import sparse # 대각 성분이 1이고 나머지 성분이 0인 2D NumPy array 생성 eye = np.eye(4) print("Numpy array:\n{}".format(eye), type(eye)) # NumPy array를 SciPy sparse matrix로 변환 (CSR format) # 0이 아닌 값만 저장된다. sparse_matrix = sparse.csr_matrix(eye) print("\nSciPy sparse CSR matrix:\n{}".format(sparse_matrix), type(sparse_matrix)) |
결과)
Numpy array: [[1. 0. 0. 0.] [0. 1. 0. 0.] [0. 0. 1. 0.] [0. 0. 0. 1.]] <class 'numpy.ndarray'> SciPy sparse CSR matrix: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 <scipy.sparse.csr.csr_matrix'> |
다른 방식으로 동일한 sparse matrix를 형성할 수 있습니다. COO format을 이용하면 다음과 같습니다.
import numpy as np from scipy import sparse data = np.ones(4) row_indices = np.arange(4) col_indices = np.arange(4) eye_coo = sparse.coo_matrix((data, (row_indices, col_indices))) print("COO representation:\n{}".format(eye_coo), type(eye_coo)) |
결과)
COO representation: (0, 0) 1.0 (1, 1) 1.0 (2, 2) 1.0 (3, 3) 1.0 <scipy.sparse.coo.coo_matrix'> |
matplotlib
matplotlib은 파이썬의 scientific plotting, 즉 그래프 그리기 라이브러리입니다. 선형 차트, 히스토 그램, 분산 그래프 등 시각화를 가능하게 하는 기능을 제공합니다. 자신의 데이터 및 분석을 서로 다른 측면에서 시각화하여 관찰하는 것은 문제 상황을 통찰하는데 도움을 줍니다. 샘플 코드를 봅시다.
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10, 100) y = np.sin(x) plt.plot(x, y, marker='x') plt.show() |
결과)
pandas
pandas는 데이터를 다루고 분석하기 위한 파이썬 라이브러리입니다. DataFrame이라 불리는 자료 구조를 기반으로 합니다. 일종의 Excel spreadsheet과 비슷합니다. pandas는 이러한 테이블형 자료를 가지고 수정하거나 연산하는 방법들을 제공합니다. NumPy와는 달리, pandas는 각 열(column)이 다른 타입의 데이터를 가질 수 있습니다. pandas의 또 다른 강점은 SQL, Excel file, CSV(comma-separated values) file과 같은 넓은 범위의 파일 포맷 및 에디터 베이스로부터 데이터를 읽거나 반대로 저장할 수 있는 기능성입니다.
import pandas as pd data = {'Name': ["John", "Anna", "Peter", "Linda"], 'Location': ["New York", "Paris", "Berlin", "London"], 'Age': [24, 13, 53, 33]} data_pandas = pd.DataFrame(data) print(data_pandas) print(type(data_pandas)) print(data_pandas[data_pandas.Age > 30]) |
결과)
Name Location Age 0 John New York 24 1 Anna Paris 13 2 Peter Berlin 53 3 Linda London 33 <pandas.core.frame.DataFrame'> Name Location Age 2 Peter Berlin 53 3 Linda London 33 |
mglearn
해당 교재의 학습을 위한 라이브러리입니다. 필요한 데이터 셋을 가져오거나 할 때 사용됩니다.