머신러닝 맛보기 1편

참고: 오렐리앙 제롱의 <핸즈온 머신러닝(2판)> 4장 1절의 소스코드 일부를 사용합니다.

주요 내용

머신러닝은 특정 값을 예측하는 모델(일종의 함수)을 구현하는 컴퓨터 프로그래밍 분야이며 주어진 문제에 대한 적절한 모델을 찾는 일이 핵심 과제이다. 머신러닝은 데이터 분석의 주요 활용분야가 되었으며 지금까지 살펴 본 파이썬 데이터 분석의 다양한 개념과 도구들이 유용하게 활용된다. 여기서는 선형회귀 모델의 개념과 활용을 간단한 예제를 이용하여 머신러닝의 기본 아이디어를 전달한다.

기본 설정

머신러닝 모델 훈련

머신러닝 모델의 훈련 과정에 필요한 요소는 모델훈련 데이터셋이다. 그리고 모델과 훈련 데이터셋에 따라 훈련 방식이 결정되며, 머신러닝과 딥러닝 분야에서 다양한 훈련 기법을 연구한다. 또한 어떤 모델과 어떤 훈련 데이터셋을 사용하느냐에 따라 모델 훈련의 결과가 매우 달라질 수 있다. 여기서는 간단한 선형회귀 모델의 훈련과정을 구체적으로 살펴보면서 머신러닝 모델 훈련을 소개한다.

선형회귀 모델 훈련

먼저 머신러닝 모델 훈련에 사용되는 데이터 훈련 세트는 $m \times n$ 모양의 2차원 어레이로 표현됨을 기억해야 한다.

$$ \mathbf{X}_{\textit{train}} = \begin{bmatrix} \mathbf{x}_{1}^{(1)} & \mathbf{x}_{2}^{(1)} & \cdots & \mathbf{x}_{n}^{(1)}\\ \mathbf{x}_{1}^{(2)} & \mathbf{x}_{2}^{(2)} & \cdots & \mathbf{x}_{n}^{(2)}\\ & \vdots & \\ \mathbf{x}_{1}^{(m)} & \mathbf{x}_{2}^{(m)} & \cdots & \mathbf{x}_{n}^{(m)} \end{bmatrix} $$

아래 코드는 선형회귀 학습과정을 설명하기 위해 사용되는 하나의 특성을 사용하는 간단한 훈련 데이터를 생성한다.

참고: 정규분포를 따르는 부동소수점 100개를 무작위로 생성하여 잡음으로 사용하였다.

특성 x1과 레이블 y의 관계를 그리면 다음과 같다. 기본적으로 y = 4 + 3 * x 의 선형관계를 갖지만 잡음으로 인해 데이터가 퍼져 있다.

정규 방정식

이제 $x_1$과 $y$가 어떻게 생성되었는지 모른다는 가정 하에 두 변수 사이의 관계를 찾는 게 목표이다. 즉, 아래 식을 만족시키는 최적의 $\theta_0$, $\theta_1$을 찾아야 한다.

$$ \begin{align*} y^{(1)} &= \theta_0 + \theta_1 \cdot x_1^{(1)} \\ y^{(2)} &= \theta_0 + \theta_1 \cdot x_1^{(2)} \\ &= \cdots \\ y^{(100)} &= \theta_0 + \theta_1 \cdot x_1^{(100)} \end{align*} $$

이를 행렬식으로 표현하면 다음과 같다.

$$ \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(100)} \end{bmatrix} = \begin{bmatrix} 1 & \mathbf{x}_{1}^{(1)} \\ 1 & \mathbf{x}_{1}^{(2)} \\ & \vdots \\ 1 & \mathbf{x}_{1}^{(m)} \end{bmatrix} \cdot \begin{bmatrix} \theta_0 \\ \theta_1 \end{bmatrix} $$

일반적으로는 훈련 데이터의 각 샘플이 $n \ge 1$ 개의 특성을 가지며, 따라서 아래 식을 만족하는 $\theta_0, \theta_1, \dots, \theta_n$을 찾아야 한다.

$$ \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(100)} \end{bmatrix} = \begin{bmatrix} 1 & \mathbf{x}_{1}^{(1)} & \mathbf{x}_{2}^{(1)} & \cdots & \mathbf{x}_{n}^{(1)}\\ 1 & \mathbf{x}_{1}^{(2)} & \mathbf{x}_{2}^{(2)} & \cdots & \mathbf{x}_{n}^{(2)}\\ & & \vdots & \\ 1 & \mathbf{x}_{1}^{(m)} & \mathbf{x}_{2}^{(m)} & \cdots & \mathbf{x}_{n}^{(m)} \end{bmatrix} \cdot \begin{bmatrix} \theta_0 \\ \theta_1\\ \theta_2 \\ \vdots \\ \theta_n \\ \end{bmatrix} $$

