AI/PyTorch

[PyTorch-예제] 기온에 따른 지면 온도 예측 - 선형 회귀

caramel-bottle 2024. 1. 8.

2024.01.08 - [AI/딥러닝] - [딥러닝] 파이토치(PyTorch)로 선형 회귀 모델 만들기

 

[딥러닝] 파이토치(PyTorch)로 선형 회귀 모델 만들기

2024.01.06 - [AI/딥러닝] - [딥러닝] 파이토치(Pytorch) [딥러닝] 파이토치(Pytorch) 1. 파이토치란? Tensorflow와 함께 머신러닝, 딥러닝에서 가장 널리 사용되는 프레임워크입니다. 초기에는 Torch라는 이름으

caramelbottle.tistory.com

이전 글에서 파이토치로 직접 만든 선형 회귀 모델을 학습하고 예측하는 것까지 해보았습니다.

 

직접 만든 데이터만으로 성능을 판단하기엔 부족하기 때문에 실제 데이터와 가까운 데이터셋을 통해 학습, 예측, 성능평가를 해보도록 하겠습니다.

1. temp.csv

사용할 데이터셋은 천안의 기온과 지면온도에 대한 데이터를 가지고 있습니다.

temps.csv
0.30MB



# df에 데이터 프레임으로 불러오기
import pandas as pd

df = pd.read_csv('/content/drive/MyDrive/KDT/머신러닝과 딥러닝/data/temps.csv', encoding="euc-kr")

df.head()

output>>

우리의 목표는 기온에 따른 지면온도를 예측하기 입니다.


1-1. 데이터 처리

간단하게 결측치를 제거하고 컬럼을 영어로 변경해주었습니다.

# df의 null 제거하기
df.dropna(inplace=True)
df.isna().mean()

# 컬럼이름 변경
df = df.rename(columns={'지점': 'locid', '지점명': 'loc', '일시': 'date', '기온(°C)': 'temp', '지면온도(°C)': 'gtemp'})
df.head()

output>>


1-2. 데이터 나누기

독립변수와 종속변수를 나눠서 FloatTensor타입으로 저장해봅시다.

x_data = df[['temp']]
y_data = df[['gtemp']]

x_data = torch.FloatTensor(x_data.values)
y_data = torch.FloatTensor(y_data.values)

 

나눈 데이터를 그래프로 시각화하여 데이터 분포를 확인합니다.

plt.figure(figsize=(6, 6))
plt.scatter(x_data, y_data, alpha=0.4)
plt.xlabel('temp')
plt.ylabel('gtemp')
plt.show()

output>>


1-3. 모델 생성

하나의 입력(temp)에 하나의 출력(gtemp)이니 Linear(1, 1) 모델을 생성해봅시다.

 

optimizer는 SGD를 사용하고 학습률 0.001로 하겠습니다.

# 입력과 출력이 1개인 선형모델 생성
# SGD를 통해 옵티마이저 객체를 생성
model = nn.Linear(1, 1)

optimizer = optim.SGD(model.parameters(), lr=0.001)

1-4. 학습

학습을 위해 추가로 epochs와 loss함수를 정해야합니다.

 

epochs 5000, Loss함수는 MSELoss()를 사용하겠습니다.

# 모델을 학습
# 오차함수는 MSELoss()를 사용

epochs = 5000

for epoch in range(epochs + 1):
    y_pred = model(x_data)
    loss = nn.MSELoss()(y_pred, y_data)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 1000 == 0:
        print(f'Epoch: {epoch}/{epochs} Loss: {loss:.6f}')

output>>

Epoch: 0/5000 Loss: 33.297783
Epoch: 1000/5000 Loss: 13.035659
Epoch: 2000/5000 Loss: 12.972025
Epoch: 3000/5000 Loss: 12.959465
Epoch: 4000/5000 Loss: 12.956989
Epoch: 5000/5000 Loss: 12.956499

 

학습된 모델의 파라미터를 확인하면

# 학습된 파라미터 확인
W = list(model.parameters())[0].data
b = list(model.parameters())[1].data
print(f'최종값 W: {list(model.parameters())[0].data}, b: {list(model.parameters())[1].data}')

output>>

최종값 W: tensor([[1.0862]]), b: tensor([0.8028])

1-5. 예측 확인

최종 파라미터에 해당하는 직선은 모델의 예측을 의미합니다.

 

모델이 예측한 값들을 시각화하여 직선을 나타내는지 확인해봅시다.

# 예측한 데이터를 numpy형태로 저장
y_pred = model(x_data).detach().numpy()

plt.figure(figsize=(8, 6))
plt.scatter(x_data, y_data)
plt.scatter(x_data, y_pred)

output>>

 

굳이긴 하지만 예측선도 한번 찍어보도록 하겠습니다.

 

# scatter로 x_data와 y_data를 출력 후 예측된 선을 출력
plt.scatter(x_data, y_data, alpha=0.4, s=10, marker='o', label='real')
plt.plot(x_data, W * x_data + b, color='red', label='predict')
plt.xlabel('temp(°C)')
plt.ylabel('groudTemp(°C)')
plt.legend()

output>>


끝내며

예시로 만든 데이터가 아쉬워서 제공된 데이터셋을 사용하여 모델을 학습하고 예측을 해보았습니다.

 

다음으로 만들어볼 모델은 로지스틱 회귀 모델입니다.

댓글