随机森林-如何处理过度拟合


41

我有计算机科学背景,但是正在尝试通过解决Internet问题来自学数据科学。

在过去的几周里,我一直在研究这个问题(大约900行和10个功能)。我最初使用逻辑回归,但是现在我切换到了随机森林。当我在训练数据上运行随机森林模型时,auc的值非常高(> 99%)。但是,当我在测试数据上运行相同的模型时,结果并不是很好(准确度约为77%)。这使我相信我已经过度适合训练数据了。

关于防止随机森林过度适应的最佳实践是什么?

我正在使用r和rstudio作为开发环境。我正在使用该randomForest软件包,并且已接受所有参数的默认值


4
Breiman声称RF不会过度拟合。stat.berkeley.edu/~breiman/RandomForests/cc_home.htm假设他是正确的,那么您的训练和测试集之间可能会有某种不一致的地方吗?
恢复莫妮卡2014年

如果优化调整参数,RF会避免对测试数据过度拟合
Brash Equilibrium

我发现sampsize是一个完全被忽略的调整参数。stackoverflow.com/questions/34997134/...
索伦Havelund威灵

Answers:


30

为了避免在随机森林中过度拟合,您需要做的主要事情是优化调整参数,该参数控制从引导数据中随机选择来生长每棵树的要素数量。通常,您可以通过倍交叉验证来执行此操作,其中,然后选择最小化测试样本预测误差的调整参数。此外,种植大片森林将提高预测的准确性,尽管一旦您获得几百棵树,通常收益会递减。ķ { 5 10 }kk{5,10}


1
谢谢。是否有一些教程可以显示如何优化这些参数?
阿比

您将需要注册斯坦福在线课程,这非常简单,但是这里有一个在R中执行该操作的视频教程:class.stanford.edu/courses/HumanitiesScience/StatLearning/…–
Brash Equilibrium

如果我正确理解了这一点,我们将使用交叉验证来确定进入随机森林模型的要素数量,而不是模型在每个步骤将尝试的要素数量。对吗
阿比

4
我会反对这个答案:RF的两个吸引人的特征是,它们很难过拟合,并且默认参数通常都很好。这个答案似乎暗示着RF对默认值很敏感,这种情况很少发生
查尔斯

7
从经验上讲,我完全没有发现过度适应随机森林,引导随机森林,正则化随机森林或引导正则化随机森林的困难。它们通常在交叉验证中表现很好,但是由于过度拟合,在与新数据一起使用时效果很差。我认为这与建模的现象类型有关。在对机械过程进行建模时,这并不是什么大问题,但是通过行为模型,通过明确指定的回归,我可以获得更加稳定的结果。
Hack-R

33

您如何从训练数据中获得99%的AUC?请注意,两者之间存在差异

predict(model)

predict(model, newdata=train)

获取训练数据集的预测时。第一种选择是从随机森林中获得袋外预测。将预测值与训练数据的实际值进行比较时,通常这就是您想要的。

第二个方法将您的训练数据视为新数据集,然后将观察结果沿着每棵树运行。这将导致预测值与实际值之间人为地紧密相关,因为RF算法通常不会修剪单个树,而是依靠树的集合来控制过度拟合。因此,如果您想对训练数据进行预测,请不要这样做。


3
我正在使用预报(模型,数据=火车)。我现在切换到预测(模型),我的auc下降到87%。这是好事还是坏事?
Abhi 2014年

2
谢谢!我发现这也是我的问题。我贴在一个后续问题有什么措施来用作RF模型的训练误差'在这里:stats.stackexchange.com/questions/162353/...
伯克U.

太好了谢谢!!我也是在犯这个错误!对@Abhi:这是一件好事,因为以前的AUC太高了。这是更现实的。尝试进行交叉验证并在此基础上测量AUC,您可能会看到相似的值。
好奇的

7

对于决策树,有两种处理过度拟合的方法:(a)不要将树全部生长(b)修剪

树木的森林也是如此-不要过分修剪它们。

我用的不是randomForest很多,但是据我所知,有几个参数可用于调整森林:

  • nodesize -终端节点的最小大小
  • maxnodes -终端节点的最大数量
  • mtry -用于构建每棵树的变量数量(感谢@ user777)

1
并且mtry,算法为构建每棵树而绘制的变量数,默认情况下,要素总数的平方根。
恢复莫妮卡2014年

我会离开maxnodes并降低sampsize。双方渐渐收窄maxnodes和sampsize给树木较少的深度和更强大的森林,sampsize然而,较低的树也相关,森林可能会收敛,以降低交叉验证的预测错误,请参阅stackoverflow.com/questions/34997134/...
索伦Havelund威灵

2

您可能希望使用交叉验证方法,例如K折交叉验证。


您需要规范化/缩放功能?
查尔斯

4
@查尔斯,我很抱歉。的确,在使用随机森林时没有必要缩放功能。请参阅:stackoverflow.com/questions/8961586/...
FRE

我确实认为交叉验证会很有用。这是一个相对较小的数据集,具有拆分的样本验证,可能会产生不稳定的误差估计(尽管我承认这不是问题所在)
查尔斯

1

您可以使用gridsearch调整参数

from sklearn.ensemble import RandomForestClassifier

from sklearn.grid_search import GridSearchCV

random_classifier = RandomForestClassifier()

parameters = { 'max_features':np.arange(5,10),'n_estimators':[500],'min_samples_leaf': [10,50,100,200,500]}

random_grid = GridSearchCV(random_classifier, parameters, cv = 5)

尝试进行编辑的人员建议GridSearchCV在其中调用该模块model_selection,因此第二行代码应为from sklearn.model_selection import GridSearchCV
gung-恢复莫妮卡

0

尝试在[5,15]的范围内调整max_depth参数,但不要超过此范围,因为如果您选择较大的深度,则极有可能过度拟合。

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.