# 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 |