2017-07-25 1 views
1

Il y a une partie du code ci-dessous; Je voudrais savoir comment puis-je évaluer mes prévisions? Si, je veux savoir l'importance de ma fonctionnalité est-il un truc pour utiliser le featureImportances de RandomForestRegressionModel? Dois-je passer directement à un RandomForestRegressionModel et ne pas utiliser un PipelineModel? J'ai lu que l'utilisation d'un Pipeline pouvait donner de meilleurs résultats, c'est pourquoi je l'utilise. J'ai essayé d'utiliser un RegressionEvaluator mais je ne comprends pas ce que je veux. Ou devrais-je simplement penser simple et convertir mon DataFrame en RDD et utiliser le RegressionMetrics pour obtenir l'erreur moyenne quadratique. Pour résumer, j'ai juste besoin de savoir quelle est la meilleure méthode pour évaluer ma prévision.Évaluez ma prévision à l'aide d'un modèle de pipeline

val assembler = new VectorAssembler() 
    .setInputCols(Array("customers", "year", "month", "dayOfMonth", "dayOfWeek", "weekOfYear", "dayOfYear")) 
    .setOutputCol("features") 

val limitDate = "2017-04-01" 
val trainingData = DF_2.filter(DF_2("time").lt(lit(limitDate))) 
//trainingData.printSchema() 

val rf = new RandomForestRegressor() 
    .setNumTrees(60) 
    .setMaxDepth(25) 
    .setMaxBins(100) 
    .setLabelCol("amount") 
    .setFeaturesCol("features") 

val pipeline = new Pipeline().setStages(Array(assembler, rf)) 

//Train the model 
val model = pipeline.fit(trainingData) 

//Make predictions 
val predictions = model.transform(DF_2) 

Répondre

0

Pour ceux qui ont besoin d'une réponse; Voici comment je traite ce problème.

Vous pouvez "transformer"/"cast" votre modèle de pipeline au type u besoin en utilisant asInstanceOf comme ceci:

val pipeline = new Pipeline().setStages(Array(assembler, rf)) 
val newModel = model.stages("NumberStage").asInstanceOf[TheModelYouWant] 

changement NumberStage avec l'index de votre algorithme dans votre pipeline, dans mon Pipeline il était 1. (Pour rf)

Modifier TheModelYouWant pour le type du modèle dont vous avez besoin, dans mon cas c'était RandomForestRegressionModel.

Ensuite, vous pouvez créer votre propre Evaluator que vous souhaitez utiliser pour votre modèle.

Si vous voulez transformer votre DF dans un RDD [(Double, Double)], u peut utiliser .rdd & .map:

val predictionsAndLabels= df.select("amount", "prediction").rdd.map {case (row) => ((row.getInt(0).toDouble), (row.getDouble(1)))} 

J'ai maintenant un RDD [(Double, Double)] et vous pouvez l'utiliser pour RegressionMetrics. J'espère que cela aidera quelqu'un.