이 과정을 보다 단순하게 표현하면 다음과 같다.

길이가 $m$인 1차원 어레이 $\mathbf{y}$와 $(m, n+1)$ 모양의 2차원 어레이 $\mathbf{X}$가 주어졌을 때, 아래 식을 만족시키면서 길이가 $n+1$인 1차원 어레이 $\hat{\boldsymbol{\theta}}$를 구해야 한다.

$$ \mathbf{y} = \mathbf{X} \,\hat{\boldsymbol{\theta}} $$

만약에 $(\mathbf{X}^T \mathbf{X})$의 역행렬 $(\mathbf{X}^T \mathbf{X})^{-1}$이 존재하고 실제로 일정 시간 내에 계산이 가능하다면 최적의 파라미터 조합 $\boldsymbol{\hat\theta}$을 아래 정규 방정식으로 직접 구할 수 있다.

$$ \hat{\boldsymbol{\theta}} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y} $$

정규 방정식 활용

아래 코드는 위 정규 방정식을 이용하여 위에서 생성한 100개의 훈련 샘플이 포함된 훈련 세트에 대한 최적의 $\theta_0, \theta_1$을 계산한다.

주의사항:

이제 정규 방정식을 활용할 수 있다.

계산된 $\boldsymbol{\hat\theta} = [\theta_0, \theta_1]$ 은 다음과 같다.

사이킷런의 LinearRegression 모델

사이킷런(scikit-learn) 라이브러리는 머신러닝에서 사용되는 다양한 모델의 기본적인 틀(basic models)들을 제공한다. 선형회귀의 경우 LinearRegression 클래스의 객체를 생성하여 훈련시키면 최적의 절편과 기울기를 계산해준다. 모델을 지정하고 훈련시키는 과정은 다음과 같다.

먼저 선형회귀 모델의 객체를 생성한다.

사이킷런의 모델은 1 벡터(1로만 이루어진 벡터)를 추가하는 과정을 알아서 처리한다. 다만, 입력 데이터와 타깃 데이터 모두 2차원 어레이로 지정해야 한다.

이제 fit() 메서드를 호출하여 모델을 훈련시킨다.

훈련으로 학습된 모델이 알아된 최적의 $\theta_0, \theta_1$이 앞서 정규 방정식을 이용한 결과와 동일하다.

학습된 모델

훈련된 예측 모델은 $\theta_0$ 을 절편으로, $\theta_1$ 을 기울기로 하는 직선에 해당한다. 예측 모델을 나타내는 1차 함수의 그래프를 그리기 위해 먼저 직선 상에 위치한 두 점을 지정한다.

두 점에 대한 예측값을 계산한다.

이제 훈련 세트의 산점도와 앞서 구한 두 점을 잇는 직선, 즉 예측 모델의 그래프를 그리면 다음과 같다.

무어-펜로즈(Moore-Penrose) 역행렬

앞서 소개한 정규 방정식은 $(\mathbf{X}^T \mathbf{X})$의 역행렬 $(\mathbf{X}^T \mathbf{X})^{-1}$이 존재할 때만 사용할 수 있다. 하지만 그렇지 않은 경우 행렬의 특잇값 분해(SVD)를 사용할 때 얻어지는 $\mathbf{X}$의 무어-펜로즈 역행렬 $\mathbf{X}^+$을 이용하여 $\boldsymbol{\hat\theta}$의 근사값을 계산할 수 있다.

$$ \hat{\boldsymbol{\theta}} = \mathbf{X}^+ \mathbf{y} $$

사이킷런의 LinearRegression 모델이 바로 이 무어-펜로즈 역행렬을 이용한다.

참고: 무어-펜로즈 역행렬을 유사역행열이라고도 부른다.

무어-펜로즈 역행렬 계산의 한계

앞선 언급한 무어-펜로즈 역행렬을 구하는 알고리즘의 계산 복잡도는 $O(n^2)$이다. 즉, 역행렬 계산 시간이 특성 수의 제곱에 비례한다.

예를 들어, 1만개의 행을 갖는 단위행렬의 무어-펜로즈 역행렬을 계산하는 데에 몇 분 정도 걸린다. 만약에 10만개의 행을 갖는 단위행렬을 사용하면 그의 100배인 몇 시간이 걸릴 것이다.

경고: 아래 코드는 컴퓨터 사양에 따라 몇 분 이상 걸릴 수 있다.

따라서 많은 수의 특성을 사용하는 데이터에 대해서는 사이킷런의 LinearRegrssion 모델은 현실적으로 사용될 수 없다. 이에 대한 대안으로 경사 하강법을 적용해야 하며, 경사하강법을 적용하는 다양한 모델을 구현하는 것이 머신러닝과 딥러닝의 주요 주제이다.