wavetrainer 0.0.30__tar.gz → 0.0.32__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wavetrainer-0.0.30/wavetrainer.egg-info → wavetrainer-0.0.32}/PKG-INFO +1 -1
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/setup.py +1 -1
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/__init__.py +1 -1
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/combined_reducer.py +14 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/trainer.py +21 -3
- {wavetrainer-0.0.30 → wavetrainer-0.0.32/wavetrainer.egg-info}/PKG-INFO +1 -1
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/LICENSE +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/MANIFEST.in +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/README.md +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/requirements.txt +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/setup.cfg +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/tests/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/tests/model/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/tests/model/catboost_kwargs_test.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/tests/trainer_test.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/calibrator/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/calibrator/calibrator.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/calibrator/calibrator_router.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/calibrator/mapie_calibrator.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/calibrator/vennabers_calibrator.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/create.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/exceptions.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/fit.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/catboost_classifier_wrap.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/catboost_kwargs.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/catboost_model.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/catboost_regressor_wrap.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/model.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/model_router.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model/tabpfn_model.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/model_type.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/params.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/base_selector_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/constant_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/correlation_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/duplicate_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/nonnumeric_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/smart_correlation_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/reducer/unseen_reducer.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/selector/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/selector/selector.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/class_weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/combined_weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/exponential_weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/linear_weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/noop_weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/sigmoid_weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/weights.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/weights/weights_router.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/windower/__init__.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer/windower/windower.py +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer.egg-info/SOURCES.txt +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer.egg-info/dependency_links.txt +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer.egg-info/not-zip-safe +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer.egg-info/requires.txt +0 -0
- {wavetrainer-0.0.30 → wavetrainer-0.0.32}/wavetrainer.egg-info/top_level.txt +0 -0
@@ -23,7 +23,7 @@ def install_requires() -> typing.List[str]:
|
|
23
23
|
|
24
24
|
setup(
|
25
25
|
name='wavetrainer',
|
26
|
-
version='0.0.
|
26
|
+
version='0.0.32',
|
27
27
|
description='A library for automatically finding the optimal model within feature and hyperparameter space.',
|
28
28
|
long_description=long_description,
|
29
29
|
long_description_content_type='text/markdown',
|
@@ -18,6 +18,7 @@ from .unseen_reducer import UnseenReducer
|
|
18
18
|
|
19
19
|
_COMBINED_REDUCER_FILE = "combined_reducer.json"
|
20
20
|
_REDUCERS_KEY = "reducers"
|
21
|
+
_REMOVED_COLUMNS_FILE = "combined_reducer_removed_columns.json"
|
21
22
|
|
22
23
|
|
23
24
|
class CombinedReducer(Reducer):
|
@@ -35,6 +36,7 @@ class CombinedReducer(Reducer):
|
|
35
36
|
CorrelationReducer(),
|
36
37
|
SmartCorrelationReducer(),
|
37
38
|
]
|
39
|
+
self._folder = None
|
38
40
|
|
39
41
|
@classmethod
|
40
42
|
def name(cls) -> str:
|
@@ -67,6 +69,7 @@ class CombinedReducer(Reducer):
|
|
67
69
|
self._reducers.append(SmartCorrelationReducer())
|
68
70
|
for reducer in self._reducers:
|
69
71
|
reducer.load(folder)
|
72
|
+
self._folder = folder
|
70
73
|
|
71
74
|
def save(self, folder: str, trial: optuna.Trial | optuna.trial.FrozenTrial) -> None:
|
72
75
|
with open(
|
@@ -89,8 +92,19 @@ class CombinedReducer(Reducer):
|
|
89
92
|
eval_x: pd.DataFrame | None = None,
|
90
93
|
eval_y: pd.Series | pd.DataFrame | None = None,
|
91
94
|
) -> Self:
|
95
|
+
removed_columns_dict = {}
|
92
96
|
for reducer in self._reducers:
|
97
|
+
before_columns = set(df.columns.values)
|
93
98
|
df = reducer.fit_transform(df)
|
99
|
+
after_columns = set(df.columns.values)
|
100
|
+
removed_columns = before_columns.difference(after_columns)
|
101
|
+
if removed_columns:
|
102
|
+
removed_columns_dict[reducer.name()] = list(removed_columns)
|
103
|
+
if self._folder is not None:
|
104
|
+
with open(
|
105
|
+
os.path.join(self._folder, _REMOVED_COLUMNS_FILE), encoding="utf8"
|
106
|
+
) as handle:
|
107
|
+
json.dump(removed_columns_dict, handle)
|
94
108
|
return self
|
95
109
|
|
96
110
|
def transform(self, df: pd.DataFrame) -> pd.DataFrame:
|
@@ -37,6 +37,7 @@ _TEST_SIZE_KEY = "test_size"
|
|
37
37
|
_VALIDATION_SIZE_KEY = "validation_size"
|
38
38
|
_IDX_USR_ATTR_KEY = "idx"
|
39
39
|
_DT_COLUMN_KEY = "dt_column"
|
40
|
+
_BAD_OUTPUT = -1000.0
|
40
41
|
|
41
42
|
|
42
43
|
def _assign_bin(timestamp, bins: list[datetime.datetime]) -> int:
|
@@ -209,6 +210,7 @@ class Trainer(Fit):
|
|
209
210
|
folder = os.path.join(
|
210
211
|
self._folder, str(y_series.name), split_idx.isoformat()
|
211
212
|
)
|
213
|
+
new_folder = os.path.exists(folder)
|
212
214
|
os.makedirs(folder, exist_ok=True)
|
213
215
|
trial_file = os.path.join(folder, _TRIAL_FILENAME)
|
214
216
|
if os.path.exists(trial_file):
|
@@ -234,8 +236,10 @@ class Trainer(Fit):
|
|
234
236
|
x_train = windower.fit_transform(x_train)
|
235
237
|
y_train = y_train[-len(x_train) :]
|
236
238
|
if len(y_train.unique()) <= 1:
|
239
|
+
if new_folder:
|
240
|
+
os.removedirs(folder)
|
237
241
|
logging.warning("Y train only contains 1 unique datapoint.")
|
238
|
-
return
|
242
|
+
return _BAD_OUTPUT
|
239
243
|
|
240
244
|
# Perform common reductions
|
241
245
|
reducer = CombinedReducer()
|
@@ -297,7 +301,9 @@ class Trainer(Fit):
|
|
297
301
|
return output
|
298
302
|
except WavetrainException as exc:
|
299
303
|
logging.warning(str(exc))
|
300
|
-
|
304
|
+
if new_folder:
|
305
|
+
os.removedirs(folder)
|
306
|
+
return _BAD_OUTPUT
|
301
307
|
|
302
308
|
start_validation_index = (
|
303
309
|
dt_index.to_list()[-int(len(dt_index) * self._validation_size) - 1]
|
@@ -339,6 +345,18 @@ class Trainer(Fit):
|
|
339
345
|
if self._max_train_timeout is None
|
340
346
|
else self._max_train_timeout.total_seconds(),
|
341
347
|
)
|
348
|
+
while (
|
349
|
+
study.best_trial.value is None or study.best_trial.value == _BAD_OUTPUT
|
350
|
+
):
|
351
|
+
logging.info("Performing extra train")
|
352
|
+
study.optimize(
|
353
|
+
test_objective,
|
354
|
+
n_trials=1,
|
355
|
+
show_progress_bar=True,
|
356
|
+
timeout=None
|
357
|
+
if self._max_train_timeout is None
|
358
|
+
else self._max_train_timeout.total_seconds(),
|
359
|
+
)
|
342
360
|
|
343
361
|
train_len = len(df[dt_index < start_test_index])
|
344
362
|
test_len = len(
|
@@ -372,7 +390,7 @@ class Trainer(Fit):
|
|
372
390
|
|
373
391
|
test_df = df.iloc[: train_len + count + test_len]
|
374
392
|
test_series = y_series.iloc[: train_len + count + test_len]
|
375
|
-
if len(test_df) <=
|
393
|
+
if len(test_df) <= 3:
|
376
394
|
continue
|
377
395
|
|
378
396
|
if test_idx < start_validation_index:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|