Skip to content

Commit f30eeb4

Browse files
committed
add multithread support
1 parent 5f4d83a commit f30eeb4

File tree

7 files changed

+56
-44
lines changed

7 files changed

+56
-44
lines changed

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ A hyper-parameter library for researchers, data scientists and machine learning
77
- [Quick Start](#quick-start)
88
- [Object-Style API:](#object-style-api)
99
- [Scoped Parameter](#scoped-parameter)
10+
- [Predefined Parameter](#predefined-parameter)
1011
- [Examples](#examples)
1112
- [parameter tunning for researchers](#parameter-tunning-for-researchers)
1213
- [experiment tracing for data scientists](#experiment-tracing-for-data-scientists)
@@ -73,6 +74,23 @@ with param_scope(param1=2):
7374
foo() # 2
7475
```
7576

77+
## Predefined Parameter
78+
```python
79+
@let( # predefine two parameter for `model_train`
80+
learning_rate = 1.0,
81+
penalty = 'l1'
82+
)
83+
def model_train(X, y):
84+
LR = LogisticRegression(C=1.0,
85+
lr=local_param('learning_rate'),
86+
penalty=local_param('penalty'))
87+
LR.fit(X, y)
88+
89+
# specify predefined parameter using `param_scope`
90+
with param_scope('model_train.learning_rate=0.01'):
91+
model_train(X, y)
92+
```
93+
7694
Examples
7795
========
7896

examples/sparse_lr/README.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,27 @@
11
Sparse LR Examples
22
==================
33

4-
This example shows l1 penalty and sparsity in logistic regression, based on `scikit-learn` example from https://scikit-learn.org/stable/auto_examples/linear_model/plot_logistic_l1_l2_sparsity.html#sphx-glr-auto-examples-linear-model-plot-logistic-l1-l2-sparsity-py.
5-
6-
`sparse_lr_train` (from `model.py`) classifies 8x8 images of digits into two classes: 0-4 against 5-9,
4+
This example is based on `scikit-learn` example: [l1 penalty and sparsity in logistic regression](https://scikit-learn.org/stable/auto_examples/linear_model/plot_logistic_l1_l2_sparsity.html#sphx-glr-auto-examples-linear-model-plot-logistic-l1-l2-sparsity-py), which classifies 8x8 images of digits into two classes: 0-4 against 5-9,
75
and visualize the coefficients of the model for different penalty methods(l1 or l2) and C.
86

9-
We use the `let` decorator to declare hyper-parameters for our algorithm:
7+
The algorithm is defined in function `sparse_lr_plot` from `model.py`. We use the decorator `let` to declare hyper-parameters for our function:
108
``` python
119
@let(learning_rate=0.01, penalty='l1', C=0.01, tol=0.01)
12-
def sparse_lr_train(X, y):
10+
def sparse_lr_plot(X, y):
1311
C = local_param('C')
1412
penalty = local_param('penalty')
1513
tol = local_param('tol')
1614
print({'C': C, 'penalty': penalty, 'tol': tol})
1715
...
1816
```
1917

20-
Four hyper-parameter are defined for function `sparse_lr_train`: `learning_rate`, `penalty`, `C` and `tol`.
18+
Four hyper-parameter are defined for `sparse_lr_plot`: `learning_rate`, `penalty`, `C` and `tol`.
2119
There are two ways to control the hyper-parameters:
2220
1. parameter scope (see detail in `example_1.py`):
2321

2422
``` python
2523
with param_scope('model.sparse_lr_train.C=0.1'):
26-
sparse_lr_train(X, y)
24+
sparse_lr_plot(X, y)
2725
```
2826

2927
2. command line arguments (see detail in `example_2.py`):
@@ -32,7 +30,7 @@ with param_scope('model.sparse_lr_train.C=0.1'):
3230
def run(args):
3331
# run the lr model with parameter from cmdline
3432
with param_scope(*args.define): # set parameters according to cmd line
35-
sparse_lr_train(X, y)
33+
sparse_lr_plot(X, y)
3634
...
3735

3836

examples/sparse_lr/example_1.py

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from hyperparameter.hp import param_scope, Tracker
2-
from model import sparse_lr_train
2+
from model import sparse_lr_plot
33
import numpy as np
44

55
from sklearn import datasets
66
from sklearn.preprocessing import StandardScaler
7-
import matplotlib.pyplot as plt
87

98
X, y = datasets.load_digits(return_X_y=True)
109

@@ -16,25 +15,10 @@
1615
print('parameter list: \n {}'.format('\n '.join(Tracker.all())))
1716

1817
# run the lr model with default parameters
19-
coef = sparse_lr_train(X, y)
18+
sparse_lr_plot(X, y)
19+
2020

21-
plt.imshow(
22-
np.abs(coef.reshape(8, 8)),
23-
interpolation="nearest",
24-
cmap="binary",
25-
vmax=1,
26-
vmin=0,
27-
)
28-
plt.show()
2921

3022
# run the lr model with another parameter
3123
with param_scope('model.sparse_lr_train.C=0.1'):
32-
coef = sparse_lr_train(X, y)
33-
plt.imshow(
34-
np.abs(coef.reshape(8, 8)),
35-
interpolation="nearest",
36-
cmap="binary",
37-
vmax=1,
38-
vmin=0,
39-
)
40-
plt.show()
24+
sparse_lr_plot(X, y)

examples/sparse_lr/example_2.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from hyperparameter.hp import param_scope, Tracker
2-
from model import sparse_lr_train
2+
from model import sparse_lr_plot
33
import numpy as np
44

55
from sklearn import datasets
@@ -17,16 +17,7 @@
1717
def run(args):
1818
# run the lr model with parameter from cmdline
1919
with param_scope(*args.define): # set parameters according to cmd line
20-
coef = sparse_lr_train(X, y)
21-
plt.imshow(
22-
np.abs(coef.reshape(8, 8)),
23-
interpolation="nearest",
24-
cmap="binary",
25-
vmax=1,
26-
vmin=0,
27-
)
28-
plt.show()
29-
20+
sparse_lr_plot(X, y)
3021

3122
if __name__ == '__main__':
3223
# create cmd line arguments parser

examples/sparse_lr/model.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,33 @@
11
import numpy as np
22
from sklearn.linear_model import LogisticRegression
3+
import matplotlib.pyplot as plt
34

45
from hyperparameter import let, local_param, param_scope
56

67

78
@let(learning_rate=0.01, penalty='l1', C=0.01, tol=0.01)
8-
def sparse_lr_train(X, y):
9+
def sparse_lr_plot(X, y):
910
C = local_param('C')
1011
penalty = local_param('penalty')
1112
tol = local_param('tol')
1213
LR = LogisticRegression(C=C, penalty=penalty, tol=tol, solver='saga')
1314

1415
LR.fit(X, y)
15-
coef = LR.coef_.ravel()
16+
coef = LR.coef_.ravel()
1617
sparsity_LR = np.mean(coef == 0) * 100
17-
print({'C': C, 'penalty': penalty, 'tol': tol, 'sparsity': '%.2f%%'%(sparsity_LR)})
18-
return coef
18+
print()
19+
plt.imshow(
20+
np.abs(coef.reshape(8, 8)),
21+
interpolation="nearest",
22+
cmap="binary",
23+
vmax=1,
24+
vmin=0,
25+
)
26+
plt.title(
27+
str({
28+
'C': C,
29+
'penalty': penalty,
30+
'tol': tol,
31+
'sparsity': '%.2f%%' % (sparsity_LR)
32+
}))
33+
plt.show()

hyperparameter/hp.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,12 @@ def __enter__(self):
326326
def __exit__(self, exc_type, exc_value, traceback):
327327
param_scope.tls._cfg_.pop()
328328

329+
@staticmethod
330+
def init(params):
331+
if not hasattr(param_scope.tls, '_cfg_'):
332+
param_scope.tls._cfg_ = []
333+
param_scope.tls._cfg_.append(params)
334+
329335

330336
def local_param(name: str):
331337
"""

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
setup(
99
name="hyperparameter",
10-
version="0.1.3",
10+
version="0.1.4",
1111
description="A hyper-parameter library for researchers, data scientists and machine learning engineers.",
1212
long_description=long_description,
1313
long_description_content_type="text/markdown",

0 commit comments

Comments
 (0)