Voglio valutare una foresta casuale che viene addestrata su alcuni dati. C'è qualche utilità in Apache Spark per fare lo stesso o devo eseguire la convalida incrociata manualmente?Come convalidare il modello RandomForest?
17
A
risposta
31
ML fornisce la classe CrossValidator
che può essere utilizzata per eseguire la convalida incrociata e la ricerca di parametri. Supponendo che i dati sono già pre-elaborato è possibile aggiungere la convalida incrociata come segue:
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.tuning.{ParamGridBuilder, CrossValidator}
import org.apache.spark.ml.classification.RandomForestClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
// [label: double, features: vector]
trainingData org.apache.spark.sql.DataFrame = ???
val nFolds: Int = ???
val NumTrees: Int = ???
val metric: String = ???
val rf = new RandomForestClassifier()
.setLabelCol("label")
.setFeaturesCol("features")
.setNumTrees(NumTrees)
val pipeline = new Pipeline().setStages(Array(rf))
val paramGrid = new ParamGridBuilder().build() // No parameter search
val evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("label")
.setPredictionCol("prediction")
// "f1" (default), "weightedPrecision", "weightedRecall", "accuracy"
.setMetricName(metric)
val cv = new CrossValidator()
// ml.Pipeline with ml.classification.RandomForestClassifier
.setEstimator(pipeline)
// ml.evaluation.MulticlassClassificationEvaluator
.setEvaluator(evaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(nFolds)
val model = cv.fit(trainingData) // trainingData: DataFrame
Utilizzando PySpark:
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
trainingData = ... # DataFrame[label: double, features: vector]
numFolds = ... # Integer
rf = RandomForestClassifier(labelCol="label", featuresCol="features")
evaluator = MulticlassClassificationEvaluator() # + other params as in Scala
pipeline = Pipeline(stages=[rf])
crossval = CrossValidator(
estimator=pipeline,
estimatorParamMaps=paramGrid,
evaluator=evaluator,
numFolds=numFolds)
model = crossval.fit(trainingData)
1
Per costruire il grande risposta di zero323 usando a caso Foresta classificatore, ecco un esempio simile per Random Foresta Regressor:
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.tuning.{ParamGridBuilder, CrossValidator}
import org.apache.spark.ml.regression.RandomForestRegressor // CHANGED
import org.apache.spark.ml.evaluation.RegressionEvaluator // CHANGED
import org.apache.spark.ml.feature.{VectorAssembler, VectorIndexer}
val numFolds = ??? // Integer
val data = ??? // DataFrame
// Training (80%) and test data (20%)
val Array(train, test) = data.randomSplit(Array(0.8,0.2))
val featuresCols = data.columns
val va = new VectorAssembler()
va.setInputCols(featuresCols)
va.setOutputCol("rawFeatures")
val vi = new VectorIndexer()
vi.setInputCol("rawFeatures")
vi.setOutputCol("features")
vi.setMaxCategories(5)
val regressor = new RandomForestRegressor()
regressor.setLabelCol("events")
val metric = "rmse"
val evaluator = new RegressionEvaluator()
.setLabelCol("events")
.setPredictionCol("prediction")
// "rmse" (default): root mean squared error
// "mse": mean squared error
// "r2": R2 metric
// "mae": mean absolute error
.setMetricName(metric)
val paramGrid = new ParamGridBuilder().build()
val cv = new CrossValidator()
.setEstimator(regressor)
.setEvaluator(evaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(numFolds)
val model = cv.fit(train) // train: DataFrame
val predictions = model.transform(test)
predictions.show
val rmse = evaluator.evaluate(predictions)
println(rmse)
Evaluator fonte metrica: https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.ml.evaluation.RegressionEvaluator
Problemi correlati
- 1. come convalidare il modello in forma presentare
- 2. Diversi risultati con randomForest() e il caso randomForest (metodo = "rf")
- 3. inventare invitable non convalidare il modello
- 4. Come convalidare l'unicità di has_many: attraverso il modello di join?
- 5. Come generare RandomForest Classifier da python?
- 6. Come ponderare le classi in un'implementazione RandomForest
- 7. come usare classwt in randomForest of R?
- 8. Come convalidare il certificato X509?
- 9. Come posso estrarre RandomForest da R per l'utilizzo in produzione?
- 10. R randomForest per la classificazione
- 11. Ruby on Rails: come convalidare un modello senza Active Record?
- 12. Come convalidare i locali di rendere modello in rspec
- 13. RandomForest for Regression in R
- 14. Come convalidare la corrispondenza del modello nella textarea?
- 15. Come convalidare un non-modello (e anche non-oggetto) campo
- 16. Convalidare il mio modulo
- 17. Curva ROC per classificazione da randomForest
- 18. Come convalidare il tag del valore stringa vuoto in xsd
- 19. Per convalidare o non convalidare il campo booleano
- 20. Elixir Ecto: come convalidare il vincolo di chiave esterna?
- 21. Come convalidare PasswordBox WPF
- 22. Problema con i vettori randomForest e long
- 23. Modo corretto per convalidare gli oggetti del modello Django?
- 24. Come convalidare un JTextField?
- 25. Come convalidare scss
- 26. Come convalidare un array?
- 27. Come convalidare un'espressione regolare?
- 28. Come convalidare una data nei binari?
- 29. intesa Backbone Modello set, convalidare e modificare i callback
- 30. Come convalidare un passaporto?
Sei sicuro che questo funzioni per leave-one-out? La chiamata kFold() sotto il cofano non sembra determinare in modo deterministico due lunghezze N-1 e 1. Quando eseguo il codice sopra con un modello RegressionEvaluator e Lazo ottengo: Eccezione nel thread "main" java.lang .IllegalArgumentException: requisito non riuscito: non è stato aggiunto nulla a questo riepilogo. – paradiso
No, sono abbastanza sicuro che non sia così. 'MLUtils.kFold' sta usando' BernoulliCellSampler' per determinare la divisione. D'altra parte, il costo di esecuzione della convalida incrociata di permessi one-out in Spark è probabilmente troppo alto per essere reso praticabile nella pratica. – zero323
Ciao @ zero323, quando si imposta una metrica nell'oggetto Evaluator come .setMetricName ("precisione"). La mia domanda è, come posso ottenere quelle metriche calulate durante il processo di allenamento? (Si prega di fare riferimento a questa domanda: http://stackoverflow.com/questions/37778532/how-to-get-precision-recall-using-crossvalidator-for-training-naivebayes-model-u) – dbustosp