Skip to content

Commit d24d0b8

Browse files
authored
Merge pull request #4 from maxmekiska/development
version 1.1.0 - Hyper-parameter Optimization
2 parents 407697e + 4f22900 commit d24d0b8

File tree

14 files changed

+1383
-43
lines changed

14 files changed

+1383
-43
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,13 @@ activation function type
5858
- tox added
5959
- outsourced Binder demo notebook to https://github.com/maxmekiska/ImbriumTesting-Demo
6060
- new README.md
61+
62+
### 1.0.1
63+
64+
- imbrium supports now:
65+
- python 3.7, 3.8, 3.9, 3.10
66+
67+
### 1.1.0
68+
69+
- removed batch_size parameter from fit_model method
70+
- hyperparameter optimization added via the Optuna library

README.md

Lines changed: 194 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,179 @@ The development and improvement of Imbrium is an ongoing process, and contributi
3535

3636
Recent research in the field of time series forecasting has shown the potential of graph-based neural networks. If you have experience in this area and would like to contribute architectures to Imbrium, your contributions would be most welcomed.
3737

38+
## Hyperparameter Optimization imbrium 1.1.0
39+
<details>
40+
<summary>Expand</summary>
41+
Starting from version 1.1.0, imbrium will support experimental hyperparamerter optimization for the model layer config and optimizer arguments. The optimization process uses the Optuna library (https://optuna.org/).
42+
43+
### Optimization via the seeker decorator
44+
45+
To leverage Optimization, use the new classes `OptimizePureUni`, `OptimizeHybridUni`, `OptimizePureMulti` and `OptimizeHybridMulti`. These classes implement optimizable model architecture methods:
46+
47+
`OptimizePureUni` & `OptimizePureMulti`:
48+
49+
- create_fit_mlp
50+
- create_fit_rnn
51+
- create_fit_lstm
52+
- create_fit_cnn
53+
- create_fit_gru
54+
- create_fit_birnn
55+
- create_fit_bilstm
56+
- create_fit_bigru
57+
- create_fit_encdec_rnn
58+
- create_fit_encdec_lstm
59+
- create_fit_encdec_gru
60+
- create_fit_encdec_cnn
61+
62+
`OptimizeHybridUni` & `OptimizeHybridMulti`:
63+
64+
- create_fit_cnnrnn
65+
- create_fit_cnnlstm
66+
- create_fit_cnngru
67+
- create_fit_cnnbirnn
68+
- create_fit_cnnbilstm
69+
- create_fit_cnnbigru
70+
71+
#### Example `OptimizePureUni`
72+
73+
```python
74+
from imbrium.predictors.univarpure import OptimizePureUni
75+
from imbrium.utils.optimization import seeker
76+
77+
# initialize optimizable predictor object
78+
predictor = OptimizePureUni(steps_past=5, steps_future=10, data=data, scale='standard')
79+
80+
81+
# use seeker decorator on optimization harness
82+
@seeker(optimizer_range=["adam", "sgd"],
83+
layer_config_range= [
84+
{'layer0': (5, 'relu'), 'layer1': (10,'relu'), 'layer2': (5, 'relu')},
85+
{'layer0': (2, 'relu'), 'layer1': (5, 'relu'), 'layer2': (2, 'relu')}
86+
],
87+
optimization_target='minimize', n_trials = 2)
88+
def create_fit_model(predictor: object, *args, **kwargs):
89+
# use optimizable create_fit_xxx method
90+
return predictor.create_fit_lstm(*args, **kwargs)
91+
92+
93+
create_fit_model(predictor, loss='mean_squared_error', metrics='mean_squared_error', epochs=2,
94+
show_progress=0, validation_split=0.20, monitor='val_loss', patience=2, min_delta=0, verbose=1
95+
)
96+
97+
predictor.show_performance()
98+
predictor.predict(data.tail(5))
99+
predictor.model_blueprint()
100+
```
101+
102+
#### Example `OptimizeHybridUni`
103+
104+
```python
105+
from imbrium.predictors.univarhybrid import OptimizeHybridUni
106+
from imbrium.utils.optimization import seeker
107+
108+
predictor = OptimizeHybridUni(sub_seq = 2, steps_past = 10, steps_future = 5, data = data, scale = 'maxabs')
109+
110+
@seeker(optimizer_range=["adam", "sgd"],
111+
layer_config_range= [
112+
{'layer0': (8, 1, 'relu'), 'layer1': (4, 1, 'relu'), 'layer2': (2),'layer3': (25, 'relu'), 'layer4': (10, 'relu')},
113+
{'layer0': (16, 1, 'relu'), 'layer1': (8, 1, 'relu'), 'layer2': (2),'layer3': (55, 'relu'), 'layer4': (10, 'relu')},
114+
{'layer0': (32, 1, 'relu'), 'layer1': (16, 1, 'relu'), 'layer2': (2),'layer3': (25, 'relu'), 'layer4': (10, 'relu')}
115+
],
116+
optimization_target='minimize', n_trials = 2)
117+
def create_fit_model(predictor: object, *args, **kwargs):
118+
return predictor.create_fit_cnnlstm(*args, **kwargs)
119+
120+
create_fit_model(predictor, loss='mean_squared_error', metrics='mean_squared_error', epochs=2,
121+
show_progress=0, validation_split=0.20, monitor='val_loss', patience=2, min_delta=0, verbose=1
122+
)
123+
124+
predictor.show_performance()
125+
predictor.predict(data.tail(10))
126+
predictor.model_blueprint()
127+
```
128+
129+
#### Example `OptimizePureMulti`
130+
131+
```python
132+
predictor = OptimizePureMulti(steps_past = 5, steps_future = 10, data = data, features = ['target', 'target', 'HouseAge', 'AveRooms', 'AveBedrms'], scale = 'normalize')
133+
134+
135+
@seeker(optimizer_range=["adam", "sgd"],
136+
layer_config_range= [
137+
{'layer0': (5, 'relu'), 'layer1': (10,'relu'), 'layer2': (5, 'relu')},
138+
{'layer0': (2, 'relu'), 'layer1': (5, 'relu'), 'layer2': (2, 'relu')},
139+
{'layer0': (20, 'relu'), 'layer1': (50, 'relu'), 'layer2': (20, 'sigmoid')}
140+
],
141+
optimization_target='minimize', n_trials = 3)
142+
def create_fit_model(predictor: object, *args, **kwargs):
143+
return predictor.create_fit_lstm(*args, **kwargs)
144+
145+
create_fit_model(predictor, loss='mean_squared_error', metrics='mean_squared_error', epochs=2,
146+
show_progress=1, validation_split=0.20, monitor='val_loss', patience=2, min_delta=0, verbose=1
147+
)
148+
149+
150+
predictor.show_performance()
151+
predictor.predict(data[['target', 'HouseAge', 'AveRooms', 'AveBedrms']].tail(5))
152+
predictor.model_blueprint()
153+
```
154+
155+
156+
#### Example `OptimizeHybridMulti`
157+
158+
```python
159+
predictor = OptimizeHybridMulti(sub_seq = 2, steps_past = 10, steps_future = 5, data = data,features = ['target', 'target', 'HouseAge', 'AveRooms', 'AveBedrms'], scale = 'normalize')
160+
161+
162+
@seeker(optimizer_range=["adam", "sgd"],
163+
layer_config_range= [
164+
{'layer0': (8, 1, 'relu'), 'layer1': (4, 1, 'relu'), 'layer2': (2), 'layer3': (5, 'relu'), 'layer4': (5, 'relu')},
165+
{'layer0': (8, 1, 'relu'), 'layer1': (4, 1, 'relu'), 'layer2': (2), 'layer3': (5, 'relu'), 'layer4': (5, 'relu')},
166+
{'layer0': (8, 1, 'relu'), 'layer1': (4, 1, 'relu'), 'layer2': (2), 'layer3': (5, 'relu'), 'layer4': (5, 'relu')}
167+
],
168+
optimization_target='minimize', n_trials = 3)
169+
def create_fit_model(predictor: object, *args, **kwargs):
170+
return predictor.create_fit_cnnlstm(*args, **kwargs)
171+
172+
create_fit_model(predictor, loss='mean_squared_error', metrics='mean_squared_error', epochs=2,
173+
show_progress=1, validation_split=0.20, monitor='val_loss', patience=2, min_delta=0, verbose=1
174+
)
175+
176+
177+
predictor.show_performance()
178+
predictor.predict(data[['target', 'HouseAge', 'AveRooms', 'AveBedrms']].tail(10))
179+
predictor.model_blueprint()
180+
```
181+
#### The shell of the seeker harness
182+
183+
```python
184+
predictor = OptimizePureMulti(...)
185+
186+
@seeker(optimizer_range=[...],
187+
layer_config_range= [
188+
{...},
189+
{...},
190+
{...}
191+
],
192+
...)
193+
def create_fit_model(predictor: object, *args, **kwargs): # seeker harness
194+
return predictor.create_fit_xxx(*args, **kwargs)
195+
196+
create_fit_model(...) # execute seeker harness
197+
198+
199+
predictor.show_performance()
200+
predictor.predict(...)
201+
predictor.model_blueprint()
202+
```
203+
204+
205+
</details>
206+
38207

39208
## imbrium 1.0.0 changes
209+
<details>
210+
<summary>Expand</summary>
40211

41212
The following important name changes have been performed:
42213

@@ -50,19 +221,25 @@ The following important name changes have been performed:
50221
- multivarhybrid => multivarhybrid (unchanged)
51222
- HybridMultStepMultVar => HybridMulti
52223
```
224+
</details>
53225

54226
## Try imbrium
55-
227+
<details>
228+
<summary>Expand</summary>
56229
Please ignore all cudart dlerror/warnings, since no GPU is setup in this jupyter binder environment:
57230

58231
[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/maxmekiska/ImbriumTesting-Demo/main?labpath=TestImbrium.ipynb) <br>
59232

60233

61234
For more testing, please visit the dedicated Demo & Testing repository at: https://github.com/maxmekiska/ImbriumTesting-Demo
62235

236+
</details>
63237

64238
## Overview of Imbrium's Functionality
65239

240+
<details>
241+
<summary>Expand</summary>
242+
66243
Imbrium is designed to simplify the application of deep learning models for time series forecasting. The library offers a variety of pre-built architectures, each with a fixed number of layers. However, the user retains full control over the configuration of each layer, including the number of neurons, the type of activation function, loss function, optimizer, and metrics applied. This allows for the flexibility to adapt the architecture to the specific needs of the forecast task at hand. Imbrium also offers a user-friendly interface for training and evaluating these models, making it easy to quickly iterate and test different configurations.
67244

68245

@@ -116,8 +293,13 @@ overfitting.
116293

117294
Trained models can furthermore be saved or loaded if the user wishes to do so.
118295

296+
</details>
297+
119298
## How to use imbrium?
120299

300+
<details>
301+
<summary>Expand</summary>
302+
121303
Attention: Typing has been left in the below examples to ease the configuration readability.
122304

123305
### Univariate Models:
@@ -189,7 +371,7 @@ predictor.create_encdec_gru(optimizer: str = 'adam', loss: str = 'mean_squared_e
189371
# https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping
190372

191373
predictor.fit_model(epochs: int, show_progress: int = 1, validation_split: float = 0.20,
192-
batch_size: int = 10, monitor='loss', patience=3)
374+
monitor='loss', patience=3)
193375

194376
# Have a look at the model performance
195377
predictor.show_performance()
@@ -249,7 +431,7 @@ predictor.create_cnnbigru(optimizer: str = 'adam', loss: str = 'mean_squared_err
249431
# https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping
250432

251433
predictor.fit_model(epochs: int, show_progress: int = 1, validation_split: float = 0.20,
252-
batch_size: int = 10, monitor='loss', patience=3)
434+
monitor='loss', patience=3)
253435

254436
# Have a look at the model performance
255437
predictor.show_performance()
@@ -340,7 +522,7 @@ predictor.create_encdec_gru(optimizer: str = 'adam', loss: str = 'mean_squared_e
340522
# https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping
341523

342524
predictor.fit_model(epochs: int, show_progress: int = 1, validation_split: float = 0.20,
343-
batch_size: int = 10, monitor='loss', patience=3)
525+
monitor='loss', patience=3)
344526

345527
# Have a look at the model performance
346528
predictor.show_performance()
@@ -400,7 +582,7 @@ predictor.create_cnnbigru(optimizer: str = 'adam', loss: str = 'mean_squared_err
400582
# https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping
401583

402584
predictor.fit_model(epochs: int, show_progress: int = 1, validation_split: float = 0.20,
403-
batch_size: int = 10, monitor='loss', patience=3)
585+
monitor='loss', patience=3)
404586

405587
# Have a look at the model performance
406588
predictor.show_performance()
@@ -421,9 +603,13 @@ loading_predictor = HybridMulti(sub_seq: int, steps_past: int, steps_future: in
421603
loading_predictor.load_model(location: str)
422604
loading_predictor.set_model_id(name: str)
423605
```
424-
606+
</details>
425607

426608
## References
609+
610+
<details>
611+
<summary>Expand</summary>
612+
427613
Brwonlee, J., 2016. Display deep learning model training history in keras [Online]. Available from:
428614
https://machinelearningmastery.com/display-deep-
429615
learning-model-training-history-in-keras/.
@@ -439,3 +625,5 @@ lstm-models-for-time-series-forecasting/.
439625
Brwonlee, J., 2018c. How to develop multilayer perceptron models for time series forecasting [Online]. Available from:
440626
https://machinelearningmastery.com/how-to-develop-multilayer-
441627
perceptron-models-for-time-series-forecasting/.
628+
629+
</details>

imbrium/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = "1.0.1"
1+
__version__ = "1.1.0"
22

3-
from imbrium import architectures, blueprints, predictors
3+
from imbrium import architectures, blueprints, predictors, utils

imbrium/blueprints/abstract_multivariate.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ def fit_model(
6363
epochs: int,
6464
show_progress: int = 1,
6565
validation_split: float = 0.20,
66-
batch_size: int = 10,
6766
**callback_setting: dict
6867
):
6968
pass

imbrium/blueprints/abstract_univariate.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ def fit_model(
6363
epochs: int,
6464
show_progress: int = 1,
6565
validation_split: float = 0.20,
66-
batch_size: int = 10,
6766
**callback_setting: dict
6867
):
6968
pass

imbrium/predictors/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from imbrium.predictors.multivarhybrid import HybridMulti
2-
from imbrium.predictors.multivarpure import PureMulti
3-
from imbrium.predictors.univarhybrid import HybridUni
4-
from imbrium.predictors.univarpure import PureUni
1+
from imbrium.predictors.multivarhybrid import HybridMulti, OptimizeHybridMulti
2+
from imbrium.predictors.multivarpure import OptimizePureMulti, PureMulti
3+
from imbrium.predictors.univarhybrid import HybridUni, OptimizeHybridUni
4+
from imbrium.predictors.univarpure import OptimizePureUni, PureUni

0 commit comments

Comments
 (0)