我知道我可以像这样实现一个均方根误差函数:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
如果这个RMSE函数已经在某个库中实现了,比如说scipy或者scikit-learn,我是希望能够找到它的。
我知道我可以像这样实现一个均方根误差函数:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
如果这个RMSE函数已经在某个库中实现了,比如说scipy或者scikit-learn,我是希望能够找到它的。
sklearn >= 0.22.0
sklearn.metrics
有一个mean_squared_error
函数,其中包含一个名为squared
的参数(默认值为True
)。将squared
设置为False
将返回RMSE。
from sklearn.metrics import mean_squared_error
rms = mean_squared_error(y_actual, y_predicted, squared=False)
sklearn < 0.22.0
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的'squared'参数似乎是一个误导性的名称,因为我们仍然在进行平方运算,只是加上了根号而已。在我看来,更准确的参数名称应该是'root'布尔值,这样你可以让函数知道是否要取根号。我错了吗?
- THIS USER NEEDS HELP如果您理解RMSE(均方根误差)、MSE(均方误差)、RMD(均方根偏差)和RMS(均方根),那么要求一个库来为您计算这些是不必要的过度工程。所有这些都可以直观地写成一行代码。rmse、mse、rmd和rms是同一件事的不同名称。
RMSE回答了这个问题:“list1
中的数字与list2
中的数字平均相似吗?”这两个列表必须具有相同的大小。消除任何两个给定元素之间的噪声,消除收集的数据大小,并获得单个数字结果。
想象一下,您正在学习向飞镖靶投掷飞镖。每天你练习一个小时。你想弄清楚自己是变得更好还是变得更糟。所以每天你会投10次并测量靶心和你的飞镖命中位置之间的距离。
你需要制作一个数字列表list1
,并使用在第一天与一个全零的list2
之间距离的均方根误差来计算。在第二天和第n天进行相同的操作。你会得到一个单一的数字,希望随着时间的推移逐渐减少。当RMSE值为零时,你每次都命中靶心。如果RMSE值上升,则说明越来越糟糕。
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
n
是表示掷骰子的正整数,i
表示列举总和的正整数计数器,d
代表理想距离,即上面示例中包含所有零的list2
。 p
代表性能,即上面示例中的list1
。上标2代表数字平方。 di是d
的第i个索引。 pi是p
的第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 ^
从一个数字中减去另一个数字可以得到它们之间的距离。
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
mean_squared_error()
传递参数squared=False
以返回RMSE。from sklearn.metrics import mean_squared_error
mean_squared_error(y_actual, y_predicted, squared=False)
这也许更快?:
n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)
sklearn的mean_squared_error
函数本身包含一个名为squared
的参数,默认值为True
。如果我们将其设置为False
,同一个函数将返回RMSE而不是MSE。
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred , squared=False)
在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
中不可用,比如mapk
。
参考文献:
或者仅使用NumPy函数:
def rmse(y, y_pred):
return np.sqrt(np.mean(np.square(y - y_pred)))
其中:
请注意,由于平方函数,rmse(y, y_pred)==rmse(y_pred, y)
。
是的,这是由SKLearn提供的,我们只需要在参数中提到squared = False
from sklearn.metrics import mean_squared_error
mean_squared_error(y_true, y_pred, squared=False)
from sklearn import metrics
import numpy as np
print(np.sqrt(metrics.mean_squared_error(y_test,y_predict)))
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))
.mean()
,但写成了.sum()
。此外,我认为这个函数被使用得如此频繁,没有理由不将其作为库函数供人使用。 - siamiipredictions
和targets
的类型例如为int16
,则平方可能会溢出(产生负数)。因此,在使用平方之前,您可能需要使用.astype('int')
或.astype('double')
,例如np.sqrt(((predictions - targets).astype('double') ** 2).mean())
。 - John