如何预处理数据以计算均方根对数误差?



我正在尝试计算均方根对数误差,我发现的选项很少,一种是使用 sklearn 度量:mean_squared_log_error并取其平方根

np.sqrt(mean_squared_log_error( target, predicted_y ))

但是我收到以下错误:

当目标包含负值时,不能使用均方对数误差

我还尝试了Kaggle帖子中的解决方案:

import math
#A function to calculate Root Mean Squared Logarithmic Error (RMSLE)
def rmsle(y, y_pred):
assert len(y) == len(y_pred)
terms_to_sum = [(math.log(y_pred[i] + 1) - math.log(y[i] + 1)) ** 2.0 for i,pred in enumerate(y_pred)]
return (sum(terms_to_sum) * (1.0/len(y))) ** 0.5

同样的问题,这次我收到域错误。

在同一篇帖子中,他们就负面日志问题发表了以下评论:

你是对的。您必须转换y_pred和y_test,以确保它们不带有负值。

就我而言,在预测天气温度(最初以摄氏度为单位(时,解决方案是在计算 RMSLE 之前将它们转换为开尔文度:

rmsle(data.temp_pred + 273.15, data.temp_real + 273.15)

是否有任何标准形式的使用此指标允许使用负值?

将两个数组规范化为 0 到 1 的范围

如果您使用的是scikit,则可以使用sklearn.preprocessing.minmax_scale

minmax_scale(arr, feature_range=(0,1))

在执行此操作之前,请保存 arr 的最大值和最小值。您可以取回实际值。

例如:

normalized = (value - arr.min()) / (arr.max() - arr.min()) # Illustration

没有允许负值的标准形式,因为负数的对数是未定义的。您要么必须像温度示例一样转换数据(将最低值设置为 0 并缩放(,要么考虑为什么要使用 RMSLE 以及它是否真的是正确的指标。

我有一个类似的问题,其中一个预测是负面的,尽管所有的训练目标值都是正的。我将其缩小到异常值,并使用sklearn的RobustScaler解决了它。它不仅可以扩展数据,还可以处理异常值

使用对异常值具有鲁棒性的统计数据缩放要素。

特征缩放在这里应该是一个不错的选择,因此最小值为>= 0。

使用最小-最大缩放器在 (0, x] 之间缩放值,其中 x 是您选择的任何值。然后使用它以获得更好的结果。

最新更新