Skip to content

ML Algorithms and Model Evaluation

Supervised Learning Algorithms

Linear Learner

Use Cases - Binary classification - Multi-class classification - Regression - Linear relationships in data

Algorithm Types - Logistic regression (classification) - Linear regression (regression) - Supports L1 (Lasso) and L2 (Ridge) regularization

Hyperparameters

from sagemaker import LinearLearner

linear = LinearLearner(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    predictor_type='binary_classifier',  # or 'multiclass_classifier', 'regressor'
    binary_classifier_model_selection_criteria='accuracy',

    # Key hyperparameters
    learning_rate=0.1,
    mini_batch_size=1000,
    epochs=15,
    l1=0.0,  # L1 regularization
    wd=0.0,  # L2 regularization (weight decay)
    use_bias=True,
    num_models=32,  # Train multiple models with different initializations
    num_calibration_samples=10000000
)

Input Format - RecordIO-protobuf (recommended for best performance) - CSV (first column is label) - Pipe mode for large datasets

When to Use - Fast training required - Sparse data (text features, one-hot encoded) - Linear separable data - Baseline model - Interpretable model needed

XGBoost

Characteristics - Gradient boosting trees - Handles missing values - Built-in regularization - Feature importance - Excellent performance

Hyperparameters

from sagemaker.xgboost import XGBoost

xgb = XGBoost(
    entry_point='train.py',
    framework_version='1.5-1',
    hyperparameters={
        'max_depth': 5,         # Tree depth
        'eta': 0.2,             # Learning rate
        'objective': 'binary:logistic',  # or 'multi:softmax', 'reg:squarederror'
        'num_round': 100,       # Number of boosting rounds
        'subsample': 0.8,       # Row sampling
        'colsample_bytree': 0.8,  # Column sampling
        'alpha': 0,             # L1 regularization
        'lambda': 1,            # L2 regularization
        'gamma': 0,             # Minimum loss reduction for split
        'min_child_weight': 1,  # Minimum sum of instance weight in child
        'scale_pos_weight': 1,  # Balance of positive/negative weights
        'eval_metric': 'auc'    # Evaluation metric
    },
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge'
)

Feature Importance

import xgboost as xgb
import matplotlib.pyplot as plt

# Train model
model = xgb.XGBClassifier()
model.fit(X_train, y_train)

# Plot feature importance
xgb.plot_importance(model, max_num_features=20)
plt.show()

# Get importance scores
importance_dict = model.get_booster().get_score(importance_type='weight')

When to Use - Structured/tabular data - Non-linear relationships - Feature importance needed - High accuracy required - Moderate dataset size

Random Cut Forest (RCF)

Use Case: Anomaly Detection - Unsupervised algorithm - Detects outliers in data - Assigns anomaly scores

Configuration

from sagemaker import RandomCutForest

rcf = RandomCutForest(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    num_samples_per_tree=256,
    num_trees=50,
    eval_metrics=['accuracy', 'precision_recall_fscore']
)

rcf.fit(rcf.record_set(training_data))

# Predict anomaly scores
predictor = rcf.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')
results = predictor.predict(test_data)

When to Use - Fraud detection - Network intrusion detection - System health monitoring - Quality control

K-Means

Use Case: Clustering - Unsupervised learning - Groups similar data points - Requires specifying K (number of clusters)

Configuration

from sagemaker import KMeans

kmeans = KMeans(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    k=10,  # Number of clusters
    init_method='kmeans++',  # or 'random'
    max_iterations=100,
    tol=0.0001,
    extra_center_factor='auto'
)

kmeans.fit(kmeans.record_set(data))

# Get cluster assignments
predictor = kmeans.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')
cluster_assignments = predictor.predict(test_data)

Choosing K

from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt

# Elbow method
inertias = []
K_range = range(2, 11)

for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(X)
    inertias.append(kmeans.inertia_)

plt.plot(K_range, inertias)
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()

# Silhouette score
silhouette_scores = []
for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    labels = kmeans.fit_predict(X)
    score = silhouette_score(X, labels)
    silhouette_scores.append(score)

When to Use - Customer segmentation - Image compression - Document clustering - Market basket analysis

PCA (Principal Component Analysis)

Use Case: Dimensionality Reduction - Reduces number of features - Preserves variance - Removes correlation

Configuration

from sagemaker import PCA

