Module 6 of 11 · AWS SageMaker — End-to-End ML Platform · Intermediate

Hyperparameter Tuning

Duration: 55 min

Hyperparameter tuning automates the search for optimal model parameters. This module covers HyperparameterTuner, Bayesian optimization, warm start, and best practices for efficient tuning.

What is Hyperparameter Tuning?

Hyperparameter tuning automatically searches for the best combination of hyperparameters to maximize model performance. SageMaker uses Bayesian optimization to intelligently explore the parameter space, reducing the number of training jobs needed.

Creating a HyperparameterTuner

from sagemaker.tuner import HyperparameterTuner, IntegerParameter, ContinuousParameter, CategoricalParameter
from sagemaker.xgboost import XGBoost
import sagemaker

session = sagemaker.Session()
role = 'arn:aws:iam::123456789012:role/SageMakerRole'
bucket = session.default_bucket()

# Create base estimator
xgb_estimator = XGBoost(
    entry_point='train.py',
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    framework_version='1.5',
    output_path=f's3://{bucket}/xgb-output',
    sagemaker_session=session
)

# Define hyperparameter ranges
hyperparameter_ranges = {
    'max_depth': IntegerParameter(1, 10),
    'eta': ContinuousParameter(0.1, 0.5),
    'min_child_weight': IntegerParameter(2, 10),
    'subsample': ContinuousParameter(0.5, 1.0),
    'gamma': ContinuousParameter(0, 5)
}

# Create tuner
tuner = HyperparameterTuner(
    estimator=xgb_estimator,
    objective_metric_name='validation:auc',
    hyperparameter_ranges=hyperparameter_ranges,
    metric_definitions=[
        {'Name': 'validation:auc', 'Regex': 'validation-auc=([0-9\\.]+)'}
    ],
    max_jobs=20,
    max_parallel_jobs=4,
    base_tuning_job_name='xgb-tuning'
)

# Start tuning
tuner.fit(
    {'training': f's3://{bucket}/train-data/'},
    job_name='xgb-tuning-job'
)

Bayesian Optimization Strategy

from sagemaker.tuner import HyperparameterTuner, StrategyConfig

# Configure Bayesian optimization
strategy_config = StrategyConfig(
    strategy='Bayesian',
    metric_definitions=[
        {'Name': 'validation:accuracy', 'Regex': 'accuracy=([0-9\\.]+)'}
    ]
)

tuner = HyperparameterTuner(
    estimator=xgb_estimator,
    objective_metric_name='validation:accuracy',
    hyperparameter_ranges=hyperparameter_ranges,
    max_jobs=30,
    max_parallel_jobs=5,
    strategy='Bayesian'
)

# Bayesian optimization learns from previous trials
tuner.fit({'training': f's3://{bucket}/train-data/'})

Warm Start for Tuning

from sagemaker.tuner import WarmStartConfig, WarmStartTypes

# Use results from previous tuning job
warm_start_config = WarmStartConfig(
    type=WarmStartTypes.TRANSFER_LEARNING,
    from_job_name='xgb-tuning-job-2024-01-10'
)

# Create new tuner with warm start
tuner = HyperparameterTuner(
    estimator=xgb_estimator,
    objective_metric_name='validation:auc',
    hyperparameter_ranges=hyperparameter_ranges,
    max_jobs=20,
    max_parallel_jobs=4,
    warm_start_config=warm_start_config
)

tuner.fit({'training': f's3://{bucket}/train-data/'})

Tuning Job Configuration

{
  "tuning_job_config": {
    "tuning_job_name": "xgb-tuning-job",
    "tuning_objective": {
      "metric_name": "validation:auc",
      "type": "Maximize"
    },
    "resource_limits": {
      "max_number_of_training_jobs": 20,
      "max_parallel_training_jobs": 4
    },
    "parameter_ranges": {
      "integer_parameter_ranges": [
        {
          "name": "max_depth",
          "min_value": "1",
          "max_value": "10"
        }
      ],
      "continuous_parameter_ranges": [
        {
          "name": "eta",
          "min_value": "0.1",
          "max_value": "0.5"
        }
      ]
    },
    "strategy_config": {
      "strategy": "Bayesian"
    }
  }
}

Analyzing Tuning Results

# Get best training job
best_job = tuner.best_training_job()
print(f"Best job: {best_job}")

# Get best hyperparameters
best_hyperparameters = tuner.best_estimator().hyperparameters()
print(f"Best hyperparameters: {best_hyperparameters}")

# Deploy best model
best_predictor = tuner.deploy(
    initial_instance_count=1,
    instance_type='ml.m5.large'
)

Early Stopping for Efficiency

from sagemaker.tuner import HyperparameterTuner

tuner = HyperparameterTuner(
    estimator=xgb_estimator,
    objective_metric_name='validation:auc',
    hyperparameter_ranges=hyperparameter_ranges,
    max_jobs=20,
    max_parallel_jobs=4,
    early_stopping_type='Auto'  # Enable automatic early stopping
)

tuner.fit({'training': f's3://{bucket}/train-data/'})

Quiz 1

❓ What is the primary purpose of hyperparameter tuning?

Quiz 2

❓ What optimization strategy does SageMaker use by default?

Quiz 3

❓ What is warm start in hyperparameter tuning?

Quiz 4

❓ What does early stopping do in tuning?

Quiz 5

❓ What is the objective metric in tuning?

← Previous Continue interactively → Next →

Related Courses