我知道我可以实现这样一个均方根误差函数:
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中,我在寻找什么?
当前回答
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))
其他回答
这个可能更快?:
n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)
基准
对于不需要开销处理程序并且总是期望numpy数组输入的特定用例,最快的方法是手动在numpy中编写函数。更重要的是,如果频繁调用它,可以使用numba来加快速度。
import numpy as np
from numba import jit
from sklearn.metrics import mean_squared_error
%%timeit
mean_squared_error(y[i],y[j], squared=False)
445 µs ± 90.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
def euclidian_distance(y1, y2):
"""
RMS Euclidean method
"""
return np.sqrt(((y1-y2)**2).mean())
%%timeit
euclidian_distance(y[i],y[j])
28.8 µs ± 2.54 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
@jit(nopython=True)
def jit_euclidian_distance(y1, y2):
"""
RMS Euclidean method
"""
return np.sqrt(((y1-y2)**2).mean())
%%timeit
jit_euclidian_distance(y[i],y[j])
2.1 µs ± 234 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
@jit(nopython=True)
def jit2_euclidian_distance(y1, y2):
"""
RMS Euclidean method
"""
return np.linalg.norm(y1-y2)/np.sqrt(y1.shape[0])
%%timeit
jit2_euclidian_distance(y[i],y[j])
2.67 µs ± 60.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
额外注意:在我的用例中,numba在np.sqrt(((y1-y2)**2).mean()上给出的结果略有不同,但可以忽略不计,其中没有numba,结果将等于scipy结果。你自己试试。
sklearn的mean_squared_error本身包含一个参数平方,默认值为True。如果我们将其设置为False,相同的函数将返回RMSE而不是MSE。
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred , squared=False)
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))
或者只使用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)。