【机器学习】12种回归评价指标

你是否曾经遇到各种评价指标而不知道含义?或者不知道如何使用Numpy进行计算?在本文我们将介绍常见的回归评价指标,并包含公式和Numpy计算代码。

Mean Absolute Error,MAE

平均绝对误差(Mean Absolute Error,MAE),也称为 L1 损失,是最简单的损失函数之一,也是一种易于理解的评估指标。它是通过取预测值和实际值之间的绝对差值并在整个数据集中取平均值来计算的。从数学上讲,它是绝对误差的算术平均值。MAE 仅测量误差的大小,不关心它们的方向。MAE越低,模型的准确性就越高。

优点:

  • 由于采用了绝对值,因此所有误差都以相同的比例加权。

  • 如果训练数据有异常值,MAE 不会惩罚由异常值引起的高错误。

  • 它提供了模型执行情况的平均度量。

缺点:

  • 有时来自异常值的大错误最终被视为与低错误相同。

  • 在零处不可微分。许多优化算法倾向于使用微分来找到评估指标中参数的最佳值。在 MAE 中计算梯度可能具有挑战性。

def mean_absolute_error(true, pred):
    abs_error = np.abs(true - pred)
    sum_abs_error = np.sum(abs_error)
    mae_loss = sum_abs_error / true.size
    return mae_loss

Mean Bias Error (MBE)

平均偏差误差是测量过程高估或低估参数值的趋势。偏差只有一个方向,可以是正的,也可以是负的。正偏差意味着数据的误差被高估,负偏差意味着误差被低估。平均偏差误差 是预测值与实际值之差的平均值。该评估指标量化了总体偏差并捕获了预测中的平均偏差。它几乎与 MAE 相似,唯一的区别是这里没有取绝对值。这个评估指标应该小心处理,因为正负误差可以相互抵消。

优点:

  • 想检查模型的方向(即是否存在正偏差或负偏差)并纠正模型偏差,MBE 是一个很好的衡量标准。

缺点:

  • 就幅度而言,这不是一个好的衡量标准,因为误差往往会相互补偿。

  • 它的可靠性不高,因为有时高个体错误会产生低MBE。

  • 作为一种评估指标,它在一个方向上可能始终是错误的。

def mean_bias_error(true, pred):
    bias_error = true - pred
    mbe_loss = np.mean(np.sum(diff) / true.size)
    return mbe_loss

Relative Absolute Error (RAE)

相对绝对误差是通过将总绝对误差除以平均值和实际值之间的绝对差来计算的。RAE并以比率表示。RAE的值从0到1。一个好的模型将具有接近于零的值,其中零是最佳值。

优点:

  • RAE 可用于比较以不同单位测量误差的模型。

  • RAE 是可靠的,因为它可以防止异常值。

def relative_absolute_error(true, pred):
    true_mean = np.mean(true)
    squared_error_num = np.sum(np.abs(true - pred))
    squared_error_den = np.sum(np.abs(true - true_mean))
    rae_loss = squared_error_num / squared_error_den
    return rae_loss

Mean Absolute Percentage Error (MAPE)

平均绝对百分比误差是通过将实际值与预测值之间的差值除以实际值来计算的。MAPE 也称为平均绝对百分比偏差,随着误差的增加而线性增加。MAPE 越小,模型性能越好。

优点:

  • MAPE与变量的规模无关,因为它的误差估计是以百分比为单位的。

  • 所有错误都在一个共同的尺度上标准化,很容易理解。

  • MAPE避免了正值和负值相互抵消的问题。

缺点:

  • 分母值为零时,面临着“除以零”的问题。

  • MAPE对数值较小的误差比对数值大的误差错误的惩罚更多。

  • 因为使用除法运算,所欲对于相同的误差,实际值的变化将导致损失的差异。

def mean_absolute_percentage_error(true, pred):
    abs_error = (np.abs(true - pred)) / true
    sum_abs_error = np.sum(abs_error)
    mape_loss = (sum_abs_error / true.size) * 100
    return mape_loss

Mean Squared Error (MSE)

均方误差也称为 L2 损失,MSE通过将预测值和实际值之间的差平方并在整个数据集中对其进行平均来计算误差。MSE 也称为二次损失,因为惩罚与误差不成正比,而是与误差的平方成正比。平方误差为异常值赋予更高的权重,从而为小误差产生平滑的梯度。

MSE 永远不会是负数,因为误差是平方的。误差值范围从零到无穷大。MSE 随着误差的增加呈指数增长。一个好的模型的 MSE 值接近于零。

优点:

  • MSE会得到一个只有一个全局最小值的梯度下降。

  • 对于小的误差,它可以有效地收敛到最小值。没有局部最小值。

  • MSE 通过对模型进行平方来惩罚具有巨大错误的模型。

