|
- import numpy as np
- import pandas as pd
- from sklearn.metrics import mean_squared_error, mean_absolute_error, mean_squared_log_error, r2_score
- from easy_forecast.validation.acc_metric import Acc_Metric
-
-
- class BasicAccMetric(Acc_Metric):
- """
- 定义准确率衡量标准
- """
- MAPE = "mape"
- WMAPE = "wmape"
- SMAPE = "smape"
- MSE = "mse"
- RMSE = "rmse"
- MAE = "mae"
- MSLE = "msle"
-
- def __init__(self, y, yhat):
- super(BasicAccMetric, self).__init__(y=y, yhat=yhat)
-
- def compute(self, type_name):
- """
- 计算准确率
- :param type_name:
- :return:
- """
- metric_dict = {
- BasicAccMetric.MAPE: self.mape,
- BasicAccMetric.WMAPE: self.wmape,
- BasicAccMetric.SMAPE: self.smape,
- BasicAccMetric.MSE: self.mse,
- BasicAccMetric.RMSE: self.rmse,
- BasicAccMetric.MAE: self.mae,
- BasicAccMetric.MSLE: self.msle,
- }
- if type_name not in metric_dict.keys():
- raise ValueError("type:{} is not supported!".format(type_name))
- return metric_dict[type_name]()
-
- def mape(self):
- """
- 平均绝对误差比例
- :return: 误差率 float
- """
- return np.mean(np.abs((self._y - self._yhat) / self._y))
-
- def wmape(self):
- """
- 加权平均绝对误差比例
- :return:误差率 float
- """
- return np.sum(np.abs(self._y - self._yhat)) / np.sum(self._y)
-
- def acc_range_percentage(self, range_start, range_end):
- """
- 区间误差占比
- :param range_start: 区间起始点
- :param range_end: 区间结束点
- :return: 误差占比
- """
- # 验证参数
- if not (isinstance(range_start, float) and isinstance(range_end, float)):
- raise TypeError("range_start and range_end type should be float!")
- err = np.abs((self._y - self._yhat) / self._y)
- a = 0.
- for i in range(len(err)):
- if err[i] >= range_start and err[i] <= range_end:
- a = a + 1.
- return a / len(err)
-
- def smape(self):
- """
- 对称的均绝对值百分比
- :return: 误差百分比
- """
- return np.mean(2 * np.abs(self._y - self._yhat) / (np.abs(self._y) + np.abs(self._yhat)))
-
- def mse(self):
- """
- 均方误差 Mean Squared Error
- :return: 均方误差
- """
- return mean_squared_error(self._y, self._yhat)
-
- def rmse(self):
- """
- 均方根误差 Roots Mean Squared Error
- :return: 均方误差
- """
- return np.sqrt(mean_squared_error(self._y, self._yhat))
-
- def mae(self):
- """
- 均绝对误差 Mean Absolute Error
- :return: 均绝对误差
- """
- return mean_absolute_error(self._y, self._yhat)
-
- def msle(self):
- """
- 均方log误差 Mean Squared Log Error
- :return: 均方log误差
- """
- return mean_squared_log_error(self._y, self._yhat)
-
- def r2(self):
- """
- R squared
- :return: r2值
- """
- return r2_score(self._y, self._yhat)
-
- def sigma(self):
- """
- 残差的标准差
- :return: 标准差
- """
- return np.std(self._y - self._yhat)
|