【问题标题】:How to pre-process the data to calculate Root Mean Squared Logarithmic Error?如何预处理数据以计算均方根对数误差?
【发布时间】:2020-01-10 09:11:50
【问题描述】:

我正在计算 Root Mean Squared Logarithmic Error 我发现的选项很少,一种是使用 sklearn 指标:mean_squared_log_error 并取其平方根

np.sqrt(mean_squared_log_error( target, predicted_y ))

但我收到以下错误:

Mean Squared Logarithmic Error cannot be used when targets contain negative values

我还尝试了来自 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)

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

【问题讨论】:

    标签: python machine-learning metrics logarithm


    【解决方案1】:

    将两个数组标准化为范围 0 到 1

    如果你使用 scikit,你可以使用 sklearn.preprocessing.minmax_scale:

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

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

    例如:

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

    【讨论】:

    • 我不确定这是否是您想要的。在文档中,minmax_scale 独立缩放每个功能,但您希望 temp_predtemp_real 缩放相同的量。
    • @Kyle 相同数量是什么意思?
    • 如果temp_pred = [-2, 2, 3]temp_real = [-3, 2, 3] 理想情况下-3 将缩放到0,并且两个数组都将基于-3 作为最小值进行缩放(我的意思是相同的)。但是由于每个特征都是独立缩放的,所以temp_pred 将根据-2 作为最小值进行缩放,temp_real 将根据-3 作为最小值进行缩放。我没有广泛使用minmax_scale,但根据文档,这就是我认为它会做的事情。
    【解决方案2】:

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

    【讨论】:

    • 强调:如果您试图预测变量的正确数量级(例如,“它是数百还是数千”),则 RMSLE 是合适的。当您的变量为 温度(开氏度)时,如示例中所示,这种情况很少发生 - 当您使用温度时,您通常关心绝对差异,而不仅仅是数量级.适合 RMSLE 的一个很好的例子是来自 Kaggle 的“波士顿房价”数据集。
    【解决方案3】:

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

    使用对异常值具有鲁棒性的统计数据来缩放特征。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2023-03-15
          • 2017-04-04
          • 2017-12-23
          • 2019-05-13
          • 1970-01-01
          • 2020-07-02
          • 1970-01-01
          • 2020-03-18
          • 2022-06-27
          相关资源
          最近更新 更多