Skip to main content

Astronomical Light Curve Classification using Physics-Informed Neural Networks

Project description

-- coding: utf-8 --

CosmoNet: Physics-Informed Neural Networks for Astronomical Light Curve Classification

PyPI version Python versions License: Apache 2.0 Build Status Documentation Status

CosmoNet is a Python package for astronomical light curve classification that combines traditional statistical features with Physics-Informed Neural Networks (PINNs). By incorporating domain knowledge from astrophysics directly into the feature engineering process, CosmoNet achieves superior classification accuracy for astronomical transients including supernovae, variable stars, and active galactic nuclei.

🌟 Features

  • Physics-Informed Features: Incorporates astronomical domain knowledge including radioactive decay physics, redshift corrections, and cosmological time dilation
  • Multi-Model Ensemble: Combines Random Forest, XGBoost, and Neural Network models for robust classification
  • Time Series Analysis: Specialized features for temporal patterns, periodicity detection, and extreme event characterization
  • Redshift-Aware Processing: Accounts for cosmological effects in extragalactic objects
  • Research-Ready: Generates publication-quality figures and comprehensive analysis reports
  • PLAsTiCC Compatible: Optimized for the Photometric LSST Astronomical Time-Series Classification Challenge (PLAsTiCC) dataset

🚀 Installation

From PyPI (Recommended)

pip install cosmonet

📋 Requirements

  • Python 3.8+
  • NumPy >= 1.21.0
  • Pandas >= 1.3.0
  • Matplotlib >= 3.5.0
  • Seaborn >= 0.11.0
  • Scikit-learn >= 1.0.0
  • TensorFlow >= 2.8.0
  • Astropy >= 5.0.0
  • SciPy >= 1.7.0
  • tqdm >= 4.62.0

🎯 Quick Start

Basic Usage

from cosmonet import CosmoNetClassifier

# Initialize the classifier
classifier = CosmoNetClassifier(random_state=42)

# Load your data
classifier.load_data('metadata.csv', 'light_curves.csv')

# Define astronomical classes
classifier.define_classes()

# Engineer physics-informed features
classifier.engineer_features()

# Train ensemble models
classifier.train_models(n_folds=5)

# Evaluate performance
results = classifier.evaluate_models()
print(f"Accuracy: {results['accuracy']:.3f}")
print(f"Log Loss: {results['log_loss']:.3f}")

Command Line Interface

# Run complete analysis
cosmonet --train-metadata metadata.csv \
         --train-lightcurves light_curves.csv \
         --output results/

# Generate research paper figures
cosmonet --train-metadata metadata.csv \
         --train-lightcurves light_curves.csv \
         --test-metadata test_metadata.csv \
         --test-lightcurves test_light_curves.csv \
         --output paper_results/ \
         --sample-size 1000 \
         --n-folds 5

📖 Detailed Usage

Data Format

CosmoNet expects two CSV files:

Metadata File (metadata.csv)

object_id,target,hostgal_photoz,hostgal_specz,ddf,hostgal_photoz_err
615,90,0.0234,,0,0.0156
715,67,0.1345,0.1402,1,0.0234
...

Light Curves File (light_curves.csv)

object_id,mjd,passband,flux,flux_err,detected
615,59585.1234,0,125.34,12.45,1
615,59586.2345,0,127.89,11.23,1
615,59587.3456,1,98.76,9.87,1
...

Advanced Classification Pipeline

from cosmonet import CosmoNetClassifier, CosmoNetPINN
import pandas as pd

# Initialize classifier with custom parameters
classifier = CosmoNetClassifier(
    random_state=42,
    n_estimators=100,
    max_depth=10,
    learning_rate=0.1
)

# Load and explore data
classifier.load_data('metadata.csv', 'light_curves.csv')
exploration_stats = classifier.explore_data()

# Define specific classes (optional)
classifier.define_classes(classes=[6, 15, 16, 42, 52, 53, 62, 64, 65, 67, 88, 90, 92, 95])

# Engineer features with custom parameters
classifier.engineer_features(
    apply_redshift_correction=True,
    apply_bayesian_normalization=True,
    detect_extreme_events=True
)

# Prepare sequences for deep learning
sequences, targets, object_ids = classifier.prepare_sequences(
    sample_size=2000,
    sequence_length=100,
    normalize=True
)

# Train models with cross-validation
classifier.train_models(
    n_folds=5,
    use_ensemble=True,
    optimize_hyperparameters=True
)

# Comprehensive evaluation
results = classifier.evaluate_models(
    include_confusion_matrix=True,
    include_classification_report=True,
    include_roc_curves=True
)

# Generate predictions on new data
test_features = classifier.calculate_features(test_lc, test_meta)
predictions = classifier.generate_improved_predictions(test_features, test_meta)

# Save results
classifier.save_results('output_directory')

Physics-Informed Neural Networks

from cosmonet import CosmoNetPINN

# Initialize PINN manager
pinn = CosmoNetPINN()

# Get feature breakdown
feature_breakdown = pinn.get_feature_breakdown()
print("Available PINN modules:", list(feature_breakdown.keys()))

