Skip to content

Commit 3948211

Browse files
set trial to unsuccess if trial loss is nan/inf (#6430)
1 parent d523bd2 commit 3948211

File tree

5 files changed

+49
-4
lines changed

5 files changed

+49
-4
lines changed

src/Microsoft.ML.AutoML/CodeGen/estimator-schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
"DnnFeaturizerImage",
7272
"Naive",
7373
"ForecastBySsa",
74-
"TextClassifcation"
74+
"TextClassification"
7575
]
7676
},
7777
"nugetDependencies": {

src/Microsoft.ML.AutoML/CodeGen/trainer-estimators.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@
512512
"searchOption": "image_classification_option"
513513
},
514514
{
515-
"functionName": "TextClassifcation",
515+
"functionName": "TextClassification",
516516
"estimatorTypes": [ "MultiClassification" ],
517517
"arguments": [
518518
{

src/Microsoft.ML.AutoML/SweepableEstimator/Estimators/TextClassification.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace Microsoft.ML.AutoML.CodeGen
1212
{
13-
internal partial class TextClassifcationMulti
13+
internal partial class TextClassificationMulti
1414
{
1515
public override IEstimator<ITransformer> BuildFromOption(MLContext context, TextClassificationOption param)
1616
{

src/Microsoft.ML.AutoML/Tuner/PipelineProposer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void Update(TrialResult result, string schema)
128128
{
129129
var loss = result.Loss;
130130
var duration = result.DurationInMilliseconds / 1000;
131-
var isSuccess = duration != 0;
131+
var isSuccess = duration != 0 && !double.IsNaN(loss) && !double.IsInfinity(loss);
132132

133133
// if k1 is null, it means this is the first completed trial.
134134
// in that case, initialize k1, k2, e1, e2 in the following way:

test/Microsoft.ML.AutoML.Tests/TunerTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,40 @@ public void CFO_should_start_from_init_point_if_provided()
127127
(x * x + y * y + z * z).Should().Be(0);
128128
}
129129

130+
[Fact]
131+
public void EciCfo_should_handle_trial_result_with_nan_value()
132+
{
133+
// this test verify if tuner can find max value for LSE.
134+
var context = new MLContext(1);
135+
var pipeline = this.CreateDummySweepablePipeline(context);
136+
var searchSpace = new SearchSpace.SearchSpace();
137+
searchSpace["_pipeline_"] = pipeline.SearchSpace;
138+
var tuner = new EciCostFrugalTuner(pipeline, new AutoMLExperiment.AutoMLExperimentSettings
139+
{
140+
SearchSpace = searchSpace,
141+
Seed = 1,
142+
});
143+
var invalidLosses = new[] { double.NaN, double.NegativeInfinity, double.PositiveInfinity };
144+
var id = 0;
145+
foreach (var loss in invalidLosses)
146+
{
147+
var trialSetting = new TrialSettings
148+
{
149+
TrialId = id++,
150+
Parameter = Parameter.CreateNestedParameter(),
151+
};
152+
var parameter = tuner.Propose(trialSetting);
153+
trialSetting.Parameter = parameter;
154+
var trialResult = new TrialResult
155+
{
156+
TrialSettings = trialSetting,
157+
DurationInMilliseconds = 10000,
158+
Loss = double.NaN,
159+
};
160+
tuner.Update(trialResult);
161+
}
162+
}
163+
130164
[Fact]
131165
public void LSE_maximize_test()
132166
{
@@ -346,5 +380,16 @@ private class LSE3DSearchSpace
346380
[Range(-10.0, 10.0, 0.0, false)]
347381
public double Z { get; set; }
348382
}
383+
384+
private SweepablePipeline CreateDummySweepablePipeline(MLContext context)
385+
{
386+
var mapKeyToValue = SweepableEstimatorFactory.CreateMapKeyToValue(new MapKeyToValueOption
387+
{
388+
InputColumnName = "input",
389+
OutputColumnName = "output",
390+
});
391+
392+
return mapKeyToValue.Append(context.Auto().BinaryClassification());
393+
}
349394
}
350395
}

0 commit comments

Comments
 (0)