본문 바로가기
AI

기온에 따른 지면 온도 예측

by 코낄2 2024. 1. 8.
# df에 데이터 프레임으로 불러오기
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

temp_df = pd.read_csv('/content/drive/MyDrive/KDT/머신러닝과 딥러닝/data/temps.csv',encoding='ms949')

temp_df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8782 entries, 0 to 8781
Data columns (total 5 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   지점        8782 non-null   int64  
 1   지점명       8782 non-null   object 
 2   일시        8782 non-null   object 
 3   기온(°C)    8779 non-null   float64
 4   지면온도(°C)  8782 non-null   float64
dtypes: float64(2), int64(1), object(2)
memory usage: 343.2+ KB
# df의 null 확인하기
temp_df.isna().mean()

지점          0.000000
지점명         0.000000
일시          0.000000
기온(°C)      0.000342
지면온도(°C)    0.000000
dtype: float64
# df의 null 제거하기
temp_df = temp_df.dropna()

temp_df.isna().mean()

지점          0.0
지점명         0.0
일시          0.0
기온(°C)      0.0
지면온도(°C)    0.0
dtype: float64
# x_data에 기온 데이터를 저장
x_data = temp_df[['기온(°C)']] # 대괄호2개로 차원 유지

# 데이터프레임을 텐서로 변경
x_data = torch.FloatTensor(x_data.values)

# y_data에 지면온도 데이터를 저장
y_data = temp_df[['지면온도(°C)']]

# 데이터프레임을 텐서로 변경
y_data = torch.FloatTensor(y_data.values)

print(x_data.shape, y_data.shape)
torch.Size([8779, 1]) torch.Size([8779, 1])
# scatter로 x_data와 y_data를 출력
plt.figure(figsize = (8,8))
plt.scatter(x_data, y_data)

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

print(list(model.parameters()))
[Parameter containing:
tensor([[0.5275]], requires_grad=True), Parameter containing:
tensor([0.2202], requires_grad=True)]
# 모델을 학습
# 오차함수는 평균 제곱 오차 손실 함수(Mean Squared Error Loss) MSELoss()를 사용
epochs = 10000

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}')

Epoch: 0/10000 Loss :  12.956379
Epoch: 1000/10000 Loss :  12.956379
Epoch: 2000/10000 Loss :  12.956378
Epoch: 3000/10000 Loss :  12.956378
Epoch: 4000/10000 Loss :  12.956378
Epoch: 5000/10000 Loss :  12.956378
Epoch: 6000/10000 Loss :  12.956378
Epoch: 7000/10000 Loss :  12.956378
Epoch: 8000/10000 Loss :  12.956378
Epoch: 9000/10000 Loss :  12.956378
Epoch: 10000/10000 Loss :  12.956378

--------------------마무리----------------------------

# 학습된 파라미터 확인
print(list(model.parameters()))

[Parameter containing:
tensor([[1.0854]], requires_grad=True), Parameter containing:
tensor([0.8199], requires_grad=True)]
# scatter로 x_data와 y_data를 출력 후 예측된 선을 출력

y_pred =  model(x_data).detach().numpy()

y_pred //
array([[-8.62291  ],
       [-7.1033754],
       [-6.4521456],
       ...,
       [-7.1033754],
       [-8.948524 ],
       [-9.165601 ]], dtype=float32)

# detach(): 텐서에서 다른 자료구조로 변환

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

'AI' 카테고리의 다른 글

데이터 로더  (0) 2024.01.09
파이토치로 구현한 논리회귀  (0) 2024.01.08
파이토치로 구현한 선형회귀  (1) 2024.01.08
파이토치  (0) 2024.01.07
KMeans  (0) 2024.01.05