Spark中的随机森林

时间:2017-01-27 20:19:26

标签: python apache-spark machine-learning pyspark random-forest

所以我试图将某些文本文档分为三类。

我在spark

中编写了以下代码用于交叉验证
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
# Define a grid of hyperparameters to test:
#  - maxDepth: max depth of each decision tree in the GBT ensemble
#  - maxIter: iterations, i.e., number of trees in each GBT ensemble
# In this example notebook, we keep these values small.  In practice, to get the highest accuracy, you would likely want to try deeper trees (10 or higher) and more trees in the ensemble (>100).

paramGrid = ParamGridBuilder()\
  .addGrid(jpsa.rf.maxDepth, [2,4,10])\
  .addGrid(jpsa.rf.numTrees, [100, 250, 600,800,1000])\
  .build()

# We define an evaluation metric.  This tells CrossValidator how well we are doing by comparing the true labels with predictions.
evaluator = MulticlassClassificationEvaluator(metricName="f1", labelCol=jpsa.rf.getLabelCol(), predictionCol=jpsa.rf.getPredictionCol())
# Declare the CrossValidator, which runs model tuning for us.
cv = CrossValidator(estimator=pipeline, evaluator=evaluator, estimatorParamMaps=paramGrid,numFolds=5)

cvModel=cv.fit(jpsa.jpsa_train)

evaluator.evaluate(cvModel.transform(jpsa.jpsa_train))

我没有太多数据。 115总观察(带标签的文件)。我打破他们进入80:35训练和测试。在训练中,我使用上面的代码使用5倍交叉验证。

以上评估员对整个培训数据给出了以下内容。

evaluator.evaluate(cvModel.transform(jpsa.jpsa_train))
0.9021290600237969

我在这里使用f1,因为我无法在Spark中找到针对MulticlassEvaluator的aucROC作为评估者的选项。它确实有Binary。我知道AUC用于二进制类,但是我们可以通过绘制各种二进制类并获得它们的AUC来获得多类的组合或平均AUC。 Sri-kit学习对多类AUC也是如此。

然而,当我在测试数据上使用评估器时,我的f1分数很糟糕。

evaluator.evaluate(cvModel.transform(jpsa.jpsa_test))
0.5830903790087463

这表明它过度拟合。此外,如果我不在hyparameter搜索空间中使用1000和800树,只保留600和800,我的测试精度为69%。那意味着更多的树木会导致过度拟合?这很奇怪,因为这与随机森林的工作原理相反。更多的发辫会减少变异并导致过度拟合(事实上,ppl甚至表明有时随机的森林不会过度拟合,尽管我不同意数据和森林复杂的情况)。

这是发生在这里的事吗?更少的数据,更多的没有。树木导致过度拟合?

另外,我如何获得交叉验证准确度?目前评估人员正在进行培训数据。我不希望这是一种选择算法的措施。我想要验证数据。是否可以从此CV估算器内部获得此OOB估计值?

1 个答案:

答案 0 :(得分:0)

参数选择是开发机器学习模型的一个重要方面。要做到这一点,有多种方法。其中一个就是这个。使用50%数据(分层)进行参数选择。将此数据分为10倍。现在使用调整参数执行10次交叉验证以及网格搜索。通常,在随机森林中调整的参数是树的数量和每棵树的深度(还有其他参数,例如为每个分割选择的特征数,但通常默认参数效果很好)。

此外,确实更多的树木可以减少变化,但它太高可以增加偏差。有权衡。创建一个网格,其中树的数量从10到100不等,步长为10,50或100。