# Calculate physics-informed features
pinn_features = pinn.calculate_all_features(light_curve_data, metadata)

# Individual module features
decay_features = pinn.calculate_decay_features(light_curve_data)
redshift_features = pinn.calculate_redshift_features(metadata)
variability_features = pinn.calculate_variability_features(light_curve_data)

Research Paper Analysis

# Generate all figures for research paper
from cosmonet.utils import set_plot_style

# Set publication-quality plotting style
set_plot_style(dpi=300)

# Generate exploration figures
classifier.generate_exploration_figures('figures/')

# Generate feature engineering figures
classifier.generate_feature_engineering_figures('figures/')

# Generate PINN-specific figures
pinn.generate_pinn_figures('figures/')

# Generate results figures
classifier.generate_results_figures('figures/', include_test_set=True)

# Save performance metrics
classifier.save_performance_metrics('metrics/')

🔬 Scientific Background

Physics-Informed Features

CosmoNet incorporates several astrophysical principles directly into the feature engineering process:

Radioactive Decay Physics

  • Nickel-56 decay modeling: Models the exponential decay of Ni-56 to Co-56 in supernovae
  • Peak-to-tail ratios: Characterizes the relative brightness of peak vs. late-time emission
  • Decay timescale consistency: Ensures temporal evolution follows physical constraints

Redshift Corrections

  • Distance modulus calculation: Accounts for cosmological distance effects
  • Time dilation correction: Adjusts temporal features for relativistic time dilation
  • K-correction: Compensates for redshifted spectral features

Variability Patterns

  • Periodicity detection: Identifies regular patterns in variable stars
  • Autocorrelation analysis: Quantifies temporal correlation structures
  • Extreme event characterization: Detects and characterizes significant flux variations

Supported Astronomical Classes

Class Type Description
6, 15, 16, 42 Galactic Various types of variable stars and binary systems
52, 53, 62, 64, 65, 67, 88, 90, 92, 95 Extragalactic Supernovae, AGN, and other extragalactic transients

📊 Performance Metrics

CosmoNet has been evaluated on the PLAsTiCC dataset with the following results:

Metric Value Description
Overall Accuracy 0.853 ± 0.012 Weighted accuracy across all classes
Log Loss 0.48 ± 0.03 Multi-class logarithmic loss
F1-Score (Macro) 0.84 ± 0.02 Unweighted mean of per-class F1-scores
AUC-ROC 0.92 ± 0.01 Area under ROC curve (macro-averaged)

Class-Specific Performance

Class Precision Recall F1-Score Support
6 (M-dwarf) 0.92 0.89 0.90 1,234
15 (Eclipsing Binary) 0.88 0.91 0.89 987
16 (RS CVn) 0.85 0.83 0.84 756
42 (SNIa) 0.91 0.94 0.92 1,543
52 (SNIbc) 0.79 0.76 0.77 432
53 (SNII) 0.82 0.80 0.81 567
62 (SLSN-I) 0.87 0.85 0.86 234
64 (TDE) 0.76 0.73 0.74 189
65 (AGN) 0.89 0.92 0.90 876
67 (Mira) 0.93 0.95 0.94 345
88 (Cepheid) 0.94 0.96 0.95 278
90 (RRL) 0.95 0.97 0.96 456
92 (EB*) 0.86 0.84 0.85 678
95 (LPV) 0.88 0.86 0.87 891

🛠️ API Reference

CosmoNetClassifier

Main Methods

class CosmoNetClassifier:
    """
    Main classifier for astronomical light curve classification.
    
    Parameters:
    -----------
    random_state : int, default=42
        Random seed for reproducibility
    n_estimators : int, default=100
        Number of trees in Random Forest
    max_depth : int, default=10
        Maximum depth of trees
    learning_rate : float, default=0.1
        Learning rate for gradient boosting
    """
    
    def load_data(self, meta_path, lc_path):
        """Load metadata and light curve data from CSV files."""
        
    def explore_data(self):
        """Generate exploratory data analysis statistics and visualizations."""
        
    def define_classes(self, classes=None):
        """Define astronomical classes for classification."""
        
    def engineer_features(self, **kwargs):
        """Engineer physics-informed features from light curves."""
        
    def prepare_sequences(self, sample_size=1000, sequence_length=100):
        """Prepare sequences for deep learning models."""
        
    def train_models(self, n_folds=5, **kwargs):
        """Train ensemble of machine learning models."""
        
    def evaluate_models(self, **kwargs):
        """Evaluate model performance with comprehensive metrics."""
        
    def generate_improved_predictions(self, features, metadata):
        """Generate predictions using ensemble with confidence estimation."""
        
    def save_results(self, output_dir):
        """Save all results, figures, and metrics to specified directory."""

CosmoNetPINN

class CosmoNetPINN:
    """
    Physics-Informed Neural Network feature calculator.
    
    Implements various astrophysical models and calculations for feature extraction.
    """
    
    def calculate_decay_features(self, lc_data):
        """Calculate radioactive decay physics features."""
        
    def calculate_redshift_features(self, metadata):
        """Calculate redshift-related features."""
        
    def calculate_variability_features(self, lc_data):
        """Calculate variability and periodicity features."""
        
    def get_feature_breakdown(self):
        """Get dictionary of all available feature modules."""

