Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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_Apache Spark_Machine Learning_Pyspark_Random Forest - Fatal编程技术网

Python 火花中的随机森林

Python 火花中的随机森林,python,apache-spark,machine-learning,pyspark,random-forest,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 deci

因此,我试图将某些文本文档分为三类

我在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中找到用于MultiClass evaluator的aucROC作为evaluator的选项。它的确有二进制代码。我知道AUC是针对二进制类的,但是我们可以通过绘制各种二进制类并获得它们的AUC来得到多个类的组合或平均AUC。Sri kit learn对多类AUC也有同样的作用

然而,当我在测试数据上使用evaluator时,我的f1成绩很糟糕

evaluator.evaluate(cvModel.transform(jpsa.jpsa_test))
0.5830903790087463
这表明它安装过度。另外,如果我不在HypParameter搜索空间中使用1000和800棵树,只将其保持在600和800,那么我的测试准确率是69%。这意味着更多的树木会导致过度装修?这很奇怪,因为这与随机森林的工作原理和方式相反。更多的树木减少了变异,并导致较少的过度拟合(事实上,ppl甚至建议有时随机森林不会过度拟合,尽管我不同意数据非常少和复杂的森林会过度拟合)

这就是这里发生的事情吗?数据越少,树的数量越多,是否会导致过度拟合


另外,我如何获得交叉验证准确性的度量?目前,评估人员正在收集培训数据。我不想以此作为选择算法的标准。我想要验证数据。是否有可能从CV估计器内部获得OOB估计值?

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


此外,树的数量越多,方差越小,这是事实,但如果树的数量太多,则会增加偏差。这是一种权衡。创建一个网格,其中树的数量从10到100不等,步长为10、50或100。

我希望您在回答此问题之前检查了我的代码?。我已经做了所有这些,我的问题是为什么会这样happening@Baktaawar如果你仔细阅读答案,我已经提到,随着树木数量的增加,方差可能会减少,但偏差会增加。在你的情况下,这就是正在发生的事情。如果树的数量增加,并且根据你的偏好增加,那么它将导致拟合不足,而不是拟合过度。更多的偏差会导致不合身。高方差导致过度拟合。在我的情况下,我似乎看到了过度拟合,而不是不拟合,所以你的答案不幸与此相反,这在我看来是不正确的。希望有人能帮你找到更好的答案!祝你好运