Skip to content

Commit 06a24ec

Browse files
0.14.41
New function set_hyperparameters()
1 parent cc30f2d commit 06a24ec

4 files changed

Lines changed: 129 additions & 7 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
77

88
[project]
99
name = "spotpython"
10-
version = "0.14.40"
10+
version = "0.14.41"
1111
authors = [
1212
{ name="T. Bartz-Beielstein", email="tbb@bartzundbartz.de" }
1313
]

src/spotPython/data/lightdatamodule.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,15 @@ def setup(self, stage: Optional[str] = None) -> None:
150150
if self.scaler is not None:
151151
# Fit the scaler on training data and transform both train and val data
152152
scaler_train_data = torch.stack([self.data_train[i][0] for i in range(len(self.data_train))]).squeeze(1)
153-
#train_val_data = self.data_train[:,0]
153+
# train_val_data = self.data_train[:,0]
154154
print(scaler_train_data.shape)
155155
self.scaler.fit(scaler_train_data)
156156
self.data_train = [(self.scaler.transform(data), target) for data, target in self.data_train]
157157
data_tensors_train = [data.clone().detach() for data, target in self.data_train]
158158
target_tensors_train = [target.clone().detach() for data, target in self.data_train]
159-
self.data_train = TensorDataset(torch.stack(data_tensors_train).squeeze(1), torch.stack(target_tensors_train))
159+
self.data_train = TensorDataset(
160+
torch.stack(data_tensors_train).squeeze(1), torch.stack(target_tensors_train)
161+
)
160162
# print(self.data_train)
161163
self.data_val = [(self.scaler.transform(data), target) for data, target in self.data_val]
162164
data_tensors_val = [data.clone().detach() for data, target in self.data_val]
@@ -173,7 +175,9 @@ def setup(self, stage: Optional[str] = None) -> None:
173175
self.data_test = [(self.scaler.transform(data), target) for data, target in self.data_test]
174176
data_tensors_test = [data.clone().detach() for data, target in self.data_test]
175177
target_tensors_test = [target.clone().detach() for data, target in self.data_test]
176-
self.data_test = TensorDataset(torch.stack(data_tensors_test).squeeze(1), torch.stack(target_tensors_test))
178+
self.data_test = TensorDataset(
179+
torch.stack(data_tensors_test).squeeze(1), torch.stack(target_tensors_test)
180+
)
177181

