wavetrainer 0.0.15__tar.gz → 0.0.17__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.15/wavetrainer.egg-info → wavetrainer-0.0.17}/PKG-INFO +1 -1
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/setup.py +1 -1
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/__init__.py +1 -1
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/combined_reducer.py +10 -1
- wavetrainer-0.0.17/wavetrainer/reducer/unseen_reducer.py +58 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/selector/selector.py +9 -1
- {wavetrainer-0.0.15 → wavetrainer-0.0.17/wavetrainer.egg-info}/PKG-INFO +1 -1
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer.egg-info/SOURCES.txt +1 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/LICENSE +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/MANIFEST.in +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/README.md +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/requirements.txt +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/setup.cfg +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/tests/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/tests/model/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/tests/model/catboost_kwargs_test.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/tests/trainer_test.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/calibrator/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/calibrator/calibrator.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/calibrator/calibrator_router.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/calibrator/mapie_calibrator.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/calibrator/vennabers_calibrator.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/create.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/exceptions.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/fit.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/catboost_classifier_wrap.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/catboost_kwargs.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/catboost_model.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/catboost_regressor_wrap.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/model.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model/model_router.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/model_type.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/params.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/base_selector_reducer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/constant_reducer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/correlation_reducer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/duplicate_reducer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/nonnumeric_reducer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/reducer/reducer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/selector/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/trainer.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/class_weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/combined_weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/exponential_weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/linear_weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/noop_weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/sigmoid_weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/weights.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/weights/weights_router.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/windower/__init__.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer/windower/windower.py +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer.egg-info/dependency_links.txt +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer.egg-info/not-zip-safe +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/wavetrainer.egg-info/requires.txt +0 -0
- {wavetrainer-0.0.15 → wavetrainer-0.0.17}/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.17',
|
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',
|
@@ -1,6 +1,7 @@
|
|
1
1
|
"""A reducer that combines all the other reducers."""
|
2
2
|
|
3
3
|
import json
|
4
|
+
import logging
|
4
5
|
import os
|
5
6
|
from typing import Self
|
6
7
|
|
@@ -12,6 +13,7 @@ from .correlation_reducer import CorrelationReducer
|
|
12
13
|
from .duplicate_reducer import DuplicateReducer
|
13
14
|
from .nonnumeric_reducer import NonNumericReducer
|
14
15
|
from .reducer import Reducer
|
16
|
+
from .unseen_reducer import UnseenReducer
|
15
17
|
|
16
18
|
_COMBINED_REDUCER_FILE = "combined_reducer.json"
|
17
19
|
_REDUCERS_KEY = "reducers"
|
@@ -25,6 +27,7 @@ class CombinedReducer(Reducer):
|
|
25
27
|
def __init__(self):
|
26
28
|
super().__init__()
|
27
29
|
self._reducers = [
|
30
|
+
UnseenReducer(),
|
28
31
|
ConstantReducer(),
|
29
32
|
DuplicateReducer(),
|
30
33
|
NonNumericReducer(),
|
@@ -54,6 +57,8 @@ class CombinedReducer(Reducer):
|
|
54
57
|
self._reducers.append(CorrelationReducer())
|
55
58
|
elif reducer_name == NonNumericReducer.name():
|
56
59
|
self._reducers.append(NonNumericReducer())
|
60
|
+
elif reducer_name == UnseenReducer.name():
|
61
|
+
self._reducers.append(UnseenReducer())
|
57
62
|
for reducer in self._reducers:
|
58
63
|
reducer.load(folder)
|
59
64
|
|
@@ -84,5 +89,9 @@ class CombinedReducer(Reducer):
|
|
84
89
|
|
85
90
|
def transform(self, df: pd.DataFrame) -> pd.DataFrame:
|
86
91
|
for reducer in self._reducers:
|
87
|
-
|
92
|
+
try:
|
93
|
+
df = reducer.transform(df)
|
94
|
+
except ValueError as exc:
|
95
|
+
logging.warning("Failed to reduce %s", reducer.name())
|
96
|
+
raise exc
|
88
97
|
return df
|
@@ -0,0 +1,58 @@
|
|
1
|
+
"""A reducer that removes unseen columns."""
|
2
|
+
|
3
|
+
import json
|
4
|
+
import os
|
5
|
+
from typing import Self
|
6
|
+
|
7
|
+
import optuna
|
8
|
+
import pandas as pd
|
9
|
+
|
10
|
+
from .reducer import Reducer
|
11
|
+
|
12
|
+
_UNSEEN_REDUCER_FILE = "unseen_reducer.json"
|
13
|
+
|
14
|
+
|
15
|
+
class UnseenReducer(Reducer):
|
16
|
+
"""A class that removes unseen columns from a dataframe."""
|
17
|
+
|
18
|
+
# pylint: disable=too-many-positional-arguments,too-many-arguments
|
19
|
+
|
20
|
+
def __init__(self):
|
21
|
+
super().__init__()
|
22
|
+
self._seen_features = []
|
23
|
+
|
24
|
+
@classmethod
|
25
|
+
def name(cls) -> str:
|
26
|
+
return "unseen"
|
27
|
+
|
28
|
+
def set_options(self, trial: optuna.Trial | optuna.trial.FrozenTrial) -> None:
|
29
|
+
pass
|
30
|
+
|
31
|
+
def load(self, folder: str) -> None:
|
32
|
+
with open(
|
33
|
+
os.path.join(folder, _UNSEEN_REDUCER_FILE), encoding="utf8"
|
34
|
+
) as handle:
|
35
|
+
self._seen_features = json.load(handle)
|
36
|
+
|
37
|
+
def save(self, folder: str) -> None:
|
38
|
+
with open(
|
39
|
+
os.path.join(folder, _UNSEEN_REDUCER_FILE), "w", encoding="utf8"
|
40
|
+
) as handle:
|
41
|
+
json.dump(
|
42
|
+
self._seen_features,
|
43
|
+
handle,
|
44
|
+
)
|
45
|
+
|
46
|
+
def fit(
|
47
|
+
self,
|
48
|
+
df: pd.DataFrame,
|
49
|
+
y: pd.Series | pd.DataFrame | None = None,
|
50
|
+
w: pd.Series | None = None,
|
51
|
+
eval_x: pd.DataFrame | None = None,
|
52
|
+
eval_y: pd.Series | pd.DataFrame | None = None,
|
53
|
+
) -> Self:
|
54
|
+
self._seen_features = df.columns.values.tolist()
|
55
|
+
return self
|
56
|
+
|
57
|
+
def transform(self, df: pd.DataFrame) -> pd.DataFrame:
|
58
|
+
return df[self._seen_features]
|
@@ -20,7 +20,7 @@ _SELECTOR_FILE = "selector.joblib"
|
|
20
20
|
class Selector(Params, Fit):
|
21
21
|
"""The selector class."""
|
22
22
|
|
23
|
-
# pylint: disable=too-many-positional-arguments,too-many-arguments
|
23
|
+
# pylint: disable=too-many-positional-arguments,too-many-arguments,consider-using-enumerate
|
24
24
|
|
25
25
|
_selector: RFE | None
|
26
26
|
|
@@ -66,6 +66,14 @@ class Selector(Params, Fit):
|
|
66
66
|
)
|
67
67
|
try:
|
68
68
|
self._selector.fit(df, y=y, sample_weight=w, **model_kwargs)
|
69
|
+
importances = self._model.estimator.feature_importances_
|
70
|
+
try:
|
71
|
+
importances_len = len(importances)
|
72
|
+
columns = self._selector.get_feature_names_out()
|
73
|
+
for i in range(importances_len):
|
74
|
+
logging.info("Feature %s: %f", columns[i], importances[i])
|
75
|
+
except TypeError:
|
76
|
+
pass
|
69
77
|
except ValueError as exc:
|
70
78
|
# Catch issues with 1 feature as a reduction target.
|
71
79
|
logging.warning(str(exc))
|
@@ -40,6 +40,7 @@ wavetrainer/reducer/correlation_reducer.py
|
|
40
40
|
wavetrainer/reducer/duplicate_reducer.py
|
41
41
|
wavetrainer/reducer/nonnumeric_reducer.py
|
42
42
|
wavetrainer/reducer/reducer.py
|
43
|
+
wavetrainer/reducer/unseen_reducer.py
|
43
44
|
wavetrainer/selector/__init__.py
|
44
45
|
wavetrainer/selector/selector.py
|
45
46
|
wavetrainer/weights/__init__.py
|
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
|