随机森林过拟合

机器算法验证 回归 随机森林 scikit-学习
2022-01-21 07:19:17

我正在尝试在 scikits-learn 中使用随机森林回归。问题是我得到了一个非常高的测试错误:

train MSE, 4.64, test MSE: 252.25.

这是我的数据的样子:(蓝色:真实数据,绿色:预测):

森林回归清理

我将 90% 用于培训,10% 用于测试。这是我在尝试了几种参数组合后使用的代码:

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

有哪些可能的策略来改善我的拟合?我还能做些什么来提取底层模型吗?在我看来,在相同模式多次重复之后,模型对新数据的表现如此糟糕,这对我来说似乎是不可思议的。我有任何希望尝试拟合这些数据吗?

4个回答

我认为您使用了错误的工具;如果你的整个 X 等于索引,你基本上有一些采样函数f:RR并试图推断它。机器学习就是对历史的插值,所以在这种情况下它取得了惊人的失败也就不足为奇了。

您需要的是时间序列分析(即提取趋势、分析频谱和自回归或 HMMing 其余部分)或物理学(即考虑是否存在可能产生此类输出并尝试通过守恒量拟合其参数的 ODE)。

最大的问题是回归树(以及基于它们的算法,如随机森林)预测分段常数函数,为落入每个叶子下的输入给出一个常数值。这意味着,当在他们的训练域之外推断时,他们只是预测与他们拥有训练数据的最近点相同的值。@mbq 是正确的,有专门的时间序列学习工具可能比一般的机器学习技术更好。然而,随机森林在这个例子中特别糟糕,其他通用 ML 技术的性能可能比你看到的要好得多。带有非线性内核的 SVM 是我想到的一种选择。由于您的函数具有周期性结构,这也表明在频域工作,

这是数据过度拟合的教科书示例,该模型在训练数据上表现非常好,但在任何新的测试数据上都崩溃了。这是解决此问题的策略之一:对训练数据进行十倍交叉验证以优化参数。

步骤 1. 使用 NM 优化创建 MSE 最小化函数。可以在这里看到一个例子:http: //glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

步骤 2. 在这个最小化函数中,目标是减少 MSE。为了做到这一点,创建一个 10 倍的数据拆分,其中一个新模型在 9 倍上学习并在第 10 倍上进行测试。这个过程重复十次,以获得每个折叠的 MSE。聚合的 MSE 作为目标的结果返回。

第 3 步。python 中的 fmin 将为您执行迭代。检查需要微调哪些超参数(n_estimators、max_features 等)并将它们传递给 fmin。

结果将是最好的超参数,这将减少过度拟合的可能性。

一些建议:

  1. 使用滚动窗口方法调整参数(必须优化模型以预测时间序列中的下一个值,而不是预测提供的值中的值)
  2. 尝试其他模型(甚至更简单的模型,具有正确的特征选择和特征工程策略,可能更适合您的问题)
  3. 尝试学习目标变量的最佳变换(也调整这个,有一个负的线性/指数趋势,你可以估计它)
  4. 光谱分析也许
  5. 最大值/最小值似乎是等距的。了解他们在哪里获得了您的特征(没有操作员输入,让算法发现它以消除偏差)并将其添加为特征。还设计了一个功能nearest maximum不知道,它可能有效,也可能无效,只有你测试过才知道:)