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.1.tar.gz (12.5 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.1-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: cosmonet-0.1.1.tar.gz
  • Upload date:
  • Size: 12.5 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.1.tar.gz
Algorithm Hash digest
SHA256 df166b0a442a69ab6a20752abf91ef57ae292454432b02b40fdf4010b9decce8
MD5 95dcc21c5fed2d1c21690842cf8afe92
BLAKE2b-256 bfee41d8992f3e44657478989c5989203e594c282ffcb7046170ef47aca252be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: cosmonet-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 11.4 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e4bc568dd007f83926dedfe98519420869a9870dbf68076f16a514ccf1c9e2ff
MD5 26331cf03d4368259a0478334ded0f32
BLAKE2b-256 a7f11c7d4a5f796b12869403a7271c9681c994f93e048f57bf4bfa43c70ce654

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