Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调整随机森林分类器_Python_Performance_Classification_Random Forest - Fatal编程技术网

Python 调整随机森林分类器

Python 调整随机森林分类器,python,performance,classification,random-forest,Python,Performance,Classification,Random Forest,我正在研究一个随机森林分类器模型,将数据分为4类。数据集是来自两个不同防火墙应用程序的连接日志,具有100K+个样本和10个属性。训练集样本数据集的精度为0.90-0.97 有了测试数据,我从一个防火墙得到了0.7-0.97的日志,而从另一个防火墙得到了~0.5(始终)。我应该考虑调整射频还是我的型号完全出了问题? “文本字段1”将被预测 y,label = pd.factorize(train["Text field1"]) clf=RandomForestClassifier(n_jobs

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

有了测试数据,我从一个防火墙得到了0.7-0.97的日志,而从另一个防火墙得到了~0.5(始终)。我应该考虑调整射频还是我的型号完全出了问题? “文本字段1”将被预测

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]
`


我是这方面的初学者,非常感谢您的帮助。谢谢

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

  • 增加随机性:考虑每个分割
  • 的较小百分比的特征
  • 限制每棵树可以进行的拆分数量

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

  • 增加随机性:考虑每个分割
  • 的较小百分比的特征
  • 限制每棵树可以进行的拆分数量

  • 我在这里看到两个问题。一个是,就像Rachel说的,你肯定是过度拟合了你的数据。80是一棵很深的树!这将给每个节点2^80个可能的叶子,或者1后跟24个零!因为您只有100k+个样本,所以您肯定是在每个树上为其各自的训练数据引导提供了一个完美的匹配。一旦你们有足够的深度去做这件事,进一步增加深度限制并没有任何作用,你们已经明显地超过了那个点。这是不可取的

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

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

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

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

    这里有两个问题。一个是,就像Rachel说的,你肯定是过度拟合了你的数据。80是一棵很深的树!这将给每个节点2^80个可能的叶子,或者1后跟24个零!因为您只有100k+个样本,所以您肯定是在每个树上为其各自的训练数据引导提供了一个完美的匹配。一旦你们有足够的深度去做这件事,进一步增加深度限制并没有任何作用,你们已经明显地超过了那个点。这是不可取的

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

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

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

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

    您应该期望分类器在训练数据上比在测试数据上工作得更好。您/您尝试过使用哪些参数?你在用sklearn吗?@JeremyMcGibbon是的,我在用sklearn RF分类器。我已将我的代码添加到原始帖子中。深度