Python(Colab) 파이토치(Pytorch) + 다항 선형회귀 해보기

2023. 6. 20. 21:40파이썬/머신러닝 및 딥러닝

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]])

print(x_train)
print(x_train.shape)

print('------------------')

print(y_train)
print(y_train.shape)
 

 

2. 모델 설정

 

model = nn.Linear(3,1) # 3개가 들어가서 1개가 나온다
print(model)
print(list(model.parameters()))

 

3. 학습하기

 

optimizer = optim.SGD(model.parameters(),lr=0.00001)
 
# 학습하기
epochs =1000

for epoch in range(epochs+1):
    y_pred = model(x_train)
    loss = nn.MSELoss()(y_pred,y_train)
    optimizer.zero_grad() #초기화
    loss.backward() # 미분
    optimizer.step() #업데이트

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

 

4. 최적의 파라미터 확인

 

#최종 파라미터 확인
print(list(model.parameters()))
 

 

5. 테스트해보기

x_test = torch.FloatTensor([[82,92,82]])
y_pred = model(x_test)

print(y_pred)
173.3595라는 예측값을 알수 있다.

 


 


csv파일을 적용해서 해보기

목표: 기온에 따른 지면온도를 예측해보자

 

 

1. 데이터를 read  + 결측값 제거  + 컬럼 이름 확인하기

temp_df = pd.read_csv('/content/drive/MyDrive/KDT-1/머신러닝과 딥러닝/temps.csv',encoding='CP949')
 
temp_df = temp_df.dropna()
 
temp_df.info()

 

 

2. 필요한 데이터 뽑아오기

x_data = torch.FloatTensor(temp_df[['기온(°C)']].values)
y_data = torch.FloatTensor(temp_df[['지면온도(°C)']].values)

print(x_data)
print(y_data)
주의점 밑에로 뽑아오면 독립변수가 다항으로된다. (모양확인 필수)
# 이거아님 !!!!!🔴
x_data = torch.FloatTensor([temp_df['기온(°C)'].values])
y_data = torch.FloatTensor([temp_df['지면온도(°C)'].values])

print(x_data)
print(y_data)

 

3. 독립변수와 종속변수 시각화

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

 

4. 모델 기초설정 및 학습시키기

 

model = nn.Linear(1,1)
print(list(model.parameters()))
 
optimizer = optim.SGD(model.parameters(),lr=0.001)
 
epochs = 1000

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 % 100 == 0:
        print(f'Epoch{epoch}/{epochs} // Loss{loss:.6f}')
 

 

5. 예측 데이터 확인

역전파가 안되게 detach().numpy()를 적용

✔️detach()

✔️numpy() : 텐서 객체를 numpy 배열로 변경해준다.
y_pred = model(x_data).detach().numpy()
y_pred

 

728x90