최소 제곱법 (Least Square Method)는 선형 회귀 분석에서 데이터를 하나의 직선으로 표현하기 위해 직선의 기울기와 절편을 구하기 위한 방법입니다.
다중 선형회귀에서도 최소 제곱법을 사용할 수 있지만, 본 포스팅에서는 단순 선형회귀에 대한 최소 제곱법을 소개하겠습니다.
독립 변수 X가 공부 시간, 종속 변수 Y가 시험 점수이고 데이터가 다음과 같을 때 산점도로 확인하면 다음과 같습니다.
X = [1, 2, 5, 8, 10]
Y = [10, 15, 68, 80, 95]
최소 제곱법을 통해 직선을 만들어보겠습니다. 식은 다음과 같습니다.
y = ax + b에서 a와 b는 다음과 같습니다. 여기서 sum은 합, avg는 평균입니다.
a = sum(x의 편차 * y의 편차) / sum(x의 편차 제곱)
b = avg(y) - (a * avg(x))
파이썬 코드로 직접 구현해 보겠습니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error
X = np.array([1, 2, 5, 8, 10])
y = np.array([10, 15, 68, 80, 95])
mean_X = np.mean(X)
mean_Y = np.mean(y)
dev_X = X - mean_X
dev_Y = y - mean_Y
a = sum(dev_X * dev_Y) / sum(dev_X**2)
b = np.mean(y) - (a * np.mean(X))
y_pred = a * X + b
print(y) # [10 15 68 80 95]
print(y_pred) # [ 12.42857143 22.23129252 51.63945578 81.04761905 100.65306122]
MAE = mean_absolute_error(y, y_pred)
print(MAE) # 6.544217687074831
plt.scatter(X, y)
plt.plot(X, y_pred, 'g-')
plt.legend(['y', 'y_pred'])
plt.xlabel('Study time')
plt.ylabel('Score')
plt.show()
회귀 분석 평가에는 정확도라는 개념은 없습니다.
(정확도는 분류에만 존재)
따라서 MSE, MAE, RMSE 등의 지표를 이용합니다. 여기서는 MAE를 이용하여 평가해보겠습니다.
MAE는 다음과 같이 정의됩니다.
예측값에서 정답을 뺀 값에 절댓값을 취하여 모두 더하고 데이터 수만큼 나눈 값입니다.
위 파이썬 코드에서 MAE 값은 약 6.5이며, 데이터 스케일(0~100점)을 볼 때 높은 것으로 보입니다.
(기준은 정해져 있지 않습니다.)
다시 말해서, 회귀 분석이 좋은 예측을 하지 못했다는 것을 의미합니다.
직선으로 표현하기 어렵기 때문에 최소 제곱법을 이용한 단순 회귀 분석대신 다른 머신러닝 기법을 사용하는 것이 좋을 듯 합니다.
머신러닝 모델 중 ExtraTreesRegressor으로 예측해보겠습니다.
from sklearn.ensemble import ExtraTreesRegressor
etr = ExtraTreesRegressor()
etr.fit(X.reshape(-1, 1), y.reshape(-1, 1))
etr_y_pred = etr.predict(np.arange(1, 11, 1).reshape(-1, 1))
print(etr_y_pred) # [10. 15. 34.61 52.63 68. 71.6 76.16 80. 86.6 95. ]
plt.scatter(X, y)
plt.plot(X, y_pred, 'g-')
plt.plot(np.arange(1, 11, 1), etr_y_pred, 'r-')
plt.legend(['y', 'y_pred', 'etr_y_pred'])
plt.xlabel('Study time')
plt.ylabel('Score')
plt.show()
학습에 사용한 X값(1, 2, 5, 8, 10)에 대한 예측값(10, 15, 68, 80, 95)은 정답 Y값(10, 15, 68, 80, 95)와 일치합니다.
즉, 학습 데이터는 잘 훈련되었다고 볼 수 있습니다.
학습에 사용하지 않은 데이터(3, 4, 6, 7, 9)를 포함한 전체 입력(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)에 대한 예측값(10, 15, 34.61, 52.63, 68, 71.6, 76.16, 80, 86.6, 95)를 그래프로 나타내보았습니다.
데이터의 양을 늘리고 학습 데이터와 테스트 데이터를 나누고, 테스트 데이터의 예측값과 정답값을 비교하면 모델의 성능을 육안으로 확인할 수 있을 것입니다.
'AI > Machine Learning' 카테고리의 다른 글
[Machine Learning] 파이프라인 (0) | 2022.09.13 |
---|---|
[Machine Learning] 크로스-밸리데이션 (cross-validation) (0) | 2022.09.13 |
[Machine Learning] Kaggle Competition 데이터 전처리 예제 (0) | 2022.08.26 |
[Machine Learning] 통계학 - 평균과 분산 (0) | 2022.08.10 |
[Machine Learning] 통계학 - 확률 변수와 확률 분포 (0) | 2022.08.10 |