Skip to content

Commit c8be0b2

Browse files
committed
fixed device bugs in HPO and ensembling
1 parent ecee3e4 commit c8be0b2

File tree

4 files changed

+19
-14
lines changed

4 files changed

+19
-14
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ and https://docs.ray.io/en/latest/cluster/vms/user-guides/community/slurm.html
196196

197197
## Releases (see git tags)
198198

199+
- v1.5.2: fixed more device bugs for HPO and ensembling
199200
- v1.5.1: fixed a device bug in TabM for GPU
200201
- v1.5.0:
201202
- added `n_repeats` parameter to scikit-learn interfaces for repeated cross-validation

pytabkit/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
#
33
# SPDX-License-Identifier: Apache-2.0
44

5-
__version__ = "1.5.1"
5+
__version__ = "1.5.2"

pytabkit/models/alg_interfaces/ensemble_interfaces.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def fit(self, ds: DictDataset, idxs_list: List[SplitIdxs], interface_resources:
110110
weights[weight_idx] += 1
111111

112112
y_pred_oob = wp.predict_for_weights(weights)
113-
loss = Metrics.apply(y_pred_oob, y_oob, val_metric_name).item()
113+
loss = Metrics.apply(y_pred_oob.cpu(), y_oob.cpu(), val_metric_name).item()
114114
# print(f'{weights=}, {loss=}')
115115
if loss < best_step_loss:
116116
best_step_loss = loss
@@ -124,7 +124,7 @@ def fit(self, ds: DictDataset, idxs_list: List[SplitIdxs], interface_resources:
124124
weights[weight_idx] -= 1
125125

126126
y_pred_oob = wp.predict_for_weights(weights)
127-
loss = Metrics.apply(y_pred_oob, y_oob, val_metric_name).item()
127+
loss = Metrics.apply(y_pred_oob.cpu(), y_oob.cpu(), val_metric_name).item()
128128
# print(f'{weights=}, {loss=}')
129129
if loss < best_step_loss:
130130
best_step_loss = loss
@@ -233,7 +233,7 @@ def fit(self, ds: DictDataset, idxs_list: List[SplitIdxs], interface_resources:
233233
# get out-of-bag predictions
234234
y_pred_oob = cat_if_necessary([y_preds[j, idxs_list[0].val_idxs[j]]
235235
for j in range(idxs_list[0].val_idxs.shape[0])], dim=0)
236-
loss = Metrics.apply(y_pred_oob, y_oob, val_metric_name).item()
236+
loss = Metrics.apply(y_pred_oob.cpu(), y_oob.cpu(), val_metric_name).item()
237237
if loss < best_alg_loss:
238238
best_alg_loss = loss
239239
best_alg_idx = alg_idx

tests/test_variants.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,32 @@
33
import pandas as pd
44
import sklearn
55
from sklearn.base import ClassifierMixin
6+
import torch
67

78
from pytabkit import TabM_D_Classifier, RealMLP_HPO_Classifier, Ensemble_HPO_Classifier, TabM_HPO_Regressor, \
89
TabM_HPO_Classifier, LGBM_HPO_Classifier, CatBoost_HPO_Classifier, XGB_HPO_Classifier, Ensemble_HPO_Regressor, \
910
LGBM_HPO_TPE_Regressor, RealMLP_TD_Regressor, RealMLP_HPO_Regressor, TabM_D_Regressor
1011

1112

1213
@pytest.mark.parametrize('estimator', [
13-
RealMLP_TD_Regressor(n_cv=2, n_refit=2, n_repeats=2, device='cpu'),
14-
RealMLP_HPO_Regressor(device='cpu', n_hyperopt_steps=2, train_metric_name='multi_pinball(0.1,0.9)',
14+
RealMLP_TD_Regressor(n_cv=2, n_refit=2, n_repeats=2),
15+
RealMLP_HPO_Regressor(n_hyperopt_steps=2, train_metric_name='multi_pinball(0.1,0.9)',
1516
val_metric_name='multi_pinball(0.1,0.9)'),
16-
TabM_D_Classifier(val_metric_name='cross_entropy', num_emb_type='pwl', tabm_k=16, device='cpu', random_state=0),
17-
TabM_D_Regressor(val_metric_name='cross_entropy', num_emb_type='pwl', tabm_k=16, device='cpu', random_state=0),
18-
TabM_HPO_Regressor(val_metric_name='mae', n_hyperopt_steps=2, hpo_space_name='tabarena', device='cpu',
17+
TabM_D_Classifier(val_metric_name='cross_entropy', num_emb_type='pwl', tabm_k=16, random_state=0),
18+
TabM_D_Regressor(val_metric_name='cross_entropy', num_emb_type='pwl', tabm_k=16, random_state=0),
19+
TabM_HPO_Regressor(val_metric_name='mae', n_hyperopt_steps=2, hpo_space_name='tabarena',
1920
random_state=0),
20-
TabM_HPO_Classifier(val_metric_name='mae', n_hyperopt_steps=2, hpo_space_name='default', device='cpu',
21+
TabM_HPO_Classifier(val_metric_name='mae', n_hyperopt_steps=2, hpo_space_name='default',
2122
random_state=0, use_caruana_ensembling=True),
23+
# use CPU since GPU might not support some features in the search space (it has problems with rsm for catboost)
2224
LGBM_HPO_Classifier(use_caruana_ensembling=True, n_hyperopt_steps=2, hpo_space_name='tabarena', device='cpu'),
2325
XGB_HPO_Classifier(use_caruana_ensembling=True, n_hyperopt_steps=2, hpo_space_name='tabarena', device='cpu'),
2426
CatBoost_HPO_Classifier(use_caruana_ensembling=True, n_hyperopt_steps=2, hpo_space_name='tabarena', device='cpu'),
2527
RealMLP_HPO_Classifier(val_metric_name='cross_entropy', n_hyperopt_steps=3, use_caruana_ensembling=True,
26-
hpo_space_name='tabarena', n_caruana_steps=10, random_state=0, device='cpu'),
27-
Ensemble_HPO_Classifier(val_metric_name='brier', device='cpu', n_hpo_steps=2, use_full_caruana_ensembling=True,
28+
hpo_space_name='tabarena', n_caruana_steps=10, random_state=0),
29+
Ensemble_HPO_Classifier(val_metric_name='brier', n_hpo_steps=2, use_full_caruana_ensembling=True,
2830
use_tabarena_spaces=True),
29-
Ensemble_HPO_Regressor(val_metric_name='brier', device='cpu', n_hpo_steps=2, use_full_caruana_ensembling=True,
31+
Ensemble_HPO_Regressor(val_metric_name='brier', n_hpo_steps=2, use_full_caruana_ensembling=True,
3032
use_tabarena_spaces=True),
3133
LGBM_HPO_TPE_Regressor(n_cv=2, n_refit=2, n_hyperopt_steps=2),
3234
])
@@ -37,7 +39,9 @@ def test_sklearn_not_crash(estimator):
3739
X['b'] = X['b'].astype('category')
3840

3941
est = sklearn.base.clone(estimator)
40-
est.device = 'cpu'
42+
if not torch.cuda.is_available():
43+
# don't use mps even if it's available
44+
est.device = 'cpu'
4145
if isinstance(est, ClassifierMixin):
4246
y = np.random.randint(3, size=(n_train,))
4347
else:

0 commit comments

Comments
 (0)