pca = PCA(
    role=role,
    instance_count=1,
    instance_type='ml.m5.xlarge',
    num_components=10,  # Number of principal components
    algorithm_mode='regular',  # or 'randomized' for large datasets
    subtract_mean=True
)

pca.fit(pca.record_set(data))

# Transform data
predictor = pca.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')
transformed_data = predictor.predict(test_data)

Choosing Number of Components

from sklearn.decomposition import PCA
import numpy as np

pca = PCA()
pca.fit(X)

# Cumulative explained variance
cumsum = np.cumsum(pca.explained_variance_ratio_)

# Find number of components for 95% variance
n_components = np.argmax(cumsum >= 0.95) + 1
print(f"Components needed for 95% variance: {n_components}")

When to Use - High-dimensional data - Visualization (2D/3D) - Noise reduction - Speed up training - Feature extraction

Deep Learning Algorithms

Image Classification

Use Case - Classify images into categories - Transfer learning with ResNet - Supports multi-label classification

Configuration

from sagemaker.image_uris import retrieve

training_image = retrieve('image-classification', region, version='latest')

image_classifier = sagemaker.estimator.Estimator(
    training_image,
    role=role,
    instance_count=1,
    instance_type='ml.p3.2xlarge',
    output_path='s3://bucket/output',
    hyperparameters={
        'num_layers': 18,  # ResNet layers: 18, 34, 50, 101, 152
        'use_pretrained_model': 1,  # Transfer learning
        'num_classes': 10,
        'num_training_samples': 50000,
        'mini_batch_size': 128,
        'epochs': 30,
        'learning_rate': 0.1,
        'optimizer': 'sgd',  # or 'adam', 'rmsprop'
        'momentum': 0.9,
        'weight_decay': 0.0001,
        'augmentation_type': 'crop_color_transform'
    }
)

Input Format - RecordIO (recommended) - Image files (.jpg, .png) with lst file

When to Use - Object recognition - Medical image analysis - Satellite imagery - Quality inspection

Object Detection

Algorithms - Single Shot Detector (SSD) - Finds and classifies objects - Bounding box coordinates

Configuration

object_detector = sagemaker.estimator.Estimator(
    retrieve('object-detection', region),
    role=role,
    instance_count=1,
    instance_type='ml.p3.2xlarge',
    hyperparameters={
        'base_network': 'resnet-50',  # or 'vgg-16'
        'num_classes': 20,
        'num_training_samples': 16551,
        'mini_batch_size': 32,
        'epochs': 30,
        'learning_rate': 0.001,
        'optimizer': 'sgd',
        'momentum': 0.9,
        'weight_decay': 0.0005,
        'overlap_threshold': 0.5,
        'nms_threshold': 0.45,
        'image_shape': 300,
        'label_width': 350,
        'num_training_samples': 16551
    }
)

Semantic Segmentation

Use Case - Pixel-level classification - Medical imaging - Autonomous vehicles

Configuration

semantic_segmentation = sagemaker.estimator.Estimator(
    retrieve('semantic-segmentation', region),
    role=role,
    instance_count=1,
    instance_type='ml.p3.2xlarge',
    hyperparameters={
        'backbone': 'resnet-50',  # or 'resnet-101'
        'algorithm': 'fcn',  # or 'psp', 'deeplab'
        'use_pretrained_model': 'True',
        'crop_size': 240,
        'num_classes': 21,
        'epochs': 30,
        'learning_rate': 0.0001,
        'optimizer': 'adam',
        'mini_batch_size': 16,
        'validation_mini_batch_size': 16,
        'num_training_samples': 1464
    }
)

DeepAR

Use Case: Time Series Forecasting - Probabilistic forecasts - Multiple related time series - Handles missing values

Configuration

deepar = sagemaker.estimator.Estimator(
    retrieve('forecasting-deepar', region),
    role=role,
    instance_count=1,
    instance_type='ml.c5.2xlarge',
    hyperparameters={
        'time_freq': 'D',  # Daily frequency
        'context_length': 30,  # How much history to use
        'prediction_length': 7,  # Forecast horizon
        'num_cells': 40,  # LSTM cells
        'num_layers': 3,
        'likelihood': 'gaussian',  # or 'beta', 'negative-binomial', 'student-T'
        'epochs': 100,
        'mini_batch_size': 32,
        'learning_rate': 0.001,
        'dropout_rate': 0.1,
        'early_stopping_patience': 10
    }
)

Input Format

