2017-12-29 13 views
1

Ich arbeite mit dem ML-Paket für Regressionszwecke und bekomme gute Ergebnisse mit meinen Daten. Ich bin jetzt auf einmal mehrere Metriken zu erhalten, wie es gerade jetzt versuchen, ich tue, was durch die Beispiele hier vorgeschlagen wird: https://spark.apache.org/docs/2.1.0/ml-classification-regression.htmlMehrere Regressionsmetriken gleichzeitig erhalten

Grundsätzlich ist der Code in den Beispielen ist dies:

val evaluator = new RegressionEvaluator() 
    .setLabelCol("label") 
    .setPredictionCol("prediction") 
    .setMetricName("rmse") 
val rmse = evaluator.evaluate(predictions) 

das gibt mir die RMSE für meine Testdaten, die in Ordnung ist, aber ich bin auch daran interessiert, MSE, MAE, MAPE, R² und Q² ich also an der Dokumentation sah hier:

https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/ml/evaluation/RegressionEvaluator.html#metricName%28%29

wo ich sehe, dass ich RMSE, MSE, MAE und R² bekommen kann, aber es scheint nicht, dass ich sie auf einmal berechnen kann, indem ich die Datenzeilen nur einmal und nicht 5 Mal durchführe, wie der Beispielcode andeuten würde um es zu tun.

Wie kann ich diese Single-Pass-Berechnung erreichen?

Dann gibt es MAPE und Q² fehlt, wie kann ich diese auch berechnen, idealerweise während der Berechnung der 4 anderen?

Grüße

Antwort

0

auf den Quellcode der Suche nach RegressionEvaluator, entdeckte ich, dass es durch die Schaffung eines RegressionMetrics Objekt implementiert wird, die auf einmal über die Verwendung eines MultivariateStatisticalSummary alle Statistiken berechnet

Nun suchen weiter an der Dokumentation, konnte ich verstehen, dass Q² ist nur R² auf dem Validierungs-Set, so dass der ursprüngliche Code mich abgedeckt hat.

Aber für MAPE, die beiden zu MultivariateStatisticalSummary gegebenen Bedingungen waren nicht genug, so hatte ich ein neues wie folgt hinzuzufügen:

if (observation != 0) 
    math.abs(observation - prediction)/observation 
else 
    0 

Und dann MAPE ist gerade dies:

def meanAbsolutePercentageError: Double = { 
    summary.mean(2) 
} 

So jetzt habe ich alle Metriken, die ich brauche und weil es MultivariateStatisticalSummary verwendet, bin ich zuversichtlich, dass der Datensatz nur einmal verarbeitet wird.