지도학습 - 회귀 (기초)
회귀 분석이란?
데이터를 가장 잘 설명하는 모델을 찾아 입력값에 따른 미래 결괏값을 예측하는 알고리즘
단순 선형 회귀
데이터를 설명하는 모델을 직선 형태로 가정
단순 선형 회귀 모델 :
$$ Y = \beta_0 + \beta_1X $$
데이터를 잘 설명한다는 것은?
일반적으로 실제 값과 예측 값 차이의 제곱의 합을 지표로 사용한다. 이를 Loss 함수라고 한다.
Loss 함수 : $$ \frac{1}{N}\Sigma_i^N \left( y^{(i)} - (\beta_0+ \beta_1x^{(i)}) \right)^2 $$
\(\Rightarrow\) Loss 함수가 작을수록 좋은 모델이다.
\(\beta_0\) (y절편), \(\beta_1\) (기울기) 값을 조절하여 Loss 함수의 크기를 작게 한다.
완벽한 예측은 불가능하기에 최대한 잘 근사해야 한다.
Loss 함수의 크기를 작게 하는 \(\beta_0\) (y절편)와 \(\beta_1\) (기울기)를 찾는 방법
1) Gradient descent (경사 하강법)
2) Normal equation (Least Square)
3) Brute force search
4) ...
경사 하강법
Loss 함수 값이 가장 작게 하는 절편, 기울기를 계산 한번에 구하는 것이 아니라
초기값에서 점진적으로 구하는 방식
\(\beta_0\), \(\beta_1\) 값을 Loss 함수 값이 작아지게 계속 업데이트
- \(\beta_0\), \(\beta_1\) 값을 랜덤하게 초기화
- 현재 \(\beta_0\), \(\beta_1\) 값으로 Loss 값 계산
- 현재 \(\beta_0\), \(\beta_1\) 값을 어떻게 변화해야 Loss 값을 줄일 수 있는지 알 수 있는 Gradient 값 계산
- Gradient 값을 활용해여 \(\beta_0\), \(\beta_1\) 값 업데이트
- Loss 값의 차이가 거의 없어질 때까지 2~4번 과정을 반복 (Loss 값과 차이가 줄어들면 Gradient 값도 작아짐)
단순 선형 회귀 분석하기 - 데이터 전처리
기계학습 라이브러리 scikit-learn을 사용하면 Loss 함수 값을 최소로 만드는 \(\beta_0\), \(\beta_1\)을 쉽게 구할 수 있다.
주어진 데이터를 sklearn의 선형 모델에 적용하기 위해서는 전처리가 필요하다.
skelarn의 LinearRegression 입력 값 형태
Pandas의 DataFrame 형태의 feature (X) 데이터와 Series 형태의 label (Y) 데이터를 입력받는다.
X, Y 샘플의 개수는 같아야 한다.
import matplotlib as mpl
mpl.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
X = [8.70153760, 3.90825773, 1.89362433, 3.28730045, 7.39333004,
2.98984649, 2.25757240, 9.84450732, 9.94589513, 5.48321616]
Y = [5.64413093, 3.75876583, 3.87233310, 4.40990425, 6.43845020,
4.02827829, 2.26105955, 7.15768995, 6.29097441, 5.19692852]
train_X = pd.DataFrame(X, columns = ['X']
train_Y = pd.Series(Y)
단순 선형 회귀 분석하기 - 학습하기
LinearRegression을 사용하기 위해서는 해당 모델 객체를 불러와 초기화해야한다.
lrmodel = LinearRegression()
아래 코드와 같이 fit 함수에 학습에 필요한 데이터를 입력하여 학습을 수행한다.
lrmodel.fit(train_X, train_Y)
LinearRegression의 \(\beta_0\), \(\beta_1\) 값은 아래와 같은 코드를 사용하여 구할 수 있다.
beta_0 = lrmodel.intercept_
beta_1 = lrmodel.coef_[0]
단순 선형 회귀 분석하기 - 예측하기
predict 함수는 DataFrame 또는 numpy array인 X 데이터에 대한 예측값을 리스트로 출력한다.
pred_X = lrmodel.predict(train_X)
다중 선형 회귀
입력값 X가 여러 개 (2개 이상)인 경우 활용할 수 있는 회귀 알고리즘
각 개별 \(X_i\)에 해당하는 최적의 \(\beta_i\)를 찾아야 함
다중 선형 회귀 모델 :
$$ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \beta_3X_3 + ... + \beta_MX_M $$
다중 선형 회귀 모델의 Loss 함수
단순 선형 회귀와 마찬가지로 Loss 함수는 입력값과 실제값 차이의 제곱의 합으로 정의
\(\Rightarrow\) 마찬가지로 \(\beta_0, \beta_1, \beta_2, ... ,\beta_M\) 값을 조절하여 Loss 함수의 크기를 작게 한다.
Loss 함수 :
$$ \frac{1}{N} \left( y^{(i)} - (\beta_0 + \beta_1x_1^{(i)} + \beta_2x_2^{(i)} + ... + \beta_Mx_M^{(i)}) \right)^2 $$
다중 선형 회귀 모델의 경사 하강법
\(\beta_0\), \(\beta_1\), \(\beta_2\), ..., \(\beta_M\) 값을 Loss 함수 값이 작아지게 계속 업데이트하는 방법
- \(\beta_0\), \(\beta_1\), \(\beta_2\), ..., \(\beta_M\) 값을 랜덤하게 초기화
- 현재 \(\beta_0\), \(\beta_1\), \(\beta_2\), ..., \(\beta_M\) 값으로 Loss 값 계산
- 현재 \(\beta_0\), \(\beta_1\), \(\beta_2\), ..., \(\beta_M\) 값을 어떻게 변화해야 Loss 값을 줄일 수 있는지 알 수 있는 Gradient 값 계산
- Gradient 값을 활용해여 \(\beta_0\), \(\beta_1\), \(\beta_2\), ..., \(\beta_M\) 값 업데이트
- Loss 값의 차이가 거의 없어질 때까지 2~4번 과정을 반복 (Loss 값과 차이가 줄어들면 Gradient 값도 작아짐)
회귀 알고리즘 평가
어떤 모델이 좋은 모델인지 어떻게 평가할 수 있을까?
목표를 얼마나 잘 달성했는지 정도를 평가
실제 값과 모델이 예측하는 값의 차이에 기반한 평가 방법 사용
ex) RSS, MSE, MAE, MAPE, \(R^2\)
RSS - 단순오차
1. 실제 값과 예측 값의 단순 오차 제곱 합
2. 값이 작을수록 모델의 성능이 높다.
3. 잔차 데이터에 대한 실제 값과 예측하는 값의 오차 제곱의 총합
$$ RSS = \Sigma_i^N \left( y^{(i)} - (\beta_0 + \beta_1x^{(i)}) \right) ^2 $$
MSE, MAE - 절대적인 크기에 의존한 지표
MSE (Mean Squared Error)
1. 평균 제곱 오차
2. RSS에서 데이터 수 만큼 나눈 값
3. 작을수록 모델의 성능이 높다.
$$ MSE = \frac{1}{N}\Sigma_i^N \left( y^{(i)} - (\beta_0 + \beta_1x^{(i)}) \right) ^2 $$
MAE (Mean Absolute Error)
1. 평균 절대값 오차
2. 실제 값과 예측 값의 오차의 절대값의 평균
3. 작을수록 모델의 성능이 높다고 평가할 수 있음
$$ MAE = \frac{1}{N}\Sigma_i^N\left\vert y^{(i)} - (\beta_0 + \beta_1x^{(i)}) \right\vert $$
\(R^2\) (결정 계수)
1. 회귀 모델의 설명력을 포현하는 지표
2. 1에 가까울수록 높은 성능의 모델이라고 해석할 수 있음
$$ R^2 = 1 - \frac{RSS}{TSS} $$
TSS는 데이터 평균 값(\(\bar{y}\))과 실제 값(\(y^{(i)}\)) 차이의 제곱
$$ TSS = \Sigma_i^N(y^{(i)} - \bar{y})^2 $$
$$ \bar{y} = \frac{1}{N}\Sigma_i^Ny^{(i)} $$