{
  "start": "2020-01-01 00:00:00",
  "target": [10.0, 12.5, 15.2, ...],
  "cat": [0, 1],  # Categorical features
  "dynamic_feat": [[1.0, 1.1, ...], [2.0, 2.1, ...]]  # Time-varying features
}

NLP Algorithms

BlazingText

Modes 1. Word2Vec: Word embeddings 2. Text Classification: Supervised classification

Word2Vec Configuration

blazingtext = sagemaker.estimator.Estimator(
    retrieve('blazingtext', region),
    role=role,
    instance_count=1,
    instance_type='ml.c5.xlarge',
    hyperparameters={
        'mode': 'skipgram',  # or 'cbow', 'batch_skipgram'
        'vector_dim': 100,
        'window_size': 5,
        'negative_samples': 5,
        'min_count': 5,
        'epochs': 5,
        'learning_rate': 0.05,
        'sampling_threshold': 0.0001
    }
)

Text Classification

blazingtext_classifier = sagemaker.estimator.Estimator(
    retrieve('blazingtext', region),
    role=role,
    instance_count=1,
    instance_type='ml.c5.xlarge',
    hyperparameters={
        'mode': 'supervised',
        'epochs': 10,
        'min_count': 2,
        'learning_rate': 0.05,
        'vector_dim': 10,
        'early_stopping': 'True',
        'patience': 4,
        'min_epochs': 5,
        'word_ngrams': 2
    }
)

Sequence2Sequence

Use Case - Machine translation - Text summarization - Speech recognition

Configuration

seq2seq = sagemaker.estimator.Estimator(
    retrieve('seq2seq', region),
    role=role,
    instance_count=1,
    instance_type='ml.p3.2xlarge',
    hyperparameters={
        'num_layers_encoder': 2,
        'num_layers_decoder': 2,
        'num_embed_source': 512,
        'num_embed_target': 512,
        'encoder_rnn_type': 'gru',  # or 'lstm'
        'decoder_rnn_type': 'gru',
        'attention_type': 'mlp',
        'batch_size': 64,
        'optimizer': 'adam',
        'learning_rate': 0.0003,
        'epochs': 10
    }
)

Model Evaluation Metrics

Classification Metrics

Confusion Matrix

from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
import matplotlib.pyplot as plt

# Compute confusion matrix
cm = confusion_matrix(y_true, y_pred)

# Visualize
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.ylabel('True Label')
plt.xlabel('Predicted Label')
plt.show()

# Detailed report
print(classification_report(y_true, y_pred))

Binary Classification Metrics

from sklearn.metrics import (
    accuracy_score, precision_score, recall_score, f1_score,
    roc_auc_score, roc_curve, precision_recall_curve, average_precision_score
)

# Basic metrics
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)

# AUC metrics
auc = roc_auc_score(y_true, y_pred_proba)
avg_precision = average_precision_score(y_true, y_pred_proba)

# ROC curve
fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba)
plt.plot(fpr, tpr, label=f'AUC = {auc:.3f}')
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()

# Precision-Recall curve
precision_curve, recall_curve, _ = precision_recall_curve(y_true, y_pred_proba)
plt.plot(recall_curve, precision_curve, label=f'AP = {avg_precision:.3f}')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.legend()
plt.show()

Multi-Class Metrics

from sklearn.metrics import accuracy_score, precision_recall_fscore_support

# Overall accuracy
accuracy = accuracy_score(y_true, y_pred)

# Per-class metrics
precision, recall, f1, support = precision_recall_fscore_support(
    y_true, y_pred, average=None
)

# Macro average (unweighted mean)
precision_macro, recall_macro, f1_macro, _ = precision_recall_fscore_support(
    y_true, y_pred, average='macro'
)

# Weighted average (weighted by support)
precision_weighted, recall_weighted, f1_weighted, _ = precision_recall_fscore_support(
    y_true, y_pred, average='weighted'
)

Regression Metrics

Common Metrics

from sklearn.metrics import (
    mean_absolute_error, mean_squared_error, r2_score,
    mean_absolute_percentage_error, explained_variance_score
)
import numpy as np

# MAE: Mean Absolute Error
mae = mean_absolute_error(y_true, y_pred)

# MSE: Mean Squared Error
mse = mean_squared_error(y_true, y_pred)

# RMSE: Root Mean Squared Error
rmse = np.sqrt(mse)

