如何测试过度拟合的随机森林回归模型?

Posted

技术标签:

【中文标题】如何测试过度拟合的随机森林回归模型?【英文标题】:How to test a Random Forest regression model for Overfitting? 【发布时间】:2021-03-25 17:58:32 【问题描述】:

我将 RandomForest 用于回归模型,并想看看我的模型是否过拟合。这是我所做的:

我使用 GridSearchCV 进行超参数调整,然后使用这些参数创建一个 RandomForestRegressor:

RF = RandomForestRegressor(n_estimators=b['n_estimators'], max_depth=b['max_depth'], min_samples_leaf=b['min_samples_leaf'], random_state=0)

然后我使用训练数据集拟合模型:

model = RF.fit(x_train, y_train.values.ravel())

然后我用测试数据集进行预测:

y_pred = model.predict(x_test)

然后我用 x_train 代替 x_test 做了同样的事情:

y_pred = model.predict(x_train)

以下是我取得的成果:

Test Data:
MAE: 15.11
MAPE: 26.98%

Train Data:
MAE: 6.17
MAPE: 10.97%

正如您所看到的,存在非常显着的差异。 我在使用 x_train 进行预测时是否存在过度拟合的大问题或者我做错了什么?

MAE 和 MAPE 的公式:

MAE:

mae = sklearn.metrics.mean_absolute_error(y_test, y_pred)

MAPE:

def percentage_error(actual, predicted):
   res = np.empty(actual.shape)
   for j in range(actual.shape[0]):
       if actual[j] != 0:
           res[j] = (actual[j] - predicted[j]) / actual[j]
       else:
           res[j] = predicted[j] / np.mean(actual)
   return res

def mean_absolute_percentage_error(y_test, y_pred): 
   return np.mean(np.abs(percentage_error(np.asarray(y_test), np.asarray(y_pred)))) * 100

MAPE 公式的来源: https://***.com/a/59033147/10603410

【问题讨论】:

请同时显示生成 MAPE 和 MAE 的代码 感谢您的建议,我在原帖中添加了代码! 看起来只是一个过度拟合的问题。我没有看到 X_train 的预测有任何问题。尝试让模型更简单... 感谢您的回复!当你说让模型更简单时,我究竟该怎么做? 查看如何减少过拟合。简单来说,我的意思是采用较少的特征、正则化、使用 PCA 进行降维、进行交叉验证等。随着模型变得越来越复杂,具有比必要更多的特征,它学习了太多并且不能很好地在测试集上泛化. 【参考方案1】:

没有“如果这个数字x小于y那么我们过拟合”,是你需要断定我们是否过拟合。

根据定义,如果测试误差“比训练误差大得多”,则说明您过度拟合,但未定义“大得多” - 如果取决于您的数据和模型的用途。如果您的数据真的很“容易”(即容易回归),您会期望接近训练/测试错误。如果真的很吵,你可以接受更大的差异

【讨论】:

非常感谢您的回复!这很有意义。对于我在上面发布的结果,max_depth 设置为“无”。当我将 max_depth 设置为较低的值时,例如 max_depth = 10,测试和训练结果之间的差异会变得更小,而测试数据集的结果只会稍微差一些。这是否指向您所说的噪声数据? 那么你首先肯定是过拟合(深树过拟合!)。请注意,仅仅因为您没有过度拟合并不意味着您的模型是“好”的 - 它可能意味着预测训练/测试集同样糟糕。例如,如果您的模型仅计算目标的平均值。由于您的训练/测试应该来自相同的分布,因此训练/测试集的预测可能彼此接近(没有过度拟合),但误差很大(例如,如果您的目标是正弦曲线 + 噪声,则. 真的很不合适) 好的,我明白了。在那种情况下,仅仅为了减少过度拟合问题而减少 max_depth 是没有意义的,对吧?我还能做些什么来减少过度拟合,还是只是我的数据的性质导致了这种情况的发生? 减少 max_depth 确实会减少过度拟合,但它(很可能)也会增加你的偏差(降低你的准确性)。大多数时候,您将拥有一些最小化/优化的功能,例如 MAPE 或 AUC,并且您在验证集(测试集)上使用该指标来找到合适的超参数。您还可以将训练/验证误差绘制为最大深度的函数,您应该看到验证误差下降到某个点再次开始上升 - 这应该是您的最佳选择。

以上是关于如何测试过度拟合的随机森林回归模型?的主要内容,如果未能解决你的问题,请参考以下文章

Kaggle 快速模型之 Random Forrest 随机森林

KFold 交叉验证不能修复过度拟合

如何使用 GridSearchCV 测试回归交叉验证中的过度拟合?

如何阻止梯度提升机过拟合?

旋转随机森林算法

Spark Random Forest classifier 随机森林分类