Python中的均方根误差

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

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

我正在寻找什么,如果这个rmse函数是在一个库中实现的,也许在scipy或scikit学习?

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或RMS。 它解决了什么问题?

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

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

直觉和ELI5的RMSE:

想象一下,你正在学习在飞镖上掷飞镖。 你每天练习一个小时。 你想弄清楚你是越来越好还是越来越糟糕。 所以你每天要做10次投掷,测量你的飞镖击中的距离。

你列出这些数字。 使用第1天的距离和包含全零的列表之间的均方根误差。 第2天和第n天也一样。 你会得到一个单一的数字,希望随着时间的推移而减less。 当您的RMSE数字为零时,您每次都会触发Bullseyes。 如果这个数字上升,你会越来越糟。

在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 

math符号:

在这里输入图像描述

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 

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

不过,等一下,我们早一点把他们平分,强迫他们积极。 用平方根撤消伤害!

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

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

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

均方根误差测量点与线之间的垂直距离,因此如果您的数据形状像香蕉,靠近底部并靠近顶部陡峭,那么RMSE将报告更高的距离到点高,但距离事实上这些距离是相等的。 这会导致线偏好接近高点的偏差。

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

可能会破坏这个RMSEfunction的问题:

如果在input列表中有零点或无穷大,那么输出rmse值就没有意义了。 有三种策略可以处理任一列表中的空值/缺失值/无穷大:忽略该分量,将其归零,或为所有时间步长添加最佳猜测或均匀随机噪声。 每种补救措施的优点和缺点取决于你的数据的含义。 一般情况下,忽略任何缺less值的组件是首选,但是这会使RMSE偏向零,这使得您认为在实际情况下性能得到改善。 如果有很多缺失的值,那么在最佳猜测上添加随机噪声可能是首选。

为了保证RMSE输出的相对正确性,您必须消除input中的所有零点/无限点。

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

均方根误差平方根据所有的数据是正确的,所有的数据都是相等的。 这意味着在左场出现的一个stream浪点将会完全毁掉整个计算。 为了处理exception数据点并且在一定的阈值之后消除它们的巨大影响,参见构build用于解除exception值的阈值的鲁棒估计器。

这可能更快?

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

实际上,我确实为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

大多数是一两行,input检查也不多,主要用于比较数组。 但是他们对于轴的参数进行了unit testing,因为那是我有时犯了一些马虎的错误。