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

时间:2013-06-19 17:24:11

标签: python scikit-learn scipy

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

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

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

13 个答案:

答案 0 :(得分:154)

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

答案 1 :(得分:93)

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

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

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

RMSE的Intuition和ELI5:

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

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

数学符号:

enter image description here

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

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

但是等一下,我们早些时候将他们平仓以迫使他们积极。用平方根修复伤害!

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

如果RMSE值随着时间的推移而下降,我们很高兴,因为variance正在减少。

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

均方根误差测量点与线之间的垂直距离,因此如果您的数据形状像香蕉,靠近底部平坦并且靠近顶部陡峭,那么RMSE将向高点报告更远的距离,但是实际距离相等时,距离点很短。这会引起偏斜,使得线更倾向于接近高于低的点。

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

可以破坏此RMSE功能的问题:

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

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

RMSE对不属于

的异常值数据点具有零容忍度

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

答案 2 :(得分:28)

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

答案 3 :(得分:19)

这可能更快?:

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

答案 4 :(得分:6)

您无法直接在SKLearn中找到RMSE功能。 但是,除了手动执行sqrt之外,还有另一种使用sklearn的标准方法。 显然,Sklearn的mean_squared_error本身包含一个名为“ squared”的参数,默认值为true。如果将其设置为false,则该函数将返回RMSE而不是MSE。

# code changes implemented by Esha Prakash
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred , squared=False)

答案 5 :(得分:2)

实际上,我确实写了很多作为statsmodels的实用函数

http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures

http://statsmodels.sourceforge.net/devel/generated/statsmodels.tools.eval_measures.rmse.html#statsmodels.tools.eval_measures.rmse

大多数是一个或两个衬里,并没有太多的输入检查,主要是为了在比较数组时轻松获取一些统计信息。但是他们对轴参数进行了单元测试,因为这是我有时会犯错误的地方。

答案 6 :(得分:1)

以防万一有人在2019年发现此线程,有一个名为return items.Select(i => new { i.Name, i.Username, ... Countries = i.Countries.Select(c => new { c.CountryId, c.CountryName, ... } }; 的库,无需预先安装就可以在Kaggle的内核中使用,它非常轻巧,可以通过ml_metrics访问(可以轻松安装)并使用pypi来快速):

pip install ml_metrics

它还有一些其他有趣的指标,例如from ml_metrics import rmse rmse(actual=[0, 1, 2], predicted=[1, 10, 5]) # 5.507570547286102 sklearn中不可用。

参考文献:

答案 7 :(得分:1)

from sklearn import metrics              
import numpy as np
print(np.sqrt(metrics.mean_squared_error(y_test,y_predict)))

答案 8 :(得分:1)

from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_actual, y_predicted, squared=False)

or 

import math
from sklearn.metrics import mean_squared_error
rmse = math.sqrt(mean_squared_error(y_actual, y_predicted))

答案 9 :(得分:0)

这是一个示例代码,用于计算两种多边形文件格式PLY之间的RMSE。它同时使用ml_metrics库和np.linalg.norm

import sys
import SimpleITK as sitk
from pyntcloud import PyntCloud as pc
import numpy as np
from ml_metrics import rmse

if len(sys.argv) < 3 or sys.argv[1] == "-h" or sys.argv[1] == "--help":
    print("Usage: compute-rmse.py <input1.ply> <input2.ply>")
    sys.exit(1)

def verify_rmse(a, b):
    n = len(a)
    return np.linalg.norm(np.array(b) - np.array(a)) / np.sqrt(n)

def compare(a, b):
    m = pc.from_file(a).points
    n = pc.from_file(b).points
    m = [ tuple(m.x), tuple(m.y), tuple(m.z) ]; m = m[0]
    n = [ tuple(n.x), tuple(n.y), tuple(n.z) ]; n = n[0]
    v1, v2 = verify_rmse(m, n), rmse(m,n)
    print(v1, v2)

compare(sys.argv[1], sys.argv[2])

答案 10 :(得分:0)

或仅使用NumPy函数:

def rmse(y, y_pred):
    return np.sqrt(np.mean(np.square(y - y_pred)))

位置:

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

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

答案 11 :(得分:0)

  1. 否,有一个用于机器学习的 Scikit学习库 ,可以使用Python语言轻松地使用它。它具有均方误差的功能,我在下面共享以下链接:

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html

  1. 该函数被命名为mean_squared_error,如下所示,其中y_true是数据元组的真实类值,y_pred是预测值,由您使用的机器学习算法预测:

mean_squared_error(y_true,y_pred)

  1. 您必须对其进行修改以获取RMSE(通过使用Python的sqrt函数)。此过程在此链接中进行了描述: https://www.codeastar.com/regression-model-rmsd/

因此,最终代码如下:

从sklearn.metrics

导入mean_squared_error 从数学导入sqrt

RMSD = sqrt(均方误差(testing_y,预测))

打印(RMSD)

答案 12 :(得分:-1)

from sklearn import metrics
import bumpy as np
print(no.sqrt(metrics.mean_squared_error(actual,predicted)))