在python中是否存在用于均方根误差(RMSE)的库函数?

sia*_*mii 129 python scipy scikit-learn

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

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*reg 181

sklearn.metricsmean_squared_error功能.RMSE只是它返回的平方根.

from sklearn.metrics import mean_squared_error
from math import sqrt

rms = sqrt(mean_squared_error(y_actual, y_predicted))
Run Code Online (Sandbox Code Playgroud)

  • `sklearn.metrics` 中的 `mean_squared_error` 现在支持额外参数:`squared` - “如果 True 返回 MSE 值,如果 False 返回 RMSE 值。” (15认同)
  • 返回 RMSE 的“squared” false 似乎是一个误导性的名称,因为我们不是还在做平方,而只是在其上加根吗?IMO,更准确的参数名称应该是“root”布尔值,以便您让函数知道您是否想要获取根。我缺少什么。 (8认同)

Eri*_*ski 112

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

如果您了解RMSE :(均方根误差),MSE :(均值平方误差)和RMS :(均方根平方),那么要求库为您计算它是不必要的过度工程.所有这些指标都是一行最多2英寸长的python代码.rmse,mse和rms这三个指标在概念上都是相同的.

RMSE回答了这个问题:"list1到list2的数字平均有多相似?".这两个列表必须大小相同.我想"清除任何两个给定元素之间的噪音,清除所收集数据的大小,并获得一个数字随时间变化的感觉".

直觉和ELI5用于RMSE:

想象一下,你正在学习在飞镖板上投掷飞镖.每天练习一小时.你想知道你是变得更好还是变得更糟.因此,每天你进行10次投掷并测量靶心与飞镖击中的距离.

您列出了这些数字.使用第1天距离与包含全零的列表之间的均方根误差.在第2天和第n天也这样做.你会得到的是一个数字,希望随着时间的推移而减少.当你的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))
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

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
Run Code Online (Sandbox Code Playgroud)

数学符号:

在此输入图像描述

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 ^
Run Code Online (Sandbox Code Playgroud)

RMSE的每一步如何运作:

从另一个数字中减去一个数字可以得到它们之间的距离.

8 - 5 = 3         #absolute distance between 8 and 5 is +3
-20 - 10 = -30    #absolute distance between -20 and 10 is +30
Run Code Online (Sandbox Code Playgroud)

如果你自己乘以任意数倍,结果总是正数,因为负数为负数是正数:

3*3     = 9   = positive
-30*-30 = 900 = positive
Run Code Online (Sandbox Code Playgroud)

将它们全部添加,但等待,然后具有许多元素的数组将比小数组具有更大的误差,因此将它们平均为元素数量.

但是等等,我们早些时候将它们加工,以迫使它们积极.用平方根修复伤害!

这会留下一个数字,平均表示list1的每个值与list2的相应元素值之间的距离.

如果RMSE值随着时间的推移而下降,我们很高兴因为方差正在减小.

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

均方根误差测量点与线之间的垂直距离,因此如果您的数据形状像香蕉,底部靠近并且靠近顶部陡峭,那么RMSE将报告更高的距离到高点,但距离很近实际上距离相等时,低点.这导致偏斜,其中线更喜欢接近高于低的点.

如果这是一个问题,总体最小二乘法修复了这个问题:https://mubaris.com/2017-09-28/linear-regression-from-scratch

可以破坏这个RMSE功能的陷阱:

如果任一输入列表中都有空值或无穷大,则输出rmse值将没有意义.在任一列表中有三种处理空值/缺失值/无穷大的策略:忽略该组件,将其归零或为所有时间步长添加最佳猜测或均匀随机噪声.每种补救措施都有其优缺点,具体取决于数据的含义.通常忽略任何具有缺失值的组件是优选的,但是这会使RMSE偏向零,这使得您认为性能已经提高了.如果存在大量缺失值,则可以优选在最佳猜测上添加随机噪声.

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

RMSE对不属于的异常数据点具有零容忍度

均方根误差平方依赖于所有正确的数据,并且所有数据都被计为相等.这意味着在左场出局的一个迷路点将完全破坏整个计算.要处理异常数据点并在某个阈值后消除它们的巨大影响,请参阅构建解除异常值阈值的稳健估算器.

  • 是的,简单的功能.但是如果你在日常使用中需要它,那么只需在某个地方提供正确的解决方案就可以了,这样你就不必每次都重新实现它; ) (3认同)

jef*_*ale 36

在 scikit-learn 0.22.0 中,您可以传递mean_squared_error()参数squared=False以返回 RMSE。

from sklearn.metrics import mean_squared_error
mean_squared_error(y_actual, y_predicted, squared=False)
Run Code Online (Sandbox Code Playgroud)

  • 这是新功能,如果我们使用它那就最好了。 (4认同)

Cok*_*kes 21

这可能更快?:

n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)
Run Code Online (Sandbox Code Playgroud)


小智 12

sklearnmean_squared_error本身包含一个squared默认值为的参数True。如果我们将其设置为False,则相同的函数将返回 RMSE 而不是 MSE。

from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred , squared=False)
Run Code Online (Sandbox Code Playgroud)


dat*_*sta 7

以防万一有人在2019年发现此线程,有一个名为的库ml_metrics,无需预先安装就可以在Kaggle的内核中使用,该库非常轻巧并且可以通过以下方式访问pypi(可以使用轻松快速地安装pip install ml_metrics):

from ml_metrics import rmse
rmse(actual=[0, 1, 2], predicted=[1, 10, 5])
# 5.507570547286102
Run Code Online (Sandbox Code Playgroud)

它还有其他一些有趣的指标sklearn,例如mapk

参考文献:


Har*_*ore 7

是的,它是由 SKLearn 提供的,我们只需要squared = False在参数中提及

from sklearn.metrics import mean_squared_error

mean_squared_error(y_true, y_pred, squared=False)
Run Code Online (Sandbox Code Playgroud)


Key*_*r00 5

或者仅使用 NumPy 函数:

def rmse(y, y_pred):
    return np.sqrt(np.mean(np.square(y - y_pred)))
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • 你是我的目标
  • y_pred 是我的预测

请注意,rmse(y, y_pred)==rmse(y_pred, y)由于平方函数。