Skip to content

Commit f1a34c2

Browse files
vikram31291iquintero
authored andcommitted
Added scaling_type to Integer and Continuous ranges (#697)
1 parent 5f53418 commit f1a34c2

File tree

6 files changed

+45
-18
lines changed

6 files changed

+45
-18
lines changed

CHANGELOG.rst

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
CHANGELOG
33
=========
44

5-
6-
1.18.5.dev
7-
==========
5+
1.18.5
6+
======
87

98
* bug-fix: pass kms id as parameter for uploading code with Server side encryption
109
* feature: ``PipelineModel``: Create a Transformer from a PipelineModel
1110
* bug-fix: ``AlgorithmEstimator``: Make SupportedHyperParameters optional
11+
* feature: ``Hyperparameter``: Support scaling hyperparameters
1212
* doc-fix: Remove duplicate content from main README.rst, /tensorflow/README.rst, and /sklearn/README.rst and add links to readthedocs content
1313

1414
1.18.4

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def read(fname):
3333
required_packages.append('enum34>=1.1.6')
3434

3535
setup(name="sagemaker",
36-
version='1.18.4',
36+
version='1.18.5',
3737
description="Open source library for training and deploying models on Amazon SageMaker.",
3838
packages=find_packages('src'),
3939
package_dir={'': 'src'},

src/sagemaker/parameter.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,18 @@ class ParameterRange(object):
2525

2626
__all_types__ = ('Continuous', 'Categorical', 'Integer')
2727

28-
def __init__(self, min_value, max_value):
28+
def __init__(self, min_value, max_value, scaling_type='Auto'):
2929
"""Initialize a parameter range.
3030
3131
Args:
3232
min_value (float or int): The minimum value for the range.
3333
max_value (float or int): The maximum value for the range.
34+
scaling_type (str): The scale used for searching the range during tuning (default: 'Auto').
35+
Valid values: 'Auto', 'Linear', 'Logarithmic' and 'ReverseLogarithmic'.
3436
"""
3537
self.min_value = min_value
3638
self.max_value = max_value
39+
self.scaling_type = scaling_type
3740

3841
def is_valid(self, value):
3942
"""Determine if a value is valid within this ParameterRange.
@@ -62,7 +65,8 @@ def as_tuning_range(self, name):
6265
"""
6366
return {'Name': name,
6467
'MinValue': to_str(self.min_value),
65-
'MaxValue': to_str(self.max_value)}
68+
'MaxValue': to_str(self.max_value),
69+
'ScalingType': self.scaling_type}
6670

6771

6872
class ContinuousParameter(ParameterRange):

src/sagemaker/tuner.py

+14-8
Original file line numberDiff line numberDiff line change
@@ -512,17 +512,23 @@ def _validate_parameter_ranges(self):
512512
parameter_range = self._hyperparameter_ranges[value.name]
513513

514514
if isinstance(parameter_range, ParameterRange):
515-
for _, parameter_range_value in parameter_range.__dict__.items():
516-
# Categorical ranges
517-
if isinstance(parameter_range_value, list):
518-
for categorical_value in parameter_range_value:
519-
value.validate(categorical_value)
520-
# Continuous, Integer ranges
521-
else:
522-
value.validate(parameter_range_value)
515+
self._validate_parameter_range(value, parameter_range)
523516
except KeyError:
524517
pass
525518

519+
def _validate_parameter_range(self, value_hp, parameter_range):
520+
for parameter_range_key, parameter_range_value in parameter_range.__dict__.items():
521+
if parameter_range_key == 'scaling_type':
522+
continue
523+
524+
# Categorical ranges
525+
if isinstance(parameter_range_value, list):
526+
for categorical_value in parameter_range_value:
527+
value_hp.validate(categorical_value)
528+
# Continuous, Integer ranges
529+
else:
530+
value_hp.validate(parameter_range_value)
531+
526532
def transfer_learning_tuner(self, additional_parents=None, estimator=None):
527533
"""Creates a new ``HyperparameterTuner`` by copying the request fields from the provided parent to the new
528534
instance of ``HyperparameterTuner``. Followed by addition of warm start configuration with the type as

tests/unit/test_airflow.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -502,15 +502,17 @@ def test_framework_tuning_config(sagemaker_session):
502502
'ContinuousParameterRanges': [{
503503
'Name': 'learning_rate',
504504
'MinValue': '0.01',
505-
'MaxValue': '0.2'}],
505+
'MaxValue': '0.2',
506+
'ScalingType': 'Auto'}],
506507
'CategoricalParameterRanges': [{
507508
'Name': 'optimizer',
508509
'Values': ['"sgd"', '"Adam"']
509510
}],
510511
'IntegerParameterRanges': [{
511512
'Name': 'num_epoch',
512513
'MinValue': '10',
513-
'MaxValue': '50'
514+
'MaxValue': '50',
515+
'ScalingType': 'Auto'
514516
}]
515517
}},
516518
'TrainingJobDefinition': {

tests/unit/test_tuner.py

+17-2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
'MaxValue': '100',
7272
'Name': 'mini_batch_size',
7373
'MinValue': '10',
74+
'ScalingType': 'Auto'
7475
},
7576
]
7677
},
@@ -631,10 +632,17 @@ def test_continuous_parameter():
631632
def test_continuous_parameter_ranges():
632633
cont_param = ContinuousParameter(0.1, 1e-2)
633634
ranges = cont_param.as_tuning_range('some')
634-
assert len(ranges.keys()) == 3
635+
assert len(ranges.keys()) == 4
635636
assert ranges['Name'] == 'some'
636637
assert ranges['MinValue'] == '0.1'
637638
assert ranges['MaxValue'] == '0.01'
639+
assert ranges['ScalingType'] == 'Auto'
640+
641+
642+
def test_continuous_parameter_scaling_type():
643+
cont_param = ContinuousParameter(0.1, 2, scaling_type='ReverseLogarithmic')
644+
cont_range = cont_param.as_tuning_range('range')
645+
assert cont_range['ScalingType'] == 'ReverseLogarithmic'
638646

639647

640648
def test_integer_parameter():
@@ -646,10 +654,17 @@ def test_integer_parameter():
646654
def test_integer_parameter_ranges():
647655
int_param = IntegerParameter(1, 2)
648656
ranges = int_param.as_tuning_range('some')
649-
assert len(ranges.keys()) == 3
657+
assert len(ranges.keys()) == 4
650658
assert ranges['Name'] == 'some'
651659
assert ranges['MinValue'] == '1'
652660
assert ranges['MaxValue'] == '2'
661+
assert ranges['ScalingType'] == 'Auto'
662+
663+
664+
def test_integer_parameter_scaling_type():
665+
int_param = IntegerParameter(2, 3, scaling_type='Linear')
666+
int_range = int_param.as_tuning_range('range')
667+
assert int_range['ScalingType'] == 'Linear'
653668

654669

655670
def test_categorical_parameter_list():

0 commit comments

Comments
 (0)