def collect(self, batch): """ 收集一 batch 的评估输入 Args: batch(dict): 输入数据,字典类型,包含两个Key:(y_true, y_pred): batch['y_true']: (batch_size, 1) batch['y_pred']: (batch_size, 1) """ if not isinstance(batch, dict): raise TypeError('evaluator.collect input is not a dict of user') y_true = batch['y_true'] # tensor y_pred = batch['y_pred'] # tensor if y_true.shape != y_pred.shape: raise ValueError( "batch['y_true'].shape is not equal to batch['y_pred'].shape") for metric in self.metrics: if metric not in self.intermediate_result: self.intermediate_result[metric] = [] for metric in self.metrics: if metric == 'masked_MAE': self.intermediate_result[metric].append( loss.masked_mae_torch(y_pred, y_true, 0).item()) elif metric == 'masked_MSE': self.intermediate_result[metric].append( loss.masked_mse_torch(y_pred, y_true, 0).item()) elif metric == 'masked_RMSE': self.intermediate_result[metric].append( loss.masked_rmse_torch(y_pred, y_true, 0).item()) elif metric == 'masked_MAPE': self.intermediate_result[metric].append( loss.masked_mape_torch(y_pred, y_true, 0).item()) elif metric == 'MAE': self.intermediate_result[metric].append( loss.masked_mae_torch(y_pred, y_true).item()) elif metric == 'MSE': self.intermediate_result[metric].append( loss.masked_mse_torch(y_pred, y_true).item()) elif metric == 'RMSE': self.intermediate_result[metric].append( loss.masked_rmse_torch(y_pred, y_true).item()) elif metric == 'MAPE': self.intermediate_result[metric].append( loss.masked_mape_torch(y_pred, y_true).item()) elif metric == 'R2': self.intermediate_result[metric].append( loss.r2_score_torch(y_pred, y_true).item()) elif metric == 'EVAR': self.intermediate_result[metric].append( loss.explained_variance_score_torch(y_pred, y_true).item())
def calculate_loss(self, batch, batches_seen=None): y_true = batch['y'] y_predicted = self.predict(batch, batches_seen) y_true = self._scaler.inverse_transform(y_true[..., :self.output_dim]) y_predicted = self._scaler.inverse_transform( y_predicted[..., :self.output_dim]) return loss.masked_rmse_torch(y_predicted, y_true)
def evaluate(self, test_dataloader): """ use model to test data """ self.evaluator.evaluate() node_features = torch.FloatTensor(test_dataloader['node_features']).to( self.device) node_labels = node_features.clone() test_mask = test_dataloader['mask'] self._logger.info('Start evaluating ...') with torch.no_grad(): self.model.eval() output = self.model.predict({'node_features': node_features}) output = self._scaler.inverse_transform(output) node_labels = self._scaler.inverse_transform(node_labels) rmse = loss.masked_rmse_torch(output[test_mask], node_labels[test_mask]) mae = loss.masked_mae_torch(output[test_mask], node_labels[test_mask]) mape = loss.masked_mape_torch(output[test_mask], node_labels[test_mask]) self._logger.info('mae={}, map={}, rmse={}'.format( mae.item(), mape.item(), rmse.item())) return mae.item(), mape.item(), rmse.item()
def collect(self, batch): """ 收集一 batch 的评估输入 Args: batch(dict): 输入数据,字典类型,包含两个Key:(y_true, y_pred): batch['y_true']: (num_samples/batch_size, timeslots, ..., feature_dim) batch['y_pred']: (num_samples/batch_size, timeslots, ..., feature_dim) """ if not isinstance(batch, dict): raise TypeError('evaluator.collect input is not a dict of user') y_true = batch['y_true'] # tensor y_pred = batch['y_pred'] # tensor if y_true.shape != y_pred.shape: raise ValueError( "batch['y_true'].shape is not equal to batch['y_pred'].shape") self.len_timeslots = y_true.shape[1] for i in range(1, self.len_timeslots + 1): for metric in self.metrics: if metric + '@' + str(i) not in self.intermediate_result: self.intermediate_result[metric + '@' + str(i)] = [] if self.mode.lower() == 'average': # 前i个时间步的平均loss for i in range(1, self.len_timeslots + 1): for metric in self.metrics: if metric == 'masked_MAE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mae_torch(y_pred[:, :i], y_true[:, :i], 0).item()) elif metric == 'masked_MSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mse_torch(y_pred[:, :i], y_true[:, :i], 0).item()) elif metric == 'masked_RMSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_rmse_torch(y_pred[:, :i], y_true[:, :i], 0).item()) elif metric == 'masked_MAPE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mape_torch(y_pred[:, :i], y_true[:, :i], 0).item()) elif metric == 'MAE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mae_torch(y_pred[:, :i], y_true[:, :i]).item()) elif metric == 'MSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mse_torch(y_pred[:, :i], y_true[:, :i]).item()) elif metric == 'RMSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_rmse_torch(y_pred[:, :i], y_true[:, :i]).item()) elif metric == 'MAPE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mape_torch(y_pred[:, :i], y_true[:, :i]).item()) elif metric == 'R2': self.intermediate_result[metric + '@' + str(i)].append( loss.r2_score_torch(y_pred[:, :i], y_true[:, :i]).item()) elif metric == 'EVAR': self.intermediate_result[metric + '@' + str(i)].append( loss.explained_variance_score_torch( y_pred[:, :i], y_true[:, :i]).item()) elif self.mode.lower() == 'single': # 第i个时间步的loss for i in range(1, self.len_timeslots + 1): for metric in self.metrics: if metric == 'masked_MAE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mae_torch(y_pred[:, i - 1], y_true[:, i - 1], 0).item()) elif metric == 'masked_MSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mse_torch(y_pred[:, i - 1], y_true[:, i - 1], 0).item()) elif metric == 'masked_RMSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_rmse_torch(y_pred[:, i - 1], y_true[:, i - 1], 0).item()) elif metric == 'masked_MAPE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mape_torch(y_pred[:, i - 1], y_true[:, i - 1], 0).item()) elif metric == 'MAE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mae_torch(y_pred[:, i - 1], y_true[:, i - 1]).item()) elif metric == 'MSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mse_torch(y_pred[:, i - 1], y_true[:, i - 1]).item()) elif metric == 'RMSE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_rmse_torch(y_pred[:, i - 1], y_true[:, i - 1]).item()) elif metric == 'MAPE': self.intermediate_result[metric + '@' + str(i)].append( loss.masked_mape_torch(y_pred[:, i - 1], y_true[:, i - 1]).item()) elif metric == 'R2': self.intermediate_result[metric + '@' + str(i)].append( loss.r2_score_torch(y_pred[:, i - 1], y_true[:, i - 1]).item()) elif metric == 'EVAR': self.intermediate_result[metric + '@' + str(i)].append( loss.explained_variance_score_torch( y_pred[:, i - 1], y_true[:, i - 1]).item()) else: raise ValueError( 'Error parameter evaluator_mode={}, please set `single` or `average`.' .format(self.mode))