선형 모형은 아래와 같은 간단한 식으로 이루어져 있다.
대표적인 예로 부모의 키는 자식의 키에 연관이 되어있다는 예제가 있다.
이것을 표현하면
위와 같다.
그렇다면 선형 회귀모델은 어떻게하면 만들 수 있을까?
일단 선형 회귀 모델을 만들때에는 4가지 가정을 만족해야한다.
- 선형성 : 종속 변수와 독립 변수 간의 관계가 선형적이어야 한다. - 가장 중요
- 독립성 : 관측 값들이 서로 독립적이어야 한다.
잔차들이 무작위어야 함.
잔차가 시간에 따라 특정 패턴을 보이면, 독립성 가정이 위배됨.- 등분산성 : e(Error)의 분산이 일정해야 한다.
잔차들이 일정한 분포를 보여야 함.
특정 구간에서 분산이 커지거나 작아지면 가정이 위배됨.- 정규성 : e(Error)가 정규분포를 따라야한다.
위의 4가지 가정을 통과(만족) 하면 모델을 만들 수 있는 최소 조건이 만족된 것이다.
그렇다면 어떻게 최적의 값으로 찾아 갈 수 있을까?(Tuning)
여러가지 방법이 있다.
- (OLS 최소 제곱법)
- 다중 선형 회귀
첫 번째로 OLS(최소 제곱법)으로 학습할 수 있다.
마지막으로 모델을 평가 해야하는데 아래와 같은 항목으로 평가 할 수있다.
물론 다른 지표 또한 있지만 아래 4개로 설명하겠다.
MAE(평균 절대 오차)
MSE(평균 제곱 오차)
RMSE(제곱근 평균 제곱 오차)
(결정 계수)
MAE는 예측값이 실제 값과 얼마나 차이나는지 절대값으로 계산및 평균을 낸 지표이다.
모든 오차를 동일하게 고려해, 해석이 간단하다.
단위가 종속 변수와 동일 하며, 단순한 예측 성능 평가 및 쉽게 해석 가능한 경우 사용한다.
실제 값과 예측 값 간의 차이의 제곱을 평균낸 값이다.
오차를 제곱하기때문에 오차에 더 큰 가중치를 준다고 할 수 있다.
큰오차에 민감하게 반응하므로, 모델의 큰 오차를 줄이는데 유용하다.
MSE에 제곱근을 취한 값으로 오차를 원래 단위로 변환한다.
MSE와 같은 장점을 가지면서 단위가 맞지않던 문제를 해결한다.
해석이 쉽고, MSE의 장점인 큰오차에 민감하게 반응하는 동시에 실제 값과 같은 단위를 유지한다.
모델 평가시 일반적으로 많이 사용된다.
모델이 종속변수의 변동성을 얼마나 설명하는지 나타내는 지표이다.
0~1사이의 값을 가지며, 1에 가까울수록 모델이 데이터를 잘 설명한다.
비교적 해석이 쉬우며 다른모델과 비교할때 유용하다.
또한 여러모델의 성능을 비교할때 많이 사용한다.
그렇다면 scikit-learn등의 라이브러리 없이 Numpy로 구현한다면 어떻게 할 수 있을까?
import numpy as np
class LinearRegression:
def __init__(self):
self.weights = None
self.bias = None
# 모델 Fitting Method
def fit(self, X:np.ndarray, y:np.ndarray):
X = np.hstack((np.ones((X.shape[0], 1)), X))
# OLS
self.weights = np.dot(np.linalg.inv(X.transpose().dot(X)),X.transpose().dot(y))
self.bias = self.weights[0]
self.weights = self.weights[1]
# 예측 메서드
def predict(self, X):
# X에 절편 항 추가
X = np.hstack((np.ones((X.shape[0], 1)), X))
y_pred = X.dot(np.hstack((self.bias, self.weights)))
return y_pred
위처럼 간단하게 구현할 수 있다.
OLS로 구현할 경우
이므로 위의 식
self.weights = np.dot(np.linalg.inv(X.transpose().dot(X)),X.transpose().dot(y))
을 통해 Weight와 Bias를 구할 수 있게된다.