DonHurry

[Python] Linear Regression 본문

Data Science

[Python] Linear Regression

_도녁 2022. 11. 7. 00:50

본 포스트에서는 Pytorch와 Scikit-learn을 통해 선형 회귀 (Linear Regression) 분석을 수행해보겠습니다.

누구나 쉽게 따라할 수 있도록 간단하게 진행됩니다.

 

학습 데이터 생성

우선 간단한 학습 데이터를 생성해줍니다.

이때 x 데이터에 대한 y 값은 다음과 같습니다.

import torch

x = torch.tensor([[1, 2], [3, 2], [3, 7], [1, 1], [1, 0]], dtype=torch.float)
y = torch.tensor([[4], [8], [23], [1], [-2]], dtype=torch.float)

 

W, b 초기화

다음으로 가중치(weight)와 편향(bias)를 초기화시켜줍니다.

이때 학습률(learning rate)는 임의의 값으로 설정합니다.

W = torch.zeros(2, 1)
b = torch.zeros(1, 1)

lr = 0.01

 

반복횟수 설정

학습을 진행하기에 앞서 반복횟수를 설정해주어야 합니다.

간단하게 for 문을 이용하여 설정합니다. 이때 W와 b의 requires_grad를 True로 설정합니다.

for epoch in range(1000):
  W.requires_grad_(True)
  b.requires_grad_(True)

 

가설 (Hypothesis), cost 설정

다음으로 가설과 비용을 설정해주어야 합니다. 가설이란 입력 데이터 x가 들어왔을 때 어떠한 과정을 거치면 출력값 y가 될 것이다라고 예측하는 것입니다. 비용은 가설을 통해 나온 값과 실제 y값에 대한 차이라고 보셔도 좋을 듯 합니다. 그렇다면 가설은 비용을 최대한 줄이는 방법으로 학습해나간다고 유추할 수 있습니다.

 

해당 예제에서는 비용으로 평균제곱오차(MSE)를 활용하였습니다. MSE는 회귀 문제에서 자주 사용되는 손실함수입니다.

h = torch.mm(x, W) + b
cost = torch.mean((h - y) ** 2) # MSE

 

W, b 업데이트

학습이 진행될 때마다 backward를 통해 경사를 계산하고, W와 b를 업데이트 해줍니다.

cost.backward()
with torch.no_grad():
    W = W - lr * W.grad
    b = b - lr * b.grad

 

학습 결과 확인

이제 학습 결과를 확인할 차례입니다!

학습이 진행될수록 앞서 보았던 y함수의 계수에 가깝게 W와 b가 학습되는 것을 확인할 수 있습니다.

또한 학습이 진행될수록 비용이 줄어드는 것도 보입니다.

if epoch % 100 == 0:
      print(f"W: {W}, b: {b}, cost: {cost}")

 

x = [5, 10] 일 때, y의 값은 몇일까요?

앞서 구성한 모델을 통해 예측이 가능합니다.

x_test = torch.tensor([[5, 10]], dtype=torch.float)
test_result = torch.mm(x_test, W) + b
print(test_result)

 

이제 마지막으로 scikit-learn을 통해 결과를 다시 확인해보겠습니다!

 

모델 생성 및 학습

scikit-learn을 활용하면 다음과 같이 편하게 모델을 생성하고 학습할 수 있습니다.

앞선 과정들을 내부적으로 훨씬 효율적이고 정확하게 수행합니다.

from sklearn.linear_model import LinearRegression

x = [[1, 2], [3, 2], [3, 7], [1, 1], [1, 0]]
y = [[4], [8], [23], [1], [-2]]

model = LinearRegression() # 모델 생성
model.fit(x, y) # 학습

 

학습 결과 확인 (파라미터 확인)

학습한 모델의 W와 b를 확인할 차례입니다. 이때 coef_는 기울기 값(W), intercept_는 y절편 값(b)에 해당됩니다.

y 함수에 대해 정확히 학습하는 것을 확인할 수 있습니다.

print(model.coef_, model.intercept_)

 

y값 예측하기

예제를 통해 y값을 예측해봅시다!

print(lr.predict([5, 10]))

 

'Data Science' 카테고리의 다른 글

[Python] PageRank  (1) 2022.12.15
[Python] PCA (Principal Component Analysis)  (0) 2022.12.14
[Python] KNN (K-Nearest Neighbors)  (0) 2022.12.13
[Python] Clustering  (0) 2022.12.12
[Python] Latent Factor Model  (0) 2022.12.12