apache-spark random-forest cross-validation apache-spark-ml apache-spark-mllib

apache spark - ¿Cómo cruzar validar el modelo de RandomForest?



apache-spark random-forest (2)

Para construir sobre la gran respuesta de zero323 usando el clasificador de bosque aleatorio, aquí hay un ejemplo similar para el Regresor de bosque aleatorio:

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)

Fuente de la métrica del evaluador: https://spark.apache.org/docs/latest/api/scala/#org.apache.spark.ml.evaluation.RegressionEvaluator

Quiero evaluar un bosque aleatorio que está siendo entrenado en algunos datos. ¿Hay alguna utilidad en Apache Spark para hacer lo mismo o tengo que realizar la validación cruzada manualmente?


ML proporciona la clase CrossValidator que se puede usar para realizar la validación cruzada y la búsqueda de parámetros. Suponiendo que sus datos ya están preprocesados, puede agregar la validación cruzada de la siguiente manera:

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

Utilizando 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]) paramGrid = (ParamGridBuilder. .addGrid(rf.numTrees, [3, 10]) .addGrid(...) # Add other parameters .build()) crossval = CrossValidator( estimator=pipeline, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=numFolds) model = crossval.fit(trainingData)