0

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?

Antwort

0

Die Parameterauswahl ist ein wichtiger Aspekt bei der Entwicklung von Maschinenlernmodellen. Um dies zu tun, gibt es mehrere Möglichkeiten. Einer von ihnen wäre dieser. Verwenden Sie 50% Daten (stratifiziert) für die Parameterauswahl. Teilen Sie diese Daten in 10 Falten. Führen Sie nun eine 10-fache Kreuzvalidierung zusammen mit der Rastersuche mit den Optimierungsparametern durch. Normalerweise sind die Parameter zum Einstellen einer zufälligen Gesamtstruktur die Anzahl der Bäume und die Tiefe jedes Baums (Es gibt auch andere Parameter, wie die Anzahl der für jeden Teil zu wählenden Merkmale, aber im Allgemeinen funktioniert der Standardparameter gut).

Es ist auch wahr, dass eine höhere Anzahl von Bäumen die Varianz reduzieren kann, aber es ist zu hoch, um die Verzerrung zu erhöhen. Es gibt einen Kompromiss. Erstellen Sie ein Raster mit der Anzahl der Bäume von 10 bis 100 mit Schritt von 10, 50 oder 100.

+0

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

+0

@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

+0

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

Verwandte Themen