178182
# if stage == "predict" or stage is None:
179183
# print(f"test_size, full_train_size: {test_size}, {full_train_size}")
@@ -194,9 +198,7 @@ def setup(self, stage: Optional[str] = None) -> None:
194198
)
195199
if self.scaler is not None:
196200
self.data_predict = [(self.scaler.transform(data), target) for data, target in self.data_predict]
197-
data_tensors_predict = [
198-
data.clone().detach() for data, target in self.data_predict
199-
]
201+
data_tensors_predict = [data.clone().detach() for data, target in self.data_predict]
200202
target_tensors_predict = [target.clone().detach() for data, target in self.data_predict]
201203
self.data_predict = TensorDataset(
202204
torch.stack(data_tensors_predict).squeeze(1), torch.stack(target_tensors_predict)

src/spotPython/hyperparameters/values.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1744,3 +1744,75 @@ def get_metric_sklearn(metric_name) -> object:
17441744
"""
17451745
metric_sklearn = getattr(sklearn.metrics, metric_name)
17461746
return metric_sklearn
1747+
1748+
1749+
def set_hyperparameter(fun_control, key, values):
1750+
"""
1751+
Set hyperparameter values in the fun_control dictionary based on the type of the values argument.
1752+
1753+
Args:
1754+
fun_control (dict):
1755+
The fun_control dictionary.
1756+
key (str):
1757+
The key of the hyperparameter.
1758+
values (Union[int, float, bool, list]):
1759+
The values of the hyperparameter. This can be:
1760+
- For int and float: a list containing lower and upper bounds.
1761+
- For bool: a list containing two boolean values.
1762+
- For factor: a list of strings representing levels.
1763+
1764+
Examples:
1765+
>>> from spotPython.hyperparameters.values import set_hyperparameter
1766+
>>> fun_control = {
1767+
"core_model_hyper_dict": {
1768+
"n_estimators": {"type": "int", "default": 10, "lower": 2, "upper": 1000},
1769+
"step": {"type": "float", "default": 1.0, "lower": 0.1, "upper": 10.0},
1770+
"use_aggregation": {"type": "factor", "default": 1, "lower": 0, "upper": 1, "levels": [0, 1]},
1771+
"leaf_model": {"type": "factor", "default": "LinearRegression", "upper": 2}
1772+
}
1773+
}
1774+
>>> set_hyperparameter(fun_control, "n_estimators", [2, 5])
1775+
>>> set_hyperparameter(fun_control, "step", [0.2, 5.0])
1776+
>>> set_hyperparameter(fun_control, "use_aggregation", [False, True])
1777+
>>> set_hyperparameter(fun_control, "leaf_model", ["LinearRegression", "Perceptron"])
1778+
"""
1779+
if isinstance(values, list):
1780+
if all(isinstance(v, int) for v in values):
1781+
_set_int_hyperparameter_values(fun_control, key, values[0], values[1])
1782+
elif all(isinstance(v, float) for v in values):
1783+
_set_float_hyperparameter_values(fun_control, key, values[0], values[1])
1784+
elif all(isinstance(v, bool) for v in values):
1785+
_set_boolean_hyperparameter_values(fun_control, key, values[0], values[1])
1786+
elif all(isinstance(v, str) for v in values):
1787+
_set_factor_hyperparameter_values(fun_control, key, values)
1788+
else:
1789+
raise ValueError("Invalid type in values list.")
1790+
else:
1791+
raise TypeError("values should be a list.")
1792+
1793+
1794+
def _set_int_hyperparameter_values(fun_control, key, lower, upper) -> None:
1795+
# Set integer hyperparameter values in fun_control dictionary
1796+
fun_control["core_model_hyper_dict"][key].update({"lower": lower, "upper": upper})
1797+
1798+
1799+
def _set_float_hyperparameter_values(fun_control, key, lower, upper) -> None:
1800+
# Set float hyperparameter values in fun_control dictionary
1801+
fun_control["core_model_hyper_dict"][key].update({"lower": lower, "upper": upper})
1802+
1803+
1804+
def _set_boolean_hyperparameter_values(fun_control, key, lower, upper):
1805+
# Set boolean hyperparameter values in fun_control dictionary
1806+
fun_control["core_model_hyper_dict"][key].update({"lower": lower, "upper": upper})
1807+
1808+
1809+
def _set_factor_hyperparameter_values(fun_control, key, levels):
1810+
# Set factor hyperparameter values in fun_control dictionary
1811+
if "core_model_hyper_dict" not in fun_control.keys():
1812+
return
1813+
if not isinstance(levels, list):
1814+
levels = [levels]
1815+
if not all(isinstance(level, str) for level in levels):
1816+
print("!!! Warning: levels should be a list of strings.")
1817+
return
1818+
fun_control["core_model_hyper_dict"][key].update({"levels": levels, "upper": len(levels) - 1})

test/test_set_hyperparameter.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import pytest
2+
from spotPython.hyperparameters.values import set_hyperparameter
3+
4+
5+
def test_set_hyperparameter_int():
6+
fun_control = {"core_model_hyper_dict": {"n_estimators": {"type": "int", "default": 10, "lower": 2, "upper": 1000}}}
7+
set_hyperparameter(fun_control, "n_estimators", [2, 5])
8+
assert fun_control["core_model_hyper_dict"]["n_estimators"]["lower"] == 2
9+
assert fun_control["core_model_hyper_dict"]["n_estimators"]["upper"] == 5
10+
11+
12+
def test_set_hyperparameter_float():
13+
fun_control = {"core_model_hyper_dict": {"step": {"type": "float", "default": 1.0, "lower": 0.1, "upper": 10.0}}}
14+
set_hyperparameter(fun_control, "step", [0.2, 5.0])
15+
assert fun_control["core_model_hyper_dict"]["step"]["lower"] == 0.2
16+
assert fun_control["core_model_hyper_dict"]["step"]["upper"] == 5.0
17+
18+
19+
def test_set_hyperparameter_boolean():
20+
fun_control = {
21+
"core_model_hyper_dict": {
22+
"use_aggregation": {"type": "boolean", "default": 1, "lower": 0, "upper": 1, "levels": [0, 1]}
23+
}
24+
}
25+
set_hyperparameter(fun_control, "use_aggregation", [False, True])
26+
assert fun_control["core_model_hyper_dict"]["use_aggregation"]["lower"] is False
27+
assert fun_control["core_model_hyper_dict"]["use_aggregation"]["upper"] is True
28+
29+
30+
def test_set_hyperparameter_factor():
31+
fun_control = {
32+
"core_model_hyper_dict": {"leaf_model": {"type": "factor", "default": "LinearRegression", "upper": 1}}
33+
}
34+
set_hyperparameter(fun_control, "leaf_model", ["LinearRegression", "Perceptron"])
35+
assert fun_control["core_model_hyper_dict"]["leaf_model"]["levels"] == ["LinearRegression", "Perceptron"]
36+
assert fun_control["core_model_hyper_dict"]["leaf_model"]["upper"] == 1
37+
38+
39+
def test_set_hyperparameter_invalid_type():
40+
fun_control = {"core_model_hyper_dict": {"n_estimators": {"type": "int", "default": 10, "lower": 2, "upper": 1000}}}
41+
with pytest.raises(ValueError):
42+
set_hyperparameter(fun_control, "n_estimators", [2, "five"])
43+
44+
45+
def test_set_hyperparameter_invalid_values_type():
46+
fun_control = {"core_model_hyper_dict": {"n_estimators": {"type": "int", "default": 10, "lower": 2, "upper": 1000}}}
47+
with pytest.raises(TypeError):
48+
set_hyperparameter(fun_control, "n_estimators", "2, 5")

0 commit comments

Comments
 (0)