카테고리 보관물: 사이킷런 정주행

[사이킷런 정주행] 1. LinearRegression

선형 회귀

회귀는 연속적인 타깃을 예측하는 알고리즘입니다. 그 중에 선형 회귀Linear Regression가 가장 기본입니다. 선형 회귀는 훈련 데이터에 가장 잘 들어 맞는 선형 방정식

\hat{y}=w_1 \times x_1+w_1 \times x_1+\cdots+w_n \times x_n+b

를 찾는 문제입니다. 여기에서 n은 훈련 데이터에 있는 특성의 수입니다.

편의상 bw_0으로 바꾸어 하나의 벡터 \bold{w}로 나타내겠습니다. \bold{w}에 포함된 w_0에 대응하기 위해 훈련 데이터에 x_0=1을 추가하여 벡터 \bold{x}를 정의합니다. 이제 이 선형 방정식은

\hat{y} =\begin{pmatrix} w_0 & w_1 & \cdots & w_n \end{pmatrix}\cdot\begin{pmatrix} x_0 \\ x_1 \\ \vdots \\ x_n \end{pmatrix} =\bold{w}^T\bold{x}

와 같이 간단히 쓸 수 있습니다. 훈련 샘플이 하나가 아니라 여러개이므로 벡터 \bold{x}를 다음과 같이 행렬로 확장할 수 있습니다. 벡터는 굵은 소문자, 행렬은 굵은 대문자를 사용합니다. 여기에서 m은 훈련 샘플의 수입니다.

\bold{\hat{y}} =\begin{pmatrix}   x_0^1 & x_1^1 & \cdots & x_n^1 \\   x_0^2 & x_1^2 & \cdots & x_n^2 \\   \vdots \\   x_0^m & x_1^m & \cdots & x_n^m \end{pmatrix} \cdot \begin{pmatrix} w_0 \\ w_1 \\ \cdots \\ w_n \end{pmatrix} =\begin{pmatrix}   \bold{x}^1 \\   \bold{x}^2 \\   \vdots \\   \bold{x}^m \end{pmatrix} \cdot \begin{pmatrix} w_0 \\ w_1 \\ \cdots \\ w_n \end{pmatrix} =\bold{X} \bold{w}

얼마나 잘 들어 맞는지를 측정 방법으로는 평균 제곱 오차Mean Square Error, MSE를 사용합니다.

\text{MSE} =\frac{1}{m} (\bold{y}-\bold{\hat{y}})^2 =\frac{1}{m} (\bold{y}-\bold{X}\bold{w})^2

이런 측정 함수를 비용 함수cost function이라고 부릅니다. 선형 회귀의 비용 함수인 평균 제곱 오차를 최소화하는 선형 방정식의 \bold{w}를 찾아야 합니다. 해석적인 방법으로 해를 구할 수 있습니다. 비용 함수를 미분하여 도함수가 0이 되는 점을 찾습니다. 먼저 MSE 비용 함수를 간단한 식으로 표현하겠습니다.

\text{MSE} =\frac{1}{m} (\bold{y}-\bold{X}\bold{w})^2 =\frac{1}{m} (\bold{y}-\bold{X}\bold{w})^T(\bold{y}-\bold{X}\bold{w}) \\ \\ =\frac{1}{m} (\bold{y}^T\bold{y}-\bold{y}^T\bold{X}\bold{w}-\bold{w}^T\bold{X}^T\bold{y}+\bold{w}^T\bold{X}^T\bold{X}\bold{w}) =\frac{1}{m} (\bold{y}^T\bold{y}-2\bold{w}^T\bold{X}^T\bold{y}+\bold{w}^T\bold{X}^T\bold{X}\bold{w})

\frac{1}{m}은 미분 결과에 영향을 미치지 않으므로 제외하고 \bold{w}에 대해 미분합니다.

\frac{\partial}{\partial \bold{w}}\text{MSE} =-2\bold{X}^T\bold{y}+2\bold{X}^T\bold{X}\bold{w}

이 도함수가 0이 되는 \bold{w}는 다음과 같습니다. 이 식을 정규 방정식Normal Equation이라고 합니다.

\bold{w}=(\bold{X}^T\bold{X})^{-1}\bold{X}^T\bold{y}

샘플 데이터

사이킷런에 포함된 샘플 데이터 중 캘리포니아 주택 가격 데이터셋을 사용하겠습니다.

import sklearn
import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_california_housing

fetch_california_housing()함수를 호출하여 사이킷런의 Bunch 클래스 객체를 얻습니다. 캘리포니아 주택가격 데이터셋은 전체 샘플 개수가 20,640개이고 8개의 특성을 가집니다.

housing = fetch_california_housing()
print(housing.data.shape, housing.target.shape)
(20640, 8) (20640,)

train_test_split() 함수를 사용해서 75%는 훈련 세트로 25%는 테스트 세트로 분리합니다. 편의상 그래프로 나타내기 편하도록 하나의 특성만 사용하겠습니다. 사이킷런의 모델은 훈련 데이터가 2차원 배열일 것으로 예상합니다. 따라서 housing.data 에서 하나의 특성만 선택하더라도 2차원 배열이 되도록 넘파이 슬라이싱을 사용했습니다. 여기서는 첫 번째 특성만 사용합니다.

X_train, X_test, y_train, y_test = train_test_split(housing.data[:, 0:1], 
                                                    housing.target, random_state=42)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
(15480, 1) (5160, 1) (15480,) (5160,)
계속 읽기