调整随机森林分类器

时间:2017-09-23 18:11:55

标签: python performance classification random-forest

我正在研究一个随机森林分类器模型,将数据分为4类。数据集是来自两个不同防火墙应用程序的连接日志,具有100K +样本和10个属性。来自训练集的样本数据集的准确度为0.90-0.97。

根据测试数据,我从1个防火墙获得的日志为0.7-0.97,而另一个防火墙的日志为0.5(总是)。我应该考虑调整RF还是我的模型完全出错? “Text field1”将被预测。

y,label = pd.factorize(train["Text field1"])

clf=RandomForestClassifier(n_jobs=10,n_estimators=100,max_features=1,max_depth=80)
clf.fit(train[features],y)
pred=clf.predict(test[features])
pred_label=label[pred]

`

我是初学者,感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

我在这里看到两个问题。一个是,像雷切尔说的那样,你肯定过度拟合你的数据了。 80是真正的深树!这将为每个节点提供2 ^ 80个可能的叶子,或者1个后跟24个零!由于您只有100k +样本,因此您肯定会在每棵树上与其各自的训练数据引导程序完美匹配。一旦你有足够的深度来做到这一点,深度限制的进一步增加没有做任何事情,你显然超过了这一点。这是不可取的。

由于即使深度为2 ^ 17的(平衡)树也是130k叶节点,你应该看一些浅于17的深度。一旦你有一个合理的深度,max_features=1可能不再是最优的。您还应该测试一些不同的值。

您提出的另一个问题是您在两个防火墙上有不同的性能。这有几个可能的原因:

  • 如果您正在一个防火墙上进行培训,并在另一个防火墙上进行测试,那么您希望该模型只能在相似数据集的部分上做得很好。最好在同一防火墙内的(独立)数据中进行训练/测试分割,或者因为您使用的是随机森林,只需查看袋外性能(存储在clf.oob_score_)。
  • 如果您已经这样做了,那么您使用的非最佳参数可能会对这两个数据集产生不同的影响。例如,如果防火墙1的所有数据都类似,那么过度拟合不会降低您选择的测试数据的性能,而如果防火墙2有许多异常情况,则过度拟合将极大地降低性能。如果您处于这种情况下,修复第一个问题应该有助于第二个问题。

如果您的模型训练很快,您可能会发现GridSearchCV将有助于您的参数选择(这就是它的设计目的)。它将自动测试不同的参数组合。请记住,如果您在N个深度和M max_features上进行测试,您将获得N * M种可能性,因此最好先对它们进行稀疏采样(可能是深度为18,12,8和max_features的2, 5,8开始),然后你可以再次运行它,其值更接近你第一次找到的最佳设置。

答案 1 :(得分:0)

您的模型过度适应训练集。您应该通过以下方式减少方差/增加模型的偏差:

  1. 增加随机性:考虑每个分割的特征的较小百分比
  2. 限制每棵树可以分割的次数