Also ich versuche, bestimmte Textdokumente in drei Klassen zu klassifizieren.Random Forest in Spark
Ich schrieb den folgenden Code für Kreuzvalidierung in Funken
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))
ich nicht viel Daten haben. 115 Gesamtbeobachtung (Dokumente mit Etiketten). Ich breche sie in 80:35 Training und Test. Auf dem Training verwende ich 5-fache Kreuzvalidierung mit dem obigen Code.
Der obige Evaluator gab mir die folgenden Trainingsdaten.
evaluator.evaluate(cvModel.transform(jpsa.jpsa_train))
0.9021290600237969
Ich bin mit f1 hier, da ich nicht in der Lage bin AUCROC für MulticlassEvaluator Spark als Option für Evaluator zu finden. Es hat es für Binary. Ich weiß, AUC ist für binäre Klasse, aber dann können wir eine kombinierte oder durchschnittliche AUC für Multi-Klasse erhalten, indem Sie verschiedene binäre Klassen zeichnen und ihre AUC erhalten. Sri-kit learn macht dasselbe für die AUC von mehreren Klassen.
Wenn ich jedoch das Auswertungsprogramm auf Testdaten verwende, ist mein f1-Score miserabel.
evaluator.evaluate(cvModel.transform(jpsa.jpsa_test))
0.5830903790087463
Dies deutet darauf hin, dass es überbaut ist. Auch wenn ich keine 1000 und 800 Bäume im Suchraum von hyparameter benutze und sie einfach auf 600 und 800 halte, ist meine Testgenauigkeit 69%. Das heißt, dass mehr Bäume zu Überanpassungen führen? Was ist seltsam, das ist im Gegensatz zu was und wie Random Forests arbeiten. Mehr Bäume reduzieren die Varianz und führen zu weniger Überanpassung (in der Tat schlagen die Leute manchmal sogar vor, dass zufällige Wälder nicht überfrachtet werden, obwohl ich nicht der Meinung bin, dass dies mit sehr wenig Daten und komplexem Wald möglich ist).
Ist das hier passiert? Weniger Daten und mehr nein. von Bäumen, die zum Überanpassen führen?
Auch wie bekomme ich ein Maß für die Genauigkeit der Kreuzvalidierung? Zur Zeit hat der Evaluator Trainingsdaten. Ich will das nicht als Maßnahme, um den Algo zu wählen. Ich möchte die Validierungsdaten. Ist es möglich, diese OOB-Schätzung intern von diesem CV-Schätzer zu erhalten?
Ich hoffe, Sie haben meinen Code vor der Beantwortung dieser Frage überprüft. Ich habe all das getan und meine Frage ist, warum das passiert – Baktaawar
@Baktaawar Wenn Sie durch die Antwort gehen, habe ich erwähnt, dass, wenn die Anzahl der Bäume zunimmt, Varianz abnehmen kann, aber die Voreingenommenheit wird zunehmen. In Ihrem Fall ist das was passiert. – prashanth
Wenn die Nr. von Bäumen erhöhen und wie Sie Bias erhöht, dann würde es zu Unterbau führen und nicht überanpassen. Mehr Voreingenommenheit führt zu Unterausstattung. Hohe Varianz führt zu Überanpassung. In meinem Fall scheint es, dass ich Overfitting und nicht unterfüttern sehe, also spricht Ihre Antwort leider Gegenteil, das meiner Meinung nach nicht richtig ist – Baktaawar