回归任务评价指标的主要作用在于量化模型预测结果与真实数值之间的拟合程度和误差程度,从而帮助评估和比较不同模型的性能
1. 评价指标具体作用
- 模型选择和比较: 评价指标可以用于比较不同回归模型的性能,帮助选择最适合特定任务的模型
- 性能评估: 通过评价指标,可以量化模型的预测准确度和误差水平,从而了解模型在解决问题时的表现如何
- 超参数调优: 在模型训练过程中,评价指标可以作为超参数调优的依据,帮助选择最优的超参数组合
- 问题诊断: 评价指标可以帮助识别模型存在的问题,例如过拟合、欠拟合或者其他性能瓶颈,从而指导进一步的改进和优化
回归任务评价指标是对模型性能进行量化和客观评估的重要工具,对于指导模型选择、优化和应用具有重要意义
2 . 回归任务常见评价指标
2.1 数据生成
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例数据
np.random.seed(0)
n_samples = 1000
X = np.random.rand(n_samples) * 10
y_true = 2 * X + 1 + np.random.randn(n_samples)
# 假设这是模型预测结果,加入一些随机噪声
y_pred = 2 * X + 1 + np.random.normal(scale=2, size=n_samples)
# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(X, y_true, label='Actual')
plt.scatter(X, y_pred, color='red', label='Predicted')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Actual vs Predicted')
plt.legend()
plt.show()
模拟生成预测值、真实值为后续计算各指标提供数据
2.2 均方误差MSE
2.2.1 均方误差MSE公式
均方误差(MSE)是回归任务中最常用的评价指标之一,用于衡量模型预测值与真实值之间的平均偏差的平方,其公式如下:
其中, 是样本数量, 是第 个样本真实值, 是模型预测值
2.2.2 均方误差MSE特点
- 异常值敏感性: MSE对异常值敏感,因为它是平方误差的均值,因此较大的误差将会受到较大的权重。在某些场景下,如果数据集中存在异常值,可能会导致MSE偏向于受到异常值的影响
- 数值稳定性: 由于MSE计算的是误差的平方,因此可以避免正负误差相互抵消的情况,从而更稳定地评估模型的性能
2.2.3 代码实现
from sklearn.metrics import mean_squared_error
# 计算均方误差(MSE)
mse = mean_squared_error(y_true, y_pred)
print(f"使用库计算的均方误差(MSE): {mse}")
# 手动定义函数计算均方误差(MSE)
def calculate_mse(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
# 计算均方误差(MSE)
mse_manual = calculate_mse(y_true, y_pred)
print(f"根据公式手动计算的均方误差(MSE): {mse_manual}")
2.3 均方根误差RMSE
2.3.1 均方根误差RMSE公式
均方根误差(RMSE)是均方误差(MSE)的平方根,用于衡量模型预测值与真实值之间的平均偏差的大小,其公式如下:
其中,
是样本数量,
是第
个样本真实值,
是模型预测值
2.3.2 均方根误差RMSE 特点
- 对大误差更敏感: 由于RMSE是MSE的平方根,因此对于较大的误差会施加更大的惩罚,使得模型对预测误差更为敏感
- 数值稳定: 与MSE相比,RMSE更加稳定,因为它取了误差的平方根,可以避免正负误差相互抵消
- 受异常值影响较小: 由于RMSE对误差的平方根进行计算,使得其对异常值的影响相对于MSE来说更小一些
2.3.3 代码实现
from sklearn.metrics import mean_squared_error
# 计算均方根误差(RMSE)
rmse = mean_squared_error(y_true, y_pred, squared=False)
print(f"使用库计算的均方根误差(RMSE): {rmse}")
# 手动定义函数计算均方根误差(RMSE)
def calculate_rmse(y_true, y_pred):
return np.sqrt(np.mean((y_true - y_pred) ** 2))
# 计算均方根误差(RMSE)
rmse_manual = calculate_rmse(y_true, y_pred)
print(f"根据公式手动计算的均方根误差(RMSE): {rmse_manual}")
2.4 平均绝对误差MAE
2.4.1 平均绝对误差MAE公式
平均绝对误差(MAE)是衡量模型预测值与真实值之间差异的绝对值的均值,其公式如下:
其中,
是样本数量,
是第
个样本真实值,
是模型预测值
2.4.2 平均绝对误差MAE 特点
- 鲁棒性强: MAE对异常值不敏感,因为它是误差的绝对值的均值,不受误差的正负影响
- 平均性质: MAE是误差的绝对值的均值,因此可以提供对模型预测误差的平均量化度量
- 无平方项: 与MSE和RMSE不同,MAE不涉及平方项,因此不会放大较大误差的影响,对于模型的评价更为平稳
- 缺乏梯度信息: MAE在数学上不具备连续可微的特性,这意味着在使用梯度下降等优化算法时可能会出现一些限制
2.4.3 代码实现
from sklearn.metrics import mean_absolute_error
# 计算平均绝对误差(MAE)
mae = mean_absolute_error(y_true, y_pred)
print(f"使用库计算的平均绝对误差(MAE): {mae}")
# 手动定义函数计算平均绝对误差(MAE)
def calculate_mae(y_true, y_pred):
return np.mean(np.abs(y_true - y_pred))
# 计算平均绝对误差(MAE)
mae_manual = calculate_mae(y_true, y_pred)
print(f"根据公式手动计算的平均绝对误差(MAE): {mae_manual}")
2.5 平均绝对百分比误差MAPE
2.5.1 平均绝对百分比误差MAPE公式
平均绝对百分比误差(MAPE)是衡量预测值与真实值之间的误差百分比的平均值,其公式如下:
其中,
是样本数量,
是第
个样本真实值,
是模型预测值
2.5.2 平均绝对百分比误差MAPE 特点
- 百分比误差度量: MAPE计算了预测值与真实值之间的相对误差百分比,使得其更具有可解释性
- 异常值敏感性: MAPE对于相对较小的真实值可能会产生较大的误差,因此在存在极端异常值时可能会失真
- 分母为零风险: 如果真实值为零,MAPE的分母为零,可能导致无法计算或者误差失真的问题
2.5.3 代码实现
from sklearn.metrics import mean_absolute_percentage_error
# 计算 MAPE
mape = mean_absolute_percentage_error(y_true, y_pred)
print(f"使用库计算的 MAPE:{mape}")
# 手动定义函数计算 MAPE
def calculate_mape(y_true, y_pred):
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
# 计算 MAPE
mape_manual = calculate_mape(y_true, y_pred)
print(f"手动计算的 MAPE:{mape_manual}")
2.6 R平方R-squared
2.6.1 R平方R-squared 公式
R平方(R-squared)是一种常用的回归任务评价指标,用于衡量模型对数据方差的解释程度。其公式如下:
其中
和
分别为残差平方和和总平方和的缩写,定义为:
其中,
是样本数量,
是第
个样本真实值,
是模型预测值, 是样本平均值
注意:普遍的误解
是不能是负数。虽然
不能大于1(因为不能做得比完美预测更好) ,但它的负值没有限制。这仅仅是因为与实际的估计器相比,回归器的表现没有限制。一旦
(可以认为是经过训练的回归因子的表现比实际的回归因子
差) ,
将为负值
2.6.2 R平方R-squared 特点
- 拟合程度衡量: R平方衡量了模型对数据方差的解释程度,即模型所能解释的数据变异性比例。当R平方接近1时,说明模型对数据的拟合程度较好;当R平方接近0时,说明模型对数据的拟合程度较差
- 无单位: R平方是一个相对指标,没有具体的单位,使得其更加方便进行比较和解释
- 适用性: R平方通常用于评估线性回归模型的性能,但也可应用于其他回归模型。然而,对于非线性关系或者其他复杂情况,R平方的解释可能存在局限性
- 可能过拟合: 当模型过于复杂时,R平方可能过高,导致对数据的过度拟合,因此在解释和应用R平方时需要谨慎
2.6.3 代码实现
from sklearn.metrics import r2_score
# 计算 R 平方
r_squared = r2_score(y_true, y_pred)
print(f"使用库计算的R 平方(R-squared): {r_squared}")
# 手动计算 R 平方
def calculate_r_squared(y_true, y_pred):
mean_y_true = np.mean(y_true)
total_sum_of_squares = np.sum((y_true - mean_y_true) ** 2)
residual_sum_of_squares = np.sum((y_true - y_pred) ** 2)
r_squared = 1 - (residual_sum_of_squares / total_sum_of_squares)
return r_squared
# 计算 R 平方
r_squared_manual = calculate_r_squared(y_true, y_pred)
print(f"手动计算的 R 平方(R-squared): {r_squared_manual}")
3. 往期推荐
基于VMD分解的VMD-LSTM时间序列预测模型实现,大力提升预测精度!
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~