We use hyperparameter tuning to find the best settings for a machine learning model. CrossValidator helps test these settings by checking how well the model works on different parts of the data.
Hyperparameter tuning with CrossValidator in Apache Spark
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder from pyspark.ml.evaluation import BinaryClassificationEvaluator crossval = CrossValidator( estimator=model, estimatorParamMaps=paramGrid, evaluator=BinaryClassificationEvaluator(), numFolds=3 )
estimator is the model or pipeline you want to tune.
estimatorParamMaps is a grid of parameters to try.
paramGrid = ParamGridBuilder() \
.addGrid(model.maxDepth, [2, 4, 6]) \
.addGrid(model.maxBins, [20, 40]) \
.build()crossval = CrossValidator(
estimator=model,
estimatorParamMaps=paramGrid,
evaluator=BinaryClassificationEvaluator(),
numFolds=5
)This program loads sample data, sets up a decision tree, defines a grid of parameters, and uses CrossValidator to find the best maxDepth and maxBins. It prints the best values found.
from pyspark.sql import SparkSession from pyspark.ml.classification import DecisionTreeClassifier from pyspark.ml.evaluation import BinaryClassificationEvaluator from pyspark.ml.tuning import CrossValidator, ParamGridBuilder # Start Spark session spark = SparkSession.builder.appName('HyperparameterTuning').getOrCreate() # Load sample data data = spark.read.format('libsvm').load('data/mllib/sample_libsvm_data.txt') # Create a Decision Tree model model = DecisionTreeClassifier(labelCol='label', featuresCol='features') # Create parameter grid to search paramGrid = ParamGridBuilder() \ .addGrid(model.maxDepth, [2, 4]) \ .addGrid(model.maxBins, [20, 40]) \ .build() # Create evaluator evaluator = BinaryClassificationEvaluator() # Create CrossValidator crossval = CrossValidator( estimator=model, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=3 ) # Run cross-validation, and choose the best set of parameters. cvModel = crossval.fit(data) # Print the best parameters bestModel = cvModel.bestModel print(f"Best maxDepth: {bestModel._java_obj.getMaxDepth()}") print(f"Best maxBins: {bestModel._java_obj.getMaxBins()}") spark.stop()
CrossValidator splits data into parts to test model settings fairly.
Try a small grid first to save time.
Use BinaryClassificationEvaluator for binary problems; use others for different tasks.
Hyperparameter tuning finds the best model settings.
CrossValidator tests these settings using multiple data splits.
ParamGridBuilder helps create combinations of parameters to try.
Practice
CrossValidator in Apache Spark's machine learning pipeline?Solution
Step 1: Understand CrossValidator's role
CrossValidator splits data into training and validation sets multiple times to evaluate model performance.Step 2: Identify the purpose of hyperparameter tuning
It tests different hyperparameter combinations to find the best model settings.Final Answer:
To find the best hyperparameters by testing multiple data splits -> Option DQuick Check:
CrossValidator = Best hyperparameters [OK]
- Thinking CrossValidator trains on full data without validation
- Confusing CrossValidator with data cleaning tools
- Assuming CrossValidator is for visualization only
ParamGridBuilder in Spark ML?Solution
Step 1: Recall ParamGridBuilder syntax
ParamGridBuilder is instantiated, thenaddGridis called with parameter and list of values.Step 2: Check each option's syntax
paramGrid = ParamGridBuilder().addGrid(model.maxDepth, [2, 5]).build() correctly callsParamGridBuilder()thenaddGrid(model.maxDepth, [2, 5])and finallybuild().Final Answer:
paramGrid = ParamGridBuilder().addGrid(model.maxDepth, [2, 5]).build() -> Option AQuick Check:
ParamGridBuilder() + addGrid(param, values) + build() [OK]
- Calling addGrid without parentheses on ParamGridBuilder
- Using assignment inside addGrid instead of parameters
- Swapping parameter and values order in addGrid
cvModel.bestModel.getMaxDepth()?
from pyspark.ml.classification import DecisionTreeClassifier from pyspark.ml.tuning import CrossValidator, ParamGridBuilder from pyspark.ml.evaluation import BinaryClassificationEvaluator model = DecisionTreeClassifier() paramGrid = ParamGridBuilder().addGrid(model.maxDepth, [2, 4]).build() evaluator = BinaryClassificationEvaluator() cv = CrossValidator(estimator=model, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=2) cvModel = cv.fit(trainingData) best_depth = cvModel.bestModel.getMaxDepth()
Solution
Step 1: Understand CrossValidator fitting
CrossValidator tries all parameter combinations and selects the best model based on evaluator metric.Step 2: Interpret bestModel.getMaxDepth()
The bestModel will have maxDepth set to the value that gave the best validation score, either 2 or 4.Final Answer:
2 or 4 depending on which depth gave better validation metric -> Option BQuick Check:
bestModel maxDepth = best param tested [OK]
- Assuming bestModel always uses first grid value
- Thinking getMaxDepth() method does not exist
- Calculating average of grid values instead of selecting best
from pyspark.ml.classification import LogisticRegression from pyspark.ml.tuning import CrossValidator, ParamGridBuilder from pyspark.ml.evaluation import BinaryClassificationEvaluator lr = LogisticRegression() paramGrid = ParamGridBuilder().addGrid(lr.regParam, [0.1, 0.01]) evaluator = BinaryClassificationEvaluator() cv = CrossValidator(estimator=lr, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=3) cvModel = cv.fit(trainingData)
Solution
Step 1: Check ParamGridBuilder usage
ParamGridBuilder requires calling.build()to create the parameter grid list.Step 2: Identify missing method call
The code misses.build()afteraddGrid, soparamGridis not a valid parameter map list.Final Answer:
Missing .build() call after ParamGridBuilder() -> Option AQuick Check:
ParamGridBuilder().addGrid(...).build() required [OK]
- Forgetting to call .build() after addGrid
- Using wrong evaluator for classification
- Setting numFolds less than 2 (valid but uncommon)
numTrees with values [10, 20] and maxDepth with values [5, 10]. How many total models will CrossValidator train if numFolds=3?Solution
Step 1: Calculate total hyperparameter combinations
numTrees has 2 values, maxDepth has 2 values, so total combinations = 2 * 2 = 4.Step 2: Multiply by number of folds
CrossValidator trains each combination on each fold, so total models = 4 * 3 = 12.Step 3: Re-check calculation
Wait, the question asks how many total models trained. Each fold trains one model per combination, so total = combinations * folds = 4 * 3 = 12.Final Answer:
12 models -> Option CQuick Check:
Combinations * folds = 12 [OK]
- Multiplying number of values incorrectly
- Forgetting to multiply by number of folds
- Confusing total models with total parameter combos
Ready to prove it?
Pass the test and this pattern moves unknown
