UR2CUTE
Using Repetitively 2 CNNs for Unsteady Timeseries Estimation
UR2CUTE is a specialized forecasting model designed for intermittent time series data. By employing a dual CNN approach with TensorFlow, it effectively addresses the challenges of predicting both the occurrence and magnitude of demand in irregular time series patterns.
📋 Overview
Intermittent demand forecasting presents unique challenges due to irregular and unpredictable demand patterns, characterized by periods of zero demand followed by random non-zero demand. Traditional forecasting methods often perform poorly on such data.
UR2CUTE employs a two-step approach:
- A CNN-based classification model predicts demand occurrence (zero vs. non-zero)
- A CNN-based regression model estimates the magnitude of demand
This dual-phase approach significantly improves forecasting accuracy for intermittent demand, particularly in predicting periods of zero demand.
🔍 Features
- TensorFlow Implementation: Uses TensorFlow's efficient tensor operations and GPU acceleration
- Two-Step Prediction Process: Separate models for order occurrence and quantity prediction
- Temporal Pattern Recognition: CNNs effectively capture temporal patterns in intermittent data
- Lag Feature Generation: Automatically creates lagged features to capture historical dependencies
- Combined Loss Function: Custom loss functions optimized for each prediction task
- Sklearn Compatibility: Follows scikit-learn API conventions for easy integration
- Direct Multi-Step Forecasting: Predicts multiple future time steps in one pass
📦 Dependencies
- Python 3.7+
- TensorFlow 2.x
- NumPy
- pandas
- scikit-learn
🛠️ Installation
pip install fh_prevail
Then import the model:
from fh_prevail.models import UR2CUTE
📊 Quick Start
import pandas as pd
from fh_prevail.models import UR2CUTE
# Load time series data
df = pd.DataFrame({
'date': pd.date_range('2023-01-01', periods=50, freq='W'),
'target': [0, 5, 0, 0, 12, 0, 0, 0, 7, 0, ...], # Intermittent data
'feat1': [...], # Optional external features
'feat2': [...] # Optional external features
})
# Initialize model
model = UR2CUTE(
n_steps_lag=3,
forecast_horizon=4,
external_features=['feat1', 'feat2']
)
# Fit model
model.fit(df, target_col='target')
# Make predictions for the next forecast_horizon steps
predictions = model.predict(df)
print("Predicted values:", predictions)
# Note: The model automatically uses GPU if available
# To manually control device placement:
# import tensorflow as tf
# device = tf.device("cuda" if tf.test.is_gpu_available() else "cpu")
# print(f"Using device: {device}")
🔧 Parameters
| Parameter | Description | Default |
|---|---|---|
n_steps_lag |
Number of lag features to generate | 3 |
forecast_horizon |
Number of future steps to predict | 8 |
external_features |
List of column names for external features | None |
epochs |
Training epochs for both CNN models | 100 |
batch_size |
Batch size for training | 32 |
threshold |
Probability threshold for classifying zero vs. non-zero. Can be a float or "auto" to automatically compute the threshold from training targets |
0.5 |
patience |
Patience for EarlyStopping | 10 |
random_seed |
Random seed for reproducibility | 42 |
classification_lr |
Learning rate for classification model | 0.0021 |
regression_lr |
Learning rate for regression model | 0.0021 |
dropout_classification |
Dropout rate for classification model | 0.4 |
dropout_regression |
Dropout rate for regression model | 0.2 |
📝 Methods
fit(df, target_col)
Fits the UR2CUTE model on the time series data.
Parameters:
df(pandas.DataFrame): Time series data with at least the target column. Must be sorted by time.target_col(str): The name of the column to forecast.
Returns:
- The fitted UR2CUTE model instance.
predict(df)
Predicts the next forecast_horizon steps from the input DataFrame.
Parameters:
df(pandas.DataFrame): Time series data with the same columns as used in fit(). Must be sorted by time.
Returns:
- numpy.ndarray: The predictions for each step in the horizon.
🔍 How It Works
-
Data Preprocessing:
- Aggregates demand data (e.g., daily to weekly)
- Generates lag features to capture historical patterns
-
Model Architecture:
- Classification Model: CNN that predicts probability of non-zero demand
- Regression Model: CNN that predicts quantity when demand exists
-
Prediction Process:
- Classification model predicts if demand will occur
- Regression model predicts the magnitude of demand
- Final prediction combines both models' outputs
🏆 Performance
UR2CUTE outperforms traditional forecasting techniques including:
- Croston's method
- XGBoost
- Random Forest
- ETR
- Prophet
- AutoARIMA
Particularly for predicting intermittent demand, UR2CUTE shows significant improvements in:
- Mean Absolute Error % (MAE%)
- Root Mean Square Error % (RMSE%)
- R-squared values
📚 Citation
If you use UR2CUTE in your research, please cite:
@article{mirshahi2024intermittent,
title={Intermittent Time Series Demand Forecasting Using Dual Convolutional Neural Networks},
author={Mirshahi, Sina and Brandtner, Patrick and Kom{\'i}nkov{\'a} Oplatkov{\'a}, Zuzana},
journal={MENDEL — Soft Computing Journal},
volume={30},
number={1},
year={2024},
publisher={MENDEL Journal}
}
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
👥 Contributors
- Sina Mirshahi
- Patrick Brandtner
- Zuzana Komínková Oplatková
- Taha Falatouri
- Mehran Naseri
- Farzaneh Darbanian
🙏 Acknowledgments
This research was conducted at:
- Department of Informatics and Artificial Intelligence, Tomas Bata
- Department for Logistics, University of Applied Sciences Upper Austria, Steyr
- Josef Ressel-Centre for Predictive Value Network Intelligence, Steyr
Metadata
Release files for fh-prevail 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fh_prevail-0.1.6.tar.gz | 10.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fh_prevail-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 19.9 kB
Release files / fh_prevail-0.1.6.tar.gz
| Download URL | fh_prevail-0.1.6.tar.gz |
|---|---|
| Size | 10.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5b519b1bb05257ca17da8deb01ed2ceb0525ea848463ee680dbf2e9db083a620
|
|
BLAKE2b-256 checksum How to use checksums |
e0b74857c35e799b6fbca51c056dfea5b88c036b92007b899eee5f8f64e4d902
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.4
|
Release files / fh_prevail-0.1.6-py3-none-any.whl
| Download URL | fh_prevail-0.1.6-py3-none-any.whl |
|---|---|
| Size | 9.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c9d2e2ce3cbdd0a6c0f35b8372723c9337af7081b5f7f90362c2d91a4897be50
|
|
BLAKE2b-256 checksum How to use checksums |
39c77568fad6f34d6b77f185f0ff438dedc7e3f98fd8a2b5f6bd83f5f53986ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.4
|