다음의 책을 공부하며 정리한 내용입니다
선형회귀란
: 선형 회귀란 학습 데이터와 가장 잘 맞는 하나의 직선
을 찾는 일.
- 하나의
직선
은 W와 b
로 정의할 수 있다.
- 선형 회귀의 목표:
가장 잘 맞는 직선
을 정의하는 W와 b
의 값을 찾는 것.
파이토치에서의 선형회귀
선형회귀 훈련을 위한 기본적인 코드의 뼈대는 아래와 같다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
import torch
x_train = torch.FloatTensor([[1], [2], [3]]) y_train = torch.FloatTensor([[2], [4], [6]])
W = torch.zeros(1, requires_grad=True) b = torch.zeros(1, requires_grad=True)
hypothesis = x_train * W + b
cost = torch.mean((hypothesis - y_train) ** 2)
optimizer = torch.optim.SGD([W, b], lr=0.01)
|
이를 바탕으로 실제 동작하는 선형회귀 모델을 제작해 학습을 진행해보면 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import torch torch.manual_seed(1)
x_train = torch.FloatTensor([[1], [2], [3]]) y_train = torch.FloatTensor([[2], [4], [6]])
w = torch.zeros(1, requires_grad=True) b = torch.zeros(1, requires_grad=True)
optimizer = torch.optim.SGD([w, b], lr=0.01)
tot_epoch = 1000
for cur_epoch in range(tot_epoch + 1): y_hat = (w * x_train) + b
cost = torch.mean((y_train - y_hat) ** 2)
optimizer.zero_grad() cost.backward() optimizer.step()
if cur_epoch % 100 == 0: print('Epoch {:4d}/{} w: {:.3f}, b: {:.3f} Cost: {:.6f}'.format( cur_epoch, tot_epoch, w.item(), b.item(), cost.item() ))
|
1 2 3 4 5 6 7 8 9 10 11 12
| [결과] Epoch 0/1000 w: 0.187, b: 0.080 Cost: 18.666666 Epoch 100/1000 w: 1.746, b: 0.578 Cost: 0.048171 Epoch 200/1000 w: 1.800, b: 0.454 Cost: 0.029767 Epoch 300/1000 w: 1.843, b: 0.357 Cost: 0.018394 Epoch 400/1000 w: 1.876, b: 0.281 Cost: 0.011366 Epoch 500/1000 w: 1.903, b: 0.221 Cost: 0.007024 Epoch 600/1000 w: 1.924, b: 0.174 Cost: 0.004340 Epoch 700/1000 w: 1.940, b: 0.136 Cost: 0.002682 Epoch 800/1000 w: 1.953, b: 0.107 Cost: 0.001657 Epoch 900/1000 w: 1.963, b: 0.084 Cost: 0.001024 Epoch 1000/1000 w: 1.971, b: 0.066 Cost: 0.000633
|
위의 코드와 결과는 다음을 의미한다.
- x가 [1, 2, 3]일때 y가 [2,4,6]이 되는 w와 b는 2, 0이다.
- 학습을 통해 최종적으로 찾은 결과 w,b는 1.971, 0.066이므로 어느정도 답을 찾아냈다고 볼 수 있다.
다중선형회귀
: 기존의 선형회귀가 y = wx + b의 w,b를 찾는 모델이었다면, 다중선형회귀는 y = w1x1 + w2x2 + w3x3 + b의 w1, w2, w3, b를 찾는 모델
이다.
선형회귀 훈련을 위한 기본적인 코드의 뼈대는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
x_train = torch.FloatTensor([[73, 80, 75], [93, 88, 93], [89, 91, 90], [96, 98, 100], [73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
w = torch.zeros((3, 1) ,requires_grad=True) b = torch.zeros(1, requires_grad=True)
hypothesis = x_train.matmul(w) + b
|
이를 바탕으로 실제 동작하는 다중선형회귀 모델을 제작해 학습을 진행해보면 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import torch torch.manual_seed(1)
x_train = torch.FloatTensor([[73, 80, 75], [93, 88, 93], [89, 91, 90], [96, 98, 100], [73, 66, 70]]) y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
w = torch.zeros((3, 1) ,requires_grad=True) b = torch.zeros(1, requires_grad=True)
optimizer = torch.optim.SGD([w, b], lr=1e-5)
tot_epoch = 1000 for cur_epoch in range(tot_epoch + 1):
y_hat = x_train.matmul(w) + b cost = torch.mean((y_train - y_hat) ** 2)
optimizer.zero_grad() cost.backward() optimizer.step()
if cur_epoch % 100 == 0: print('Epoch {:4d}/{} Cost: {:.6f}'.format( cur_epoch, tot_epoch, cost.item() ))
|
1 2 3 4 5 6 7 8 9 10 11 12
| [결과] Epoch 0/1000 Cost: 29661.800781 Epoch 100/1000 Cost: 1.563628 Epoch 200/1000 Cost: 1.497595 Epoch 300/1000 Cost: 1.435044 Epoch 400/1000 Cost: 1.375726 Epoch 500/1000 Cost: 1.319507 Epoch 600/1000 Cost: 1.266222 Epoch 700/1000 Cost: 1.215703 Epoch 800/1000 Cost: 1.167810 Epoch 900/1000 Cost: 1.122429 Epoch 1000/1000 Cost: 1.079390
|