Skip to main content

No project description provided

Project description

ExpComp - Machine Learning Experiment Tracking & Comparison

PyPI version

A lightweight Python library for managing, tracking, and comparing machine learning experiments.

Features

  • 📁 Automatic Experiment Organization: Creates standardized folder structures for experiments
  • ⚙️ Config Management: Store hyperparameters and training configurations in JSON format
  • 📊 Metrics Tracking: Log performance metrics (accuracy, loss, F1-score, etc.) across experiments
  • 🔍 Comparison Tools: Filter and compare experiments using pandas DataFrames
  • 🎯 Condition Filtering: Easily find experiments that match specific criteria

Installation

pip install expcomp

Quick Start

Creating Dummy Experiments

import random
import json

from expcomp import Condition
from expcomp.evaluation import Metric
from expcomp.experiments import Experiment, ExperimentComparison, ExperimentConfig, ExperimentLoader



def generate_experiment_config(exp_id):
    """Generate a dummy experiment configuration with random parameters."""
    model_architectures = ["ResNet50", "VGG16", "MobileNetV2", "EfficientNetB0", "DenseNet121"]
    optimizers = ["Adam", "SGD", "RMSprop", "Adagrad", "Adadelta"]
    datasets = ["CIFAR-10", "MNIST", "ImageNet", "Fashion-MNIST", "COCO"]
    
    # Generate random parameters
    learning_rate = round(random.uniform(0.0001, 0.1), 4)
    batch_size = random.choice([16, 32, 64, 128, 256])
    epochs = random.randint(10, 100)
    model = random.choice(model_architectures)
    optimizer = random.choice(optimizers)
    dataset = random.choice(datasets)
    
    # Create configuration
    config = ExperimentConfig(
        id=exp_id,
        model=model,
        optimizer=optimizer,
        learning_rate=learning_rate,
        batch_size=batch_size,
        epochs=epochs,
        dataset=dataset,
        random_seed=random.randint(1, 1000),
        date_created="2025-02-27",
        description=f"Experiment with {model} on {dataset}"
    )
    
    return config

def generate_metrics(exp_id):
    """Generate dummy metrics for an experiment."""
    # Create base metrics with random values
    accuracy = round(random.uniform(0.7, 0.99), 4)
    loss = round(random.uniform(0.01, 0.5), 4)
    f1 = round(random.uniform(0.65, 0.98), 4)
    precision = round(random.uniform(0.7, 0.99), 4)
    recall = round(random.uniform(0.7, 0.99), 4)
    training_time = round(random.uniform(100, 1000), 2)
    
    # Create metric objects
    metrics = [
        Metric(exp_id, "accuracy", accuracy, units="percentage", threshold=0.8),
        Metric(exp_id, "loss", loss, units="cross_entropy"),
        Metric(exp_id, "f1_score", f1),
        Metric(exp_id, "precision", precision),
        Metric(exp_id, "recall", recall),
        Metric(exp_id, "training_time", training_time, units="seconds")
    ]
    
    return metrics

def generate_dummy_experiments():
    """generate 10 experiments with configs and metrics."""
    # Create base directory
    base_dir = "experiments"
    if not os.path.exists(base_dir):
        os.makedirs(base_dir)
    
    experiments = []
    
    # Create 10 experiments
    for i in range(1, 11):
        exp_id = f"exp_{i}"
        
        # Create experiment config
        config = generate_experiment_config(exp_id)
        
        # Create experiment metrics
        metrics = generate_metrics(exp_id)
        
        # Create experiment object
        experiment = Experiment(config, metrics)
        experiments.append(experiment)
        
        # Create experiment folder
        exp_dir = os.path.join(base_dir, f"experiment_{i}")
        os.makedirs(exp_dir, exist_ok=True)
        
        # Save config directly in experiment folder
        config_path = os.path.join(exp_dir, "config.json")
        with open(config_path, 'w') as f:
            f.write(config.to_json())
        
        # Save metrics directly in experiment folder
        metrics_path = os.path.join(exp_dir, "metrics.json")
        metrics_list = [metric.to_dict() for metric in metrics]
        with open(metrics_path, 'w') as f:
            json.dump(metrics_list, f, indent=2)
        
        print(f"Created experiment {i} with config and metrics")
    
    return experiments

generate_dummy_experiments()

Loading & Analyzing Experiments

# Load experiments from directory
all_experiments = ExperimentLoader.from_directory(
    directory_path="./experiments",
    config_file_pattern="config*.json",
    metrics_file_pattern="metrics*.json"
)

# Create comparison DataFrame
comparison = ExperimentComparison(all_experiments)

# View experiment data
print(comparison.df.head())

# Filter experiments with specific conditions
filtered_exp = comparison.filter_experiments(
    conditions=[
        Condition("config_epochs", ">=", 0.85),
        Condition("metric_loss	", "<", "0.2")
    ]
)

# show the filtered experiments
print(filtered_exp.head())

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

expcomp-1.1.3.tar.gz (10.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

expcomp-1.1.3-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file expcomp-1.1.3.tar.gz.

File metadata

  • Download URL: expcomp-1.1.3.tar.gz
  • Upload date:
  • Size: 10.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.1 CPython/3.11.9 Windows/10

File hashes

Hashes for expcomp-1.1.3.tar.gz
Algorithm Hash digest
SHA256 9c22daf2c3894ac4399f16c5d1fe8cfa58faeeb8f8fbfdcdc5eebf207400198f
MD5 53a47cf441e3a90b07ca7b79db3e495a
BLAKE2b-256 af48969972bb1e00be0ea3c85af8a773a98c18c7a9b5c2615ddb351bf929e119

See more details on using hashes here.

File details

Details for the file expcomp-1.1.3-py3-none-any.whl.

File metadata

  • Download URL: expcomp-1.1.3-py3-none-any.whl
  • Upload date:
  • Size: 11.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.1 CPython/3.11.9 Windows/10

File hashes

Hashes for expcomp-1.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 cb82c3cb2924c368c2ed008a4f50df31a495954a1eb10b9b13b16edbee94f2ba
MD5 0d1411f41004931a63a6ba311f9157ef
BLAKE2b-256 d1aec812a80263d35530f43a9fef64230d37f979ff621ef27a6e1964f8b1f536

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page