随机森林过度拟合吗?


19

我正在使用scikit-learn在随机森林中进行实验,并且获得了很好的训练结果,但是相对而言,我的测试结果却很差...

这是我要解决的问题(灵感来自扑克):给定玩家A的底牌,玩家B的底牌和翻牌(3张牌),哪位玩家的手牌最好?从数学上讲,这是14个输入(7张卡-一张等级,每张一套)和一个输出(0或1)。

到目前为止,这是我的一些结果:

Training set size: 600k, test set size: 120k, number of trees: 25
Success rate in training set: 99.975%
Success rate in testing set: 90.05%

Training set size: 400k, test set size: 80k, number of trees: 100
Success rate in training set: 100%
Success rate in testing set: 89.7%

Training set size: 600k, test set size: 120k, number of trees: 5
Success rate in training set: 98.685%
Success rate in testing set: 85.69%

这是使用的相关代码:

from sklearn.ensemble import RandomForestClassifier
Forest = RandomForestClassifier(n_estimators = 25) #n_estimator varies
Forest = Forest.fit(inputs[:trainingSetSize],outputs[:trainingSetSize])
trainingOutputs = Forest.predict(inputs[:trainingSetSize])
testOutputs = Forest.predict(inputs[trainingSetSize:])

似乎无论使用多少树,尽管训练集相对较大且特征数量较少,但训练集性能要比测试集好得多。


2
我在这里看不到十几个关于随机森林的“日记”。交叉验证?贝叶斯先验?重采样的性质?为每棵树设置培训?每棵树的子集的百分比是多少?...还有很多可以列举的内容,但是我要说的是,您还有其他输入要考虑。
EngrStudent-恢复莫妮卡

1
您能为那些不认识扑克的人解释这个问题吗?那么就更容易理解使用RF是否存在根本上的问题...我不知道扑克,但是我怀疑RF可能是错误的方法-即,输入RF的第一步是仅使用部分输入而在我看来,仅使用部分输入就无法构建良好的分类器-所有输入都是必需的。
seanv507

Answers:


45

在使用RF模型时,这是一个常见的菜鸟错误(我将举手作为先前的犯罪者)。当整体考虑时,使用训练集构建的森林在许多情况下(几乎可以发现)几乎完全适合训练数据。但是,当算法构建森林时,它会记住袋外(OOB)预测误差,这是对泛化误差的最佳猜测。

如果将训练数据返回到预测方法中(如您所做的那样),您将得到这个几乎完美的预测(非常乐观),而不是正确的OOB错误。不要这样 相反,训练有素的Forest对象应该已经在其中记住了OOB错误。我不熟悉scikit-learn的实现,但是看这里的文档,看来您需要oob_score=True在调用fit方法时指定,然后将泛化错误存储为oob_score_在返回的对象中。在R包“ randomForest”中,调用对返回对象不带任何参数的预测方法将返回训练集上的OOB预测。这样,您就可以使用其他措施来定义错误。将训练集发送回预测方法将给您不同的结果,因为它将使用所有树。我不知道scikit-learn实现是否会这样做。

将训练数据发送回预测方法以测试准确性是错误的。不过,这是一个非常常见的错误,请不要担心。


1
谢谢!但是,我仍然有一个顾虑:使用40万个训练示例和50棵树,我的正确率是89.6%,而使用同样多的数据和两倍的树,我的正确率是89.7%...这是否表明RF并不是很好方法呢?我过去使用MLP神经网络,在测试设备上达到了约98.5%的准确性...
Uwat 2013年

5
这是可能的,尽管您似乎没有使用足够多的树木。通常,您需要成千上万。请注意,树的数量并不是RF算法中要调整的参数,更多的树总是更好的选择,但是一旦“足够”(由经验确定),OOB误差就不会随着树的增加而改善。即使对于小的简单数据集,少于500棵树也远远不够。
Bogdanovist

1
对于树木的数量,有一些小的警告,“越多越好”,但是据我了解,在开始表现出色之前,您需要成千上万棵树。以我的经验,只要OBB(ntrees)曲线趋于平稳,就会有尽可能多的树拥有CPU资源和耐心来生成更好的树,尽管收益递减。
Bogdanovist

12

我认为答案是max_features参数:int,string或None,可选(默认=“ auto”)参数。基本上,对于这个问题,您应该将其设置为None,以便每棵树都使用所有输入来构建,因为显然您不能仅使用一小部分卡片来构建适当的分类器(默认“自动”选择sqrt(nfeatures)每棵树的输入)


1
就是这样!50棵树和600k训练示例,准确率达到95%。
Uwat

2
请注意,此时您几乎没有使用随机森林,但正如其他答案所指出的那样,它不是此确切问题的理想分类器。
理查德·拉斯特
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.