【问题标题】:Tuning Random Forest classifier调整随机森林分类器
【发布时间】:2018-03-05 02:24:58
【问题描述】:

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

根据测试数据,我从 1 个防火墙获得的日志为 0.7-0.97,而另一个为 ~0.5(始终)。我应该考虑调整射频还是我的模型完全有问题? “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]

`

我是这方面的初学者,感谢任何帮助。谢谢!

【问题讨论】:

  • 您应该期望分类器在训练数据上的工作比在测试数据上更好。您/您尝试过使用哪些参数?你在用sklearn吗?
  • @JeremyMcGibbon 是的,我正在使用 sklearn RF 分类器。我已将我的代码添加到原始帖子中。对于大于 80 的树深度,模型的准确性似乎正在降低,尽管我想知道这是否不是太高的值。 max_features = 1,我似乎得到了最好的结果。这就是为什么我对我的模型有点怀疑的原因。

标签: python performance classification random-forest


【解决方案1】:

我在这里看到了两个问题。一个是,就像 Rachel 说的,你肯定过度拟合了你的数据。 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 到开始),然后您可以使用更接近您第一次找到的最佳集合的值再次运行它。

【讨论】:

  • 非常感谢简单而详细的解释!我使用了 GridSearch 并为我的模型使用了参数,结果似乎有所改善,但略有改善。再看一下我的数据,发现一半样本有冗余输出,所以我从训练集中删除了那些,现在我从两个防火墙的测试样本中得到 0.89-0.99。非常感谢您的时间和帮助,我从您的回答中学到了很多东西!
【解决方案2】:

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

  1. 增加随机性:考虑减少每次分割的特征百分比
  2. 限制每棵树的分裂次数

【讨论】:

  • 我理解过拟合部分。因此,正如您提到的(稍后添加的代码),我尝试在每次拆分时限制深度和功能。 min_samples_split 似乎降低了准确性。使用此代码,我从 1 个防火墙获得 0.86 的样本,另一个获得 0.55。为什么第二个这么低,而且没有改善?
猜你喜欢
  • 2018-02-18
  • 2018-05-20
  • 1970-01-01
  • 2019-09-05
  • 2013-09-22
  • 2019-08-11
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多