随机森林过度拟合


15

我正在尝试在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)

有什么可能的策略来改善我的健康状况?我还有其他方法可以提取基础模型吗?对于我来说,令人难以置信的是,经过多次重复相同的模式后,模型对新数据的表现如此差劲。我完全没有希望尝试拟合此数据吗?


您是否正在使用x轴作为输入并使用y轴作为x <= 245的标签,然后测试x> 245来训练此周期函数?还是我误解了你的情节?
rrenaud

种类,实际上x轴是观测指标,总共有300个观测值,因此从245开始,即不用于训练模型的测试数据,输入特征向量由整数组成,形状为(300,2)并且非常类似于观察指标的线性函数,因此我没有添加有关它的信息,以免使问题过于复杂。
elyase 2012年

1
您可能要先从数据(和趋势)中删除周期(季节部分)。
R. Prost

您是否研究了时间序列分析?我不清楚您的x轴上有什么,但对我来说似乎是周期性的。检查这里,让我知道这是否有帮助:otexts.org/fpp/7/5
Bram Van Camp

Answers:


21

我认为您使用的是错误的工具;如果整个X等于索引,则基本上是有一些采样函数并试图对其进行推断。机器学习全都是关于插值历史的,因此在这种情况下,它的得分惊人就不足为奇了。f:RR

您需要的是时间序列分析(即,提取趋势,分析频谱并自动回归或对其余部分进行HMM)或物理(即,考虑是否有ODE可能产生这样的输出,并尝试通过保守量来拟合其参数)。


机器学习不是从数据中提取通用模型吗?一旦有了一组可以很好地插值数据的数据,我们可以使用例如交叉验证来选择具有更好的外推/泛化属性的数据。我的理解有问题吗?
elyase 2013年

外推与泛化不同-假设您是以下实验的主题:您看到一个屏幕,并且有一个红色和绿色的按钮。首先,屏幕显示您所在房间的视频,其他人在屏幕上显示绿色按钮分别表示猫,狮子和老虎,然后红色表示狼和狗,这样就收集了5个美味的饼干。

1
现在,屏幕上显示了山猫。您对历史记录进行了正确的,可概括的插值,请按绿色按钮,然后触电,而不是Cookie。为什么会这样呢?因为解决方案是一个循环(gggrrr),而动物图片只是一种欺骗。您已经对森林做了同样的事情-将其吸引到您的训练集的愚蠢复制中,同时隐藏了真实信息。

很好的例子,但是看不到你做的那样。在您的示例中,我们具有以下数据:一个target(gr)和2个要素(index(temporal)和animal)。从这些数据中,我可以拟合多个模型,这些模型可以赋予特征1或2(或相等或相等)或多或少的权重。交叉验证(假设有足够的数据)应得出特征2(动物)重要性较低的模型。我可以看到我的模型过度拟合了数据,但是我仍然认为我应该能够使用足够大的模型空间来提取遵循此模式的模型(因为行为没有改变)。
elyase

1
不; 即使您需要更多数据,实验人员仍然可以扩大动物的欺骗范围,并进一步混淆该模式以使其不明显。即,外推根本无法通过学习来完成,因为根据定义,外推需要训练中不存在的信息-这样,您必须应用一些假设或收集其他数据,以便问题会变成内插。

9

最大的问题是回归树(以及基于它们的算法,例如随机森林)会预测分段常数函数,从而为落在每个叶子下的输入提供常数值。这意味着在他们的训练范围外进行推断时,他们只是预测与他们拥有训练数据的最近点相同的值。@mbq是正确的,因为有专门的时间序列学习工具可能会比一般的机器学习技术更好。但是,随机森林对于此示例尤其不利,并且其他通用ML技术的性能可能会比您看到的更好。具有非线性内核的SVM是我想到的一种选择。由于您的函数具有周期性的结构,因此这也建议您使用频域,


AFAIK SVM具有随机森林的相同问题。他们在训练过的空间之外预测得不好。也许神经网络将是一个更好的解决方案
Donbeo 2014年

如果数据位于曲线上,并且内核是适合该曲线的正确类型,则SVM将能够沿该曲线外推。如果数据具有线性趋势,则线性SVM将适合该线,并沿该线外推。更复杂的内核可以适应和推断更复杂的行为。这取决于拥有正确种类的内核。那不是使SVM成为外推和TS预测的正确工具,但它使它们比随机森林更好。
Daniel Mahler

3

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

步骤1.使用NM优化创建MSE最小化功能。在此处可以看到一个示例:http : //glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

步骤2.在此最小化功能内,目标是降低MSE。为此,请创建数据的十倍拆分,其中以9倍学习新模型,然后以10倍进行测试。重复此过程十次,以获取每折的MSE。目标的结果将返回汇总的MSE。

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

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


是的,它似乎过拟合(Random Forest Regression通常不适合,因此是问题)。现在,我发现更改参数对RF回归器影响很小。现在,交叉验证需要足够灵活以进行优化的基础模型。您为此类数据推荐哪种ML模型/算法。
elyase 2013年

3

一些建议:

  1. 使用滚动窗口方法调整参数(必须优化模型以预测时间序列中的下一个值,而不是预测提供的值中的值)
  2. 尝试其他模型(即使是更简单的模型,具有正确的特征选择和特征工程策略,也可能更适合您的问题)
  3. 尝试学习目标变量的最佳变换(也可以对此进行调整,线性/指数趋势为负,您可能可以估计它)
  4. 频谱分析
  5. 最大值/最小值看起来相等。了解在何处为您提供了功能(无需操作员输入,可以通过算法发现它来消除偏差)并将其添加为功能。还要设计一个功能nearest maximum。邓诺(Dunno),它可能行得通,或者也许行不通,您只能知道是否对其进行了测试:)

但是,正如丹尼尔(Daniel)在回答中所说,随机森林无法通过设计解决此类问题,因为它无法预测火车样本中观察到的范围之外的值。调整参数等将无济于事。

1
建议#2 @Tim。而且,Random Forests不会天真地处理这些数据,但是聪明的特征提取可能会使它起作用。
Firebug


0

阅读以上内容后,我想给出另一个不同的答案。

对于基于树的模型(例如随机森林),它们无法推断超出训练集的值。因此,我认为这不是一个过度拟合的问题,而是一个错误的建模策略。

那么,使用树模型进行时间序列预测该怎么办?

可能的方法是将其与线性回归结合:首先,对时间序列进行反趋势处理(或使用线性回归对趋势进行建模),然后使用树对残差进行建模(残差是有界的,因此树模型可以处理)。

此外,还有一个可以与线性回归相结合的树模型可以推断,称为立体派,它可以在叶子上进行线性回归。


0

如果您只是想在图的范围内进行预测,则只需在拆分数据集之前随机化观察值即可解决该问题。然后,如图所示,从外推一变成内插问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.