缺点:

  • 对异常值的敏感性通过对它们进行平方来放大高误差。

  • MSE会受到异常值的影响,会寻找在整体水平上表现足够好的模型。

def mean_squared_error(true, pred):
    squared_error = np.square(true - pred) 
    sum_squared_error = np.sum(squared_error)
    mse_loss = sum_squared_error / true.size
    return mse_loss

Root Mean Squared Error (RMSE)

RMSE 是通过取 MSE 的平方根来计算的。RMSE 也称为均方根偏差。它测量误差的平均幅度,并关注与实际值的偏差。RMSE 值为零表示模型具有完美拟合。RMSE 越低,模型及其预测就越好。

优点:

  • 易于理解,计算方便

缺点:

  • 建议去除异常值才能使其正常运行。

  • 会受到数据样本大小的影响。

def root_mean_squared_error(true, pred):
    squared_error = np.square(true - pred) 
    sum_squared_error = np.sum(squared_error)
    rmse_loss = np.sqrt(sum_squared_error / true.size)
    return rmse_loss

Relative Squared Error (RSE)

相对平方误差需要使用均方误差并将其除以实际数据与数据平均值之间的差异的平方。

优点

  • 对预测的平均值和规模不敏感。

def relative_squared_error(true, pred):
    true_mean = np.mean(true)
    squared_error_num = np.sum(np.square(true - pred))
    squared_error_den = np.sum(np.square(true - true_mean))
    rse_loss = squared_error_num / squared_error_den
    return rse_loss

Normalized Root Mean Squared Error (NRMSE)

归一化 RMSE 通常通过除以一个标量值来计算,它可以有不同的方式。有时选择四分位数范围可能是最好的选择,因为其他方法容易出现异常值。当您想要比较不同因变量的模型或修改因变量时,NRMSE 是一个很好的度量。它克服了尺度依赖性,简化了不同尺度模型甚至数据集之间的比较。

RMSE / maximum value in the series
RMSE / mean
RMSE / difference between the maximum and the minimum values (if mean is zero)
RMSE / standard deviation
RMSE / interquartile range
def normalized_root_mean_squared_error(true, pred):
    squared_error = np.square((true - pred))
    sum_squared_error = np.sum(squared_error)
    rmse = np.sqrt(sum_squared_error / true.size)
    nrmse_loss = rmse/np.std(pred)
    return nrmse_loss

Relative Root Mean Squared Error (RRMSE)

RRMSE 是 RMSE 的无量纲形式,是由均方根值归一化的均方根误差,其中每个残差都根据实际值进行缩放。

Excellent when RRMSE < 10%
Good when RRMSE is between 10% and 20%
Fair when RRMSE is between 20% and 30%
Poor when RRMSE > 30%
def relative_root_mean_squared_error(true, pred):
    num = np.sum(np.square(true - pred))
    den = np.sum(np.square(pred))
    squared_error = num/den
    rrmse_loss = np.sqrt(squared_error)
    return rrmse_loss

Root Mean Squared Logarithmic Error (RMSLE)

均方根对数误差是通过将 log 应用于实际值和预测值然后取它们的差异来计算的。RMSLE 对于小误差和大误差被均匀处理的异常值是稳健的。如果预测值小于实际值,则对模型进行更多的惩罚,而如果预测值大于实际值,则对模型进行较少的惩罚。

优点:

  • 不依赖于比例,并且适用于各种比例。

  • 它不受大异常值的影响。

  • 它只考虑实际值和预测值之间的相对误差。

def root_mean_squared_log_error(true, pred):
    square_error = np.square((np.log(true + 1) - np.log(pred + 1)))
    mean_square_log_error = np.mean(square_error)
    rmsle_loss = np.sqrt(mean_square_log_error)
    return rmsle_loss

Huber Loss

Huber损失是线性和二次评分方法的组合。它有一个超参数 delta,可以根据数据进行调整。对于高于 delta 的值,损失将是线性的(L1 损失),对于低于 delta 的值,损失将是二次的(L2 损失)。它平衡并结合了 MAE(平均绝对误差)和 MSE(均方误差)的良好特性。

优点:

  • 它在零处是可微的。

  • 由于 delta 以上的线性度,异常值得到了正确处理。

  • 可以调整超参数delta以最大限度地提高模型准确性。

缺点:

  • 为了最大限度地提高模型精度,需要优化delta,这是一个迭代过程。

  • 它只能微分一次。

def huber_loss(true, pred, delta):
    huber_mse = 0.5 * np.square(true - pred)
    huber_mae = delta * (np.abs(true - pred) - 0.5 * (np.square(delta)))
    return np.where(np.abs(true - pred) <= delta, huber_mse, huber_mae)