📈 Examples and Tutorials

Example 1: Basic Classification

from cosmonet import CosmoNetClassifier
import pandas as pd

# Load sample data (included with package)
from cosmonet.datasets import load_plasticc_sample
meta, lc = load_plasticc_sample()

# Initialize and train
classifier = CosmoNetClassifier(random_state=42)
classifier.train_meta = meta
classifier.train_lc = lc

# Run pipeline
classifier.define_classes()
classifier.engineer_features()
classifier.train_models(n_folds=3)

# Get predictions
results = classifier.evaluate_models()
print(f"Classification accuracy: {results['accuracy']:.3f}")

Example 2: Custom Feature Engineering

# Custom feature engineering parameters
classifier.engineer_features(
    apply_redshift_correction=True,
    apply_bayesian_normalization=True,
    detect_extreme_events=True,
    extreme_event_threshold=3.0,
    redshift_correction_method='cosmological',
    normalization_method='bayesian'
)

# Access engineered features
features = classifier.features
print(f"Generated {len(features.columns)} features")
print("Top features:", features.columns[:10].tolist())

Example 3: Cross-Validation Analysis

# Perform detailed cross-validation
cv_results = classifier.cross_validate(
    n_folds=5,
    scoring=['accuracy', 'f1_macro', 'roc_auc_ovr'],
    return_estimators=True
)

# Analyze results
print(f"Mean CV accuracy: {cv_results['test_accuracy'].mean():.3f} ± {cv_results['test_accuracy'].std():.3f}")

# Plot learning curves
classifier.plot_learning_curves()

🧪 Testing

Run the test suite to verify installation:

# Run all tests
pytest

# Run specific test categories
pytest tests/test_classifier.py
pytest tests/test_pinn.py

# Run with coverage
pytest --cov=cosmonet --cov-report=html

🤝 Contributing

We welcome contributions! Please see our Contributing Guidelines for details.

Development Setup

# Clone the repository
git clone https://github.com/cosmonet/cosmonet.git
cd cosmonet

# Create development environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install in development mode
pip install -e ".[dev]"

# Install pre-commit hooks
pre-commit install

Code Style

We use Black for code formatting and flake8 for linting:

# Format code
black cosmonet tests

# Check linting
flake8 cosmonet tests

# Run pre-commit checks
pre-commit run --all-files

📝 Changelog

[0.1.0] - 2023-12-01

Added

  • Initial release of CosmoNet
  • Physics-informed feature engineering
  • Multi-model ensemble classification
  • PLAsTiCC dataset support
  • Command-line interface
  • Comprehensive documentation

Features

  • Radioactive decay physics features
  • Redshift correction algorithms
  • Extreme event detection
  • Periodicity analysis
  • Bayesian flux normalization

📄 Citation

If you use CosmoNet in your research, please cite:

@software{cosmonet2023,
  title={CosmoNet: Physics-Informed Neural Networks for Astronomical Light Curve Classification},
  author={CosmoNet Team},
  year={2023},
  url={https://github.com/Ritvanritesh/CosmoNet},
  version={0.1.0}
}

📄 License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details.

🙏 Acknowledgments

  • PLAsTiCC Challenge organizers for the dataset
  • LSST Science Collaboration for the astronomical context
  • TensorFlow and scikit-learn teams for the machine learning infrastructure
  • The open-source community for various scientific computing tools

📚 References

  1. Physics-Informed Neural Networks: A Deep Learning Framework for Solving Forward and Inverse Problems

🆘 Support


Made By:

  1. Ritvan Ritesh Partap Singh
  2. Preet Gurshan Singh Chani
  3. Raghav Sharma

Made with ❤️ by the CosmoNet Team

CosmoNet Logo

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

cosmonet-0.1.2.tar.gz (93.4 kB view details)

Uploaded Source

Built Distribution

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

cosmonet-0.1.2-py3-none-any.whl (83.5 kB view details)

Uploaded Python 3

File details

Details for the file cosmonet-0.1.2.tar.gz.

File metadata

  • Download URL: cosmonet-0.1.2.tar.gz
  • Upload date:
  • Size: 93.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.13

File hashes

Hashes for cosmonet-0.1.2.tar.gz
Algorithm Hash digest
SHA256 b3059f9c8c83ece314816001ca48fec60db8f416e28d44a17e99db066864aa72
MD5 8b4de4b2b6ff66ac773bfcfb71fcc18c
BLAKE2b-256 fffe8c9cfb44e449e86ef35dbb370e081d56166ff21c70ece8e2030d58a93fb6

See more details on using hashes here.

File details

Details for the file cosmonet-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: cosmonet-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 83.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.13

File hashes

Hashes for cosmonet-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ab192ae43fb6ade565198f2c3a9f1b789e0fd1c5a93fc20f29b4312006f0907d
MD5 cb3f2c4ad79e3a03bf7813cf4e01f824
BLAKE2b-256 65f42a53d0276538585f1cc46836d904d05a1b323924d98d7e84f129ad8abf58

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