Why?
- List Comprehension이 익숙치 않아 연습차원에 기존 Evaluation Metric을 줄여보려는 시도로 작성
- 작성하는 김에 numpy, sklearn, torch 모두 작성.
- $RMSE = \sqrt {\sum\limits_{i=1}^{n} (\hat{y_{i}} - y_{i})^2 \over n}$
Code
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
import torch
label = np.random.random((1, 5)).reshape(5,-1)
pred = np.random.random((1, 5)).reshape(5,-1)
# label = np.array([1,2,3,4,5])
# pred = np.array([0,2,5,7,8])
def rmse(label, pred):
return (sum([pow(diff,2) for diff in [y_hat-y for y_hat, y in zip(pred, label)]]) / len(label)) ** (1/2)
def torch_rmse(label,pred):
return (torch.Tensor(pred)- torch.Tensor(label)).pow(2).mean().sqrt()
np.round(rmse(label,pred),2) == np.round(mean_squared_error(label,pred,squared=False),2) == np.round(torch_rmse(label,pred),2)
Tip
- 아래와 같은 Error 발생시 Numpy Array 변환 Function 을 torch.from_numpy() → torch.Tensor로 변경한다.
- torch.from_numpy() 과 torch.Tensor()는 return type은 Tensor로 동일하나, from_numpy는 기존 input의 data type을 그대로 가지고 오고, Tensor는 FloatTensor를 기본으로 가지고 오면서 그 차이에서 발생하는 에러임 (참고)
RuntimeError: mean(): input dtype should be either floating point or complex dtypes. Got Long instead.