# R-squared
r2 = r2_score(y_true, y_pred)

# MAPE: Mean Absolute Percentage Error
mape = mean_absolute_percentage_error(y_true, y_pred)

# Explained variance
exp_var = explained_variance_score(y_true, y_pred)

print(f"MAE: {mae:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"RΒ²: {r2:.4f}")
print(f"MAPE: {mape:.4f}%")

Residual Analysis

residuals = y_true - y_pred

# Residual plot
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Predicted Values')
plt.ylabel('Residuals')
plt.show()

# Histogram of residuals
plt.hist(residuals, bins=30, edgecolor='black')
plt.xlabel('Residual Value')
plt.ylabel('Frequency')
plt.show()

# Q-Q plot
import scipy.stats as stats
stats.probplot(residuals, dist="norm", plot=plt)
plt.show()

Cross-Validation

K-Fold Cross-Validation

from sklearn.model_selection import cross_val_score, cross_validate

# Simple cross-validation
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"Accuracy: {scores.mean():.4f} (+/- {scores.std() * 2:.4f})")

# Multiple metrics
scoring = ['accuracy', 'precision', 'recall', 'f1', 'roc_auc']
scores = cross_validate(model, X, y, cv=5, scoring=scoring)

for metric in scoring:
    print(f"{metric}: {scores[f'test_{metric}'].mean():.4f}")

Stratified K-Fold

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

for train_idx, val_idx in skf.split(X, y):
    X_train, X_val = X[train_idx], X[val_idx]
    y_train, y_val = y[train_idx], y[val_idx]

    model.fit(X_train, y_train)
    score = model.score(X_val, y_val)
    print(f"Fold score: {score:.4f}")

Model Comparison

Statistical Tests

from scipy import stats

# Paired t-test
model1_scores = cross_val_score(model1, X, y, cv=10)
model2_scores = cross_val_score(model2, X, y, cv=10)

t_stat, p_value = stats.ttest_rel(model1_scores, model2_scores)
print(f"t-statistic: {t_stat:.4f}, p-value: {p_value:.4f}")

if p_value < 0.05:
    print("Significant difference between models")
else:
    print("No significant difference")

Algorithm Selection Guide

Decision Framework

Problem Type - Binary Classification: Linear Learner, XGBoost, Neural Networks - Multi-class Classification: XGBoost, Image Classification, BlazingText - Regression: Linear Learner, XGBoost, Neural Networks - Clustering: K-Means - Anomaly Detection: Random Cut Forest, IP Insights - Dimensionality Reduction: PCA - Time Series: DeepAR, Amazon Forecast - NLP: BlazingText, Sequence2Sequence, Comprehend - Computer Vision: Image Classification, Object Detection, Rekognition

Data Characteristics - Structured/Tabular: XGBoost, Linear Learner - Images: Image Classification, Object Detection - Text: BlazingText, Comprehend - Time Series: DeepAR, Forecast - High-dimensional: PCA first, then other algorithms - Sparse data: Linear Learner, Factorization Machines

Performance Requirements - Fast training: Linear Learner, K-Means - High accuracy: XGBoost, Deep Learning - Interpretability: Linear Learner, Decision Trees - Scalability: Built-in algorithms, distributed training

Exam Tips

Algorithm Selection

  • XGBoost: Default for tabular data
  • Linear Learner: Fast, sparse data, linear relationships
  • Image Classification: Computer vision tasks
  • DeepAR: Time series forecasting
  • BlazingText: Text classification, word embeddings
  • RCF: Anomaly detection
  • K-Means: Clustering
  • PCA: Dimensionality reduction

Metrics Selection

  • Imbalanced data: Precision, Recall, F1, AUC
  • Balanced data: Accuracy
  • Business cost of errors: Weighted precision/recall
  • Regression: RMSE (penalizes large errors), MAE (robust to outliers)
  • Ranking: AUC, Average Precision

Common Scenarios

  • High false positives: Increase precision (higher threshold)
  • High false negatives: Increase recall (lower threshold)
  • Overfitting: Regularization, more data, simpler model
  • Underfitting: More features, complex model, more training
  • Imbalanced classes: Resampling, class weights, F1 score

Best Practices

  • Start with simple baseline
  • Try multiple algorithms
  • Cross-validation for robust estimates
  • Monitor multiple metrics
  • Consider business context
  • Understand algorithm assumptions
  • Use built-in algorithms when possible