在回答您的第一个问题时,我认为您选择用于评估模型的性能指标相当欺骗了您。 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 等技术找到最佳设置。仅通过查看这一案例,很难说上述值是否可以接受。
希望这会有所帮助!