Astronomical Light Curve Classification using Physics-Informed Neural Networks
Project description
-- coding: utf-8 --
CosmoNet: Physics-Informed Neural Networks for Astronomical Light Curve Classification
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
- Physics-Informed Neural Networks: A Deep Learning Framework for Solving Forward and Inverse Problems
🆘 Support
- Documentation: https://app.readthedocs.org/projects/cosmonet/
- Bug Reports: https://github.com/ritvanritesh/cosmonet/issues
- Discussions: https://github.com/ritvanritesh/cosmonet/discussions
- Email: cosmonet@gmail.com
Made By:
- Ritvan Ritesh Partap Singh
- Preet Gurshan Singh Chani
- Raghav Sharma
Made with ❤️ by the CosmoNet Team
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3059f9c8c83ece314816001ca48fec60db8f416e28d44a17e99db066864aa72
|
|
| MD5 |
8b4de4b2b6ff66ac773bfcfb71fcc18c
|
|
| BLAKE2b-256 |
fffe8c9cfb44e449e86ef35dbb370e081d56166ff21c70ece8e2030d58a93fb6
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab192ae43fb6ade565198f2c3a9f1b789e0fd1c5a93fc20f29b4312006f0907d
|
|
| MD5 |
cb3f2c4ad79e3a03bf7813cf4e01f824
|
|
| BLAKE2b-256 |
65f42a53d0276538585f1cc46836d904d05a1b323924d98d7e84f129ad8abf58
|