Log Cosh Loss

Log cosh 计算误差的双曲余弦的对数。这个函数比二次损失更平滑。它像 MSE 一样工作,但不受大预测误差的影响。

优点:

  • 同时处处可二次微分

  • 比 Huber需要更少的计算

缺点:

  • 适应性较差,因为它遵循固定的比例。

  • 与Huber loss相比,推导更复杂,需要深入研究。

def huber_loss(true, pred, delta):
    diff = np.cosh(pred - delta)
    diff = np.log(diff)
    return diff.mean()

Quantile Loss

分位数回归损失函数用于预测分位数。分位数是确定组中有多少值低于或高于某个限制的值。它跨预测变量(自变量)的值估计响应变量(因变量)的条件中位数或分位数。

 
 

b2568c3222d6194e5e055dd118ab7b1b.jpeg

 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型的评价指标可以分为分类模型和回归模型两类。 ## 分类模型评价指标 ### 混淆矩阵 混淆矩阵是分类模型评价中最基本的指标,它用于描述分类模型预测结果和真实结果之间的关系。可以用以下代码实现混淆矩阵的可视化: ```python import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import confusion_matrix def plot_confusion_matrix(y_true, y_pred, classes, normalize=False, cmap=plt.cm.Blues): cm = confusion_matrix(y_true, y_pred) if normalize: cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title('Confusion matrix') plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) fmt = '.2f' if normalize else 'd' thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), horizontalalignment="center", color="white" if cm[i, j] > thresh else "black") plt.tight_layout() plt.ylabel('True label') plt.xlabel('Predicted label') ``` ### 准确率 准确率是分类模型评价中最常用的指标,用于衡量模型预测正确的样本占总样本数量的比例。可以用以下代码实现准确率的计算和可视化: ```python from sklearn.metrics import accuracy_score def plot_accuracy(y_true, y_pred): acc = accuracy_score(y_true, y_pred) plt.figure(figsize=(4, 4)) plt.title('Accuracy: {:.2%}'.format(acc)) sns.heatmap(confusion_matrix(y_true, y_pred), square=True, annot=True, fmt='d', cbar=False) ``` ### 精确率、召回率和 F1 值 精确率是指模型预测为正例的样本中,真正为正例的样本占比;召回率是指真正为正例的样本中,被模型预测为正例的样本占比;F1 值是精确率和召回率的调和平均数。可以用以下代码实现精确率、召回率和 F1 值的计算和可视化: ```python from sklearn.metrics import precision_score, recall_score, f1_score def plot_precision_recall_f1(y_true, y_pred): precision = precision_score(y_true, y_pred) recall = recall_score(y_true, y_pred) f1 = f1_score(y_true, y_pred) plt.figure(figsize=(4, 4)) plt.title('Precision: {:.2%}, Recall: {:.2%}, F1 Score: {:.2%}'.format(precision, recall, f1)) sns.heatmap(confusion_matrix(y_true, y_pred), square=True, annot=True, fmt='d', cbar=False) ``` ## 回归模型评价指标 ### 均方误差和均方根误差 均方误差是回归模型评价中最常用的指标之一,用于衡量模型预测值与真实值之间的差异。均方根误差是均方误差的平方根。可以用以下代码实现均方误差和均方根误差的计算和可视化: ```python from sklearn.metrics import mean_squared_error def plot_mse_rmse(y_true, y_pred): mse = mean_squared_error(y_true, y_pred) rmse = np.sqrt(mse) plt.figure(figsize=(4, 4)) plt.title('MSE: {:.2f}, RMSE: {:.2f}'.format(mse, rmse)) plt.scatter(y_true, y_pred, alpha=0.5) plt.plot([y_true.min(), y_true.max()], [y_true.min(), y_true.max()], 'k--') plt.xlabel('True Values') plt.ylabel('Predictions') ``` ### R2 值 R2 值是回归模型评价中最常用的指标之一,用于衡量模型解释数据方差的能力,取值范围为 0 到 1。可以用以下代码实现 R2 值的计算和可视化: ```python from sklearn.metrics import r2_score def plot_r2(y_true, y_pred): r2 = r2_score(y_true, y_pred) plt.figure(figsize=(4, 4)) plt.title('R2 Score: {:.2%}'.format(r2)) plt.scatter(y_true, y_pred, alpha=0.5) plt.plot([y_true.min(), y_true.max()], [y_true.min(), y_true.max()], 'k--') plt.xlabel('True Values') plt.ylabel('Predictions') ``` 以上是一些常用的机器学习模型评价指标及可视化代码,可以根据实际需求进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值