【问题标题】:Is it acceptable to scale target values for regressors?缩放回归变量的目标值是否可以接受?
【发布时间】:2019-11-03 11:12:27
【问题描述】:

对于 MLPRegressor、ForestRegression 和线性回归,我得到非常高的 RMSE 和 MAE,只有输入变量缩放 (30,000+) 但是当我缩放目标值时,我得到 RMSE (0.2),我想知道这是否可以接受要做的事情。

其次,Test 具有更好的 R 平方值是否正常(即,火车为 0.98 和 0.85)

谢谢

【问题讨论】:

    标签: python-3.x regression data-science prediction


    【解决方案1】:

    在回答您的第一个问题时,我认为您选择用于评估模型的性能指标相当欺骗了您。 RMSE 和 MAE 都对您测量目标变量的范围很敏感,如果您要按比例缩小目标变量,那么肯定 RMSE 和 MAE 的值会下降,让我们举个例子来说明这一点。

    def rmse(y_true, y_pred):
        return np.sqrt(np.mean(np.square(y_true - y_pred)))
    
    def mae(y_true, y_pred):
        return np.mean(np.abs(y_true - y_pred))
    

    我编写了两个函数来计算 RMSE 和 MAE。现在让我们插入一些值,看看会发生什么,

    y_true = np.array([2,5,9,7,10,-5,-2,2])
    y_pred = np.array([3,4,7,9,8,-3,-2,1])
    

    暂时让我们假设真实值和预测值如上所示。现在我们准备好为这些数据计算 RMSE 和 MAE。

    rmse(y_true,y_pred)
    1.541103500742244
    
    mae(y_true, y_pred)
    1.375
    

    现在让我们将目标变量缩小 10 倍并再次计算相同的度量。

    y_scaled_true = np.array([2,5,9,7,10,-5,-2,2])/10
    y_scaled_pred = np.array([3,4,7,9,8,-3,-2,1])/10
    
    rmse(y_scaled_true,y_scaled_pred)
    0.15411035007422444
    
    mae(y_scaled_true,y_scaled_pred)
    0.1375
    

    我们现在可以很好地看到,仅通过缩放我们的目标变量,我们的 RMSE 和 MAE 分数就会下降,从而产生一种我们的模型有所改进的错觉,但实际上并没有。当我们缩减模型的预测时,我们处于相同的状态。

    因此,说到重点,MAPE(平均绝对百分比误差)可能是衡量模型性能的更好方法,它对测量变量的尺度不敏感。如果您计算两组值的 MAPE,我们发现它们是相同的,

    def mape(y, y_pred):
        return np.mean(np.abs((y - y_pred)/y))
    
    mape(y_true,y_pred)
    0.28849206349206347
    
    mape(y_scaled_true,y_scaled_pred)
    0.2884920634920635
    

    因此,如果您希望自己的绩效衡量指标独立于衡量它们的规模,那么最好依赖 MAPE 而不是 MAE 或 RMSE。

    回答您的第二个问题,因为您正在处理一些复杂的模型,例如 MLPRegressor 和 ForestRegression,其中有一些需要调整以避免过度拟合的超参数,找到超参数的理想水平的最佳方法是将数据划分为训练、测试和验证,并使用K-Fold Cross Validation 等技术找到最佳设置。仅通过查看这一案例,很难说上述值是否可以接受。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      在很多情况下,缩放目标值实际上是一种常见的做法。

      例如,如果应用loglog1p 变换,高度倾斜的目标可能会产生更好的结果。我不知道您的数据的特征,但可能有一个转换可能会降低您的 RMSE。

      其次,测试集是不可见数据的样本,用于对模型的性能进行最终估计。当您看到看不见的数据并对其进行调整以使其表现更好时,它就变成了一个交叉验证集。

      您应该尝试将数据分成三部分:训练、交叉验证和测试集。训练您的数据并根据其在交叉验证中的性能调整参数,然后在完成调整后,在测试集上运行它以预测它如何处理看不见的数据并将其标记为模型的准确性。

      【讨论】:

        猜你喜欢
        • 2012-02-23
        • 2020-09-03
        • 2014-12-19
        • 2020-11-22
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 2019-03-06
        • 2017-04-07
        相关资源
        最近更新 更多