Skip to content

Commit 674c017

Browse files
saitcakmakmeta-codesync[bot]
authored andcommitted
Allow use of Winsorize transform without an optimization config (#4546)
Summary: Pull Request resolved: #4546 Allowing winsorization transform to be used without an optimization config will prevent some annoying errors in occasional notebook usage. If no opt config is provided, the transform becomes no-op. Reviewed By: sdaulton Differential Revision: D84167926 fbshipit-source-id: 3536ab81c56b31837291e18334e0fb3864089ab4
1 parent 56cb006 commit 674c017

2 files changed

Lines changed: 12 additions & 17 deletions

File tree

ax/adapter/transforms/tests/test_winsorize_transform.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,12 @@ def test_Init(self) -> None:
150150
"`Winsorize` transform requires non-empty data.",
151151
):
152152
Winsorize(search_space=None)
153-
with self.assertRaisesRegex(
154-
UserInputError,
155-
"Transform config for `Winsorize` transform must be specified and "
156-
"non-empty when using winsorization.",
157-
):
158-
Winsorize(
159-
search_space=None,
160-
experiment_data=self.experiment_data,
161-
)
153+
# Initialize with no opt config.
154+
t = Winsorize(
155+
search_space=None,
156+
experiment_data=self.experiment_data,
157+
)
158+
self.assertEqual(t.cutoffs, {})
162159
with self.assertRaisesRegex(
163160
UserInputError,
164161
"`derelativize_with_raw_status_quo` must be a boolean. Got 1234.",

ax/adapter/transforms/winsorize.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,11 @@ def __init__(
103103
)
104104
optimization_config = adapter._optimization_config if adapter else None
105105
if config is None and optimization_config is None:
106-
raise UserInputError(
107-
"Transform config for `Winsorize` transform must be specified and "
108-
"non-empty when using winsorization, or an adapter containing an "
109-
"optimization_config must be provided."
110-
)
106+
# We can't winsorize without an optimization config.
107+
# The lack of an optimization config often points to a manual
108+
# adapter creation, in which case we can just skip winsorization.
109+
self.cutoffs = {}
110+
return
111111
if config is None:
112112
config = {}
113113

@@ -139,9 +139,7 @@ def _transform_observation_data(
139139
for obsd in observation_data:
140140
for idx, metric_signature in enumerate(obsd.metric_signatures):
141141
if metric_signature not in self.cutoffs:
142-
raise ValueError(
143-
f"Cannot winsorize unknown metric {metric_signature}"
144-
)
142+
continue
145143
# Clip on the winsorization bounds.
146144
obsd.means[idx] = max(
147145
obsd.means[idx], self.cutoffs[metric_signature][0]

0 commit comments

Comments
 (0)