python中的均方误差

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1522)

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

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

如果这个rmse函数是在某个地方的库中实现的,我想要找的是什么--学习吗?

提问于
用户回答回答于

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

如果您理解rmse:(根均方误差)、mse:(均方误差)和rms:(根均方误差),那么请求一个库来计算它是不必要的。所有这些指标都是一行最多2英寸长的python代码。这三种度量标准rmse、mse和rms在概念上都是相同的。

RMSE回答了这个问题:“列表1到列表2中的数字平均有多相似?”。这两个列表必须大小相同。我想“洗掉任何两个给定元素之间的噪音,洗掉收集到的数据的大小,并得到一个数字随着时间的推移而变化的感觉”。

RMSE的直觉和ELI 5:

想象一下,你正在学习向飞镖板扔飞镖。每天练习一个小时。你想弄清楚你是在变好还是在变坏。所以每天你投10次球,测量牛眼和你的飞镖击中的地方之间的距离。

你把这些数字列出来。使用第一天距离与包含所有零的列表之间的均方误差。在第第二天和第9天也要这样做。你会得到一个单一的数字,希望随着时间的推移而减少。当你的RMSE数为零时,你每次都会按斗牛键。如果这个数字上升,你会变得更糟。

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

import numpy as np
d = [0.000, 0.166, 0.333]
p = [0.000, 0.254, 0.998]

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

数学符号:

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 root_of_of_the_mean_of_the_differences_squared     #get the ^

RMSE的每一步是如何工作的:

从另一个数字中减去一个数字,你就会知道它们之间的距离。

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

如果将任何数字乘以本身,结果总是为正,因为负数是正的:

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

将它们全部加起来,但是等待,那么一个包含多个元素的数组会比一个小数组有更大的错误,所以按元素的数量将它们平均起来。

但是等等,我们早些时候对它们进行了平方,以迫使它们是正面的。用平方根解除伤害!

这就只剩下一个数字,它平均表示list 1的每个值到它对应的元素列表2之间的距离。

如果rmse值随时间下降,我们很高兴,因为方差正在减少。

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

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

如果这是一个问题,则用总最小二乘方法修正如下:...

这会破坏RMSE函数:

如果输入列表中都有空值或无穷大,那么输出rmse值就没有意义了。在这两个列表中,都有三种策略来处理空值/缺失值/无穷大:忽略该组件,将其归零,或在所有时间步骤中添加最佳猜测或统一的随机噪声。每种治疗方法都有其优缺点,取决于数据的含义。通常,忽略任何缺少值的组件都是首选的,但这会使RMSE偏向于零,从而使您认为性能在没有真正改善的情况下得到了改善。如果存在大量的缺失值,可以在最佳猜测的基础上添加随机噪声。

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

RMSE对不属于的离群数据点具有零容忍度。

根均方误差平方依赖于所有数据是否正确,并且所有数据都被计算为相等。这就意味着,一个左外场的偏离点将完全破坏整个计算。要处理异常数据点并在某个阈值之后忽略它们的巨大影响,请参阅建立在一个阈值内的稳健估计器,以排除异常值。

用户回答回答于

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))

扫码关注云+社区

领取腾讯云代金券