我对MLPRegressor,ForestRegression和线性回归的RMSE和MAE很高,仅对输入变量进行了缩放(30,000+),但是当我对目标值进行缩放时也得到了RMSE(0.2),我想知道这是否可以接受要做的事情。
第二,在测试中获得更好的R平方值是正常的(即火车为0.98和0.85)
谢谢
答案 0 :(得分:0)
在许多情况下,缩放目标值实际上是一种常见的做法。
例如,高度偏斜的目标如果应用log
或log1p
变换,可能会得到更好的结果。我不知道您的数据的特征,但是有可能发生转换,从而降低您的RMSE。
其次,测试集旨在作为看不见的数据的样本,以最终评估模型的性能。当您看到看不见的数据并进行调整以使其表现更好时,它将成为交叉验证集。
您应该尝试将数据分为三个部分,训练,交叉验证和测试集。训练数据并根据其在交叉验证中的性能来调整参数,然后在完成调整后,在测试集上运行它,以预测其如何处理看不见的数据并将其标记为模型的准确性。 / p>
答案 1 :(得分:0)
回答您的第一个问题,我认为您对选择用来评估模型的性能指标很感兴趣。 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之类的技术来找到最佳设置。仅通过观察这种情况就很难说上述值是否可以接受。
希望这会有所帮助!