python中是否有均方根误差(RMSE)的库函数?

2024-04-24 13:17:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我可以实现这样的均方根误差函数:

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

如果这个rmse函数是在某个库中实现的,可能是在scipy或scikit learn中实现的,我在寻找什么呢?


Tags: 函数returndefnpscipysqrtscikitmean
3条回答

sklearn.metrics有一个mean_squared_error函数。RMSE只是它返回的任何值的平方根。

from sklearn.metrics import mean_squared_error
from math import sqrt

rms = sqrt(mean_squared_error(y_actual, y_predicted))

什么是RMSE?也称为MSE、RMD或RMS。它解决了什么问题?

如果您理解RMSE:(均方根误差),MSE:(均方根误差),RMD(均方根偏差)和RMS:(均方根),那么在工程上要求一个库为您计算这个是不必要的。所有这些指标都是一行最长2英寸的python代码。rmse、mse、rmd和rms这三个度量在核心概念上是相同的。

RMSE回答了这个问题:“平均来说,list1list2中的数字有多相似?”。两个列表的大小必须相同。我想“洗去任何两个给定元素之间的噪音,洗去所收集数据的大小,并获得随时间变化的单一数字感觉”。

RMSE的直觉和ELI5:

想象一下你正在学习向飞镖板投掷飞镖。你每天练习一小时。你想知道你是在好转还是在恶化。所以每天你投10次球,测量靶心和飞镖射中的距离。

你列一张这些数字的清单list1。使用第1天距离和包含所有零的list2之间的均方根误差。在第2天和第n天也这样做。你将得到一个单一的数字,希望随着时间的推移而减少。当你的RMSE值为零时,你每次都会打靶子。如果rmse的数字上升,你会变得更糟。

在python中计算均方根误差的示例:

import numpy as np
d = [0.000, 0.166, 0.333]   #ideal target distances, these can be all zeros.
p = [0.000, 0.254, 0.998]   #your performance goes here

print("d is: " + str(["%.8f" % elem for elem in d]))
print("p is: " + str(["%.8f" % elem for elem in p]))

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

rmse_val = rmse(np.array(d), np.array(p))
print("rms error is: " + str(rmse_val))

打印内容:

d is: ['0.00000000', '0.16600000', '0.33300000']
p is: ['0.00000000', '0.25400000', '0.99800000']
rms error between lists d and p is: 0.387284994115

数学符号:

root mean squared deviation explained

Glyph Legend:n是表示抛出次数的整正整数。i表示枚举和的整正整数计数器。d表示理想距离,在上面的例子中,list2包含所有零。p表示性能,上面例子中的list1。上标2代表数值平方。did的第i个索引。pip的第i个索引。

rmse以小步骤完成,以便理解:

def rmse(predictions, targets):

    differences = predictions - targets                       #the DIFFERENCEs.

    differences_squared = differences ** 2                    #the SQUAREs of ^

    mean_of_differences_squared = differences_squared.mean()  #the MEAN of ^

    rmse_val = np.sqrt(mean_of_differences_squared)           #ROOT of ^

    return rmse_val                                           #get the ^

RMSE的每个步骤是如何工作的:

从另一个数中减去一个数,就得到了它们之间的距离。

8 - 5 = 3         #absolute distance between 8 and 5 is +3
-20 - 10 = -30    #absolute distance between -20 and 10 is +30

如果将任意数字乘以自身,则结果始终为正,因为负乘以负等于正:

3*3     = 9   = positive
-30*-30 = 900 = positive

把它们全部加起来,但是等一下,那么一个有很多元素的数组会比一个小数组有更大的错误,所以用元素的数量来平均它们。

但等一下,我们早些时候把它们都算好了。用平方根消除损坏!

这样就只剩下一个数字,它平均表示list1的每个值与其对应的list2元素值之间的距离。

如果RMSE值随时间下降,我们会很高兴,因为variance正在减少。

RMSE不是最精确的直线拟合策略,总最小二乘法是:

均方根误差测量点与直线之间的垂直距离,因此,如果数据形状像香蕉,底部平坦,顶部陡峭,则RMSE将向高点报告更大的距离,但实际上距离相等时,向低点报告短距离。这会导致线倾向于更接近高点而不是低点的倾斜。

如果这是一个问题,总最小二乘法可以解决这个问题: https://mubaris.com/posts/linear-regression

可能破坏此RMSE功能的故障:

如果输入列表中有空或无穷大,那么输出rmse值就没有意义。有三种策略可以处理任意列表中的空值/缺失值/无穷大:忽略该组件,将其归零,或向所有组件添加最佳猜测或均匀随机噪声时间步。每种补救方法都有其优缺点,具体取决于数据的含义。一般来说,最好忽略任何缺少值的组件,但这会使RMSE偏向于零,使您认为性能在实际没有改善的情况下有所提高。如果缺少很多值,则最好在最佳猜测上添加随机噪声。

为了保证RMSE输出的相对正确性,必须从输入中消除所有的空/无穷大。

RMSE对不属于

均方根误差平方依赖于所有数据的正确性,所有数据均被视为相等。这意味着在左场的一个偏离点将完全破坏整个计算。要处理离群值数据点并在某个阈值后消除它们的巨大影响,请参阅构建离群值剔除阈值的稳健估计。

这可能更快?以下内容:

n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)

相关问题 更多 >