Linear / Polynomial Regression을 Python을 이용하여 구현해 봅니다.
x = [2, 3, 6, 7, 8, 10, 14, 15, 16, 17]
y = [2, 4, 4, 9, 10, 6, 10, 13, 18, 14]
위와 같은 2차원 데이터가 있다면 x 값이 7일 때, y 값은 9인 것을 알 수 있다.
만약 x가 13일 때, y 값이 무엇일지 예측하는 방법으로 Regression을 사용할 수 있다.
아이디어 (SLE)
자세한 수학적 설명보다는 전체적인 흐름을 중심으로 설명합니다.
Linear
Linear Regression : 선형 회귀
선형 회귀는 주어진 데이터들이 직선 형태의 패턴을 가지고 있을 것이라고 가정한다. 그리고 1차 함수 중 데이터와의 거리(에러)가 가장 가까운(작은) 함수식을 찾는 것을 목표로 한다. 이 때 거리(에러)는 (실제값 - 예측값)을 제곱한 값으로 Square Loss Error (SLE)를 사용한다. SLE를 최소화하는 문제는 SLE의 미분값이 0이 되는 경우이므로 간단하게 아래와 같이 정리할 수 있다.
모든 w에 대해 미분한 후 해당 내용을 정리하면 다음과 같다.
위와 같이 도출된 w 값을 통해 f(x)를 구해낼 수 있다.
Polynomial
위에서 설명한 Regression문제를 조금 더 일반화하면 다음과 같이 정리할 수 있다.
이 때 h(x)는 사용자가 임의로 설정하는 식이 된다. 예를 들어,
다음 문제를 풀면 3차 함수식을 구할 수 있다.
이외에도 sin 함수, 정규분포 등 문제에 따라 다양한 h(x)를 사용할 수 있다.
평가
다양한 평가 척도 중 아래 소개될 내용은 MSE를 활용한다. MSE는 Mean Square Error로 위에서 구한 SLE의 평균을 구한다. MSE가 낮을수록 학습한 데이터에 대하여 더욱 정확하게 예측한다. 다만, 학습한 데이터를 잘 예측한다고 해서 새로운 데이터를 반드시 잘 예측하는 것은 아니다.(over-fitting) 독립적인 학습 데이터와 테스트 데이터를 활용해 Cross Validation(CV)을 할 수 있다.
위처럼 k개의 subet으로 분리해 계산하는 방식을 k-fold Cross Validation이라고 하며, k가 데이터의 개수가 될 때, (모든 데이터를 개별적으로 테스트 데이터로 활용할 때) Leave-one-out Cross Validation (LOOCV)라고 한다.
MLE
Maximum Likehood Estimation
함수식 f(x)를 가정하고, 예측 값 y는 정규분표에 따라 분포할 것이라고 가정한다. 따라서 y값이 존재할 확률을 최대화하는 f(x)를 구하는 방법이 MLE solution이다.
위 문제를 풀어내면 결국 MSE를 최소화하는 문제와 같은 계산식을 가진다. 따라서 MLE와 SLE solution은 같은 방법으로 풀어낼 수 있다.
실행
import numpy as np
from sklearn.linear_model import LinearRegression
# Training set
x = np.array([2, 3, 6, 7, 8, 10, 14, 15, 16, 17]).reshape(-1, 1)
y = np.array([2, 4, 4, 9, 10, 6, 10, 13, 18, 14])
# Train
model = LinearRegression()
model.fit(x, y)
# Predict
pred_x = [[14]]
pred_y = model.predict(pred_x)
# weights
print(f'w = {model.coef_}')
# bias
print(f'b = {model.intercept_}')
# score
print(f'score = {model.score(x, y)}')
# prediction
print(f'pred_y = {pred_y}')
결과화면:
>>> w = [0.82959641]
>>> b = 0.869955156950672
>>> score = 0.7938379464976033
>>> pred_y = [12.48430493]