선형회귀(Linear Regression) 모델에 대한 경사하강법 구현을 진행해보자.
numpy를 이용해 정답값을 예측해보는 선형회귀 모델을 구현할 것이다!
코드를 중심으로 설명해보겠다.
1. 경사하강법을 위한 데이터 분리
import numpy as np
# 주어진 데이터
xy = np.array([[1., 2., 3., 4., 5., 6.], [10., 20., 30., 40., 50., 60.]])
# x와 y 분리
x_train = xy[0, :]
y_train = xy[1, :]
print(x_train, x_train.shape)
# [1. 2. 3. 4. 5. 6.] (6,)
print(y_train, y_train.shape)
# [10. 20. 30. 40. 50. 60.] (6,)
데이터는 훈련 데이터 x_train과 그에 해당하는 정답값 y_train으로 구성되어 있다.
2. 경사하강법 구현을 위한 train, weight, bias 정의
이제 초기의 가중치와 편향을 랜덤으로 생성해보겠다.
weight는 선형회귀 모델의 직선의 기울기,
bias는 y절편 값이 된다.
# seed를 설정하여 매번 동일한 랜덤 값을 얻을 수 있다.
np.random.seed(20)
beta_gd = np.random.rand(1) # 초기 가중치 랜덤생성
bias = np.random.rand(1) # 초기 편향 랜덤생성
3. 경사하강법 구현
이제 최종적으로 linear regression을 경사하강법으로 학습하는 코드를 구현해보자.
Error는 차이의 제곱을 사용하고,
Gradient(기울기) 값은 우리가 예측하는 각 변수에 대한 미분값이다.
선형회귀 모델은 y = beta_gd * x + bias 형태의 간단한 선형식을 사용한다.
1000번의 학습을 진행하며, 학습을 진행하는 동안, 100번 반복할 때마다 현재의 가중치, 편향, 오차를 출력한다.
이때, 오차(Error)는 차이의 제곱을 사용하는데, 이는 곧 실제 값과 예측 값의 차이의 제곱을 의미한다.
이를 평균 제곱 오차(Mean Squared Error, MSE)라고 하며, 손실함수로 이 값을 매우 많이 사용한다!
-> 즉, 경사하강법을 구현할 때, 실제 값과 예측값의 차이를 통해 오차를 계산하고,
이 오차를 이용해 가중치와 편향을 업데이트한다. (값을 뺌으로써 경사하강법 진행 -> 현재 파라미터를 오차를 줄이는 방향으로 업데이트)
이렇게하면 오차가 최소가 되는 가중치와 편향을 찾을 수 있다.
==> 목표: 오차를 이용해 주어진 데이터에 대하여 최소가 되는 가중치(기울기)와 편향(y절편) 찾기!
(모델의 예측값과 실제값의 차이(오차)를 최소화하는 파라미터 찾기!)
gradient_beta : 가중치(beta_gd)에 대한 오차 함수의 기울기
gradient_bias : 편향(bias)에 대한 오차 함수의 기울기
learning_rate = 0.001
# 학습률 지정
learning_rate = 0.001
for i in range(1000):
# 예측값 계산
y_pred = beta_gd * x_train + bias
# 오차 계산(MSE)
error = np.mean((y_pred - y_train) ** 2)
# 미분값 계산
gradient_beta = 2 * np.mean((y_pred - y_train) * x_train)
gradient_bias = 2 * np.mean(y_pred - y_train)
# 파라미터 업데이트
beta_gd -= learning_rate * gradient_beta
bias -= learning_rate * gradient_bias
# 100회마다 결과 출력
if i % 100 == 0:
print(f'Epoch ({i:3d}/{1000})\t cost: {error:.6f}, \tw: {beta_gd[0]:.6f}, \tb: {bias[0]:.6f}')
4. 새로운 데이터 예측
이제 앞서 구한 기울기, y절편의 값을 이용해 새로운 데이터를 예측할 수 있다.
import matplotlib.pyplot as plt
# 새로운 데이터를 이용해 예측 수행 가능
X_new = np.array([1.5, 3.4, 6])
y_new = beta_gd * X_new + bias
# 결과 시각화
plt.scatter(x_train, y_train, color='blue', label='Actual data')
plt.plot(x_train, beta_gd * x_train + bias, color='red', label='Fitted line')
plt.scatter(X_new, y_new, color='green', marker='o', label='New predictions')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.title('Linear Regression with Gradient Descent')
plt.show()
# 실제 데이터(파란색 점), 선형 회귀 결과(빨간색 선), 새로운 데이터에 대한 예측(녹색 점)
print(y_new)
- 본 포스트의 학습 내용은 부스트클래스 <AI 엔지니어 기초 다지기 : 부스트캠프 AI Tech 준비과정> 강의 내용을 바탕으로 작성되었습니다.