diff --git a/h2o-algos/src/main/java/hex/glm/GLMModel.java b/h2o-algos/src/main/java/hex/glm/GLMModel.java index 0e488a03ec73..c8360f3372f4 100755 --- a/h2o-algos/src/main/java/hex/glm/GLMModel.java +++ b/h2o-algos/src/main/java/hex/glm/GLMModel.java @@ -1031,10 +1031,10 @@ public DistributionFamily getDistributionFamily() { } @Override - public void addSearchFailureDetails(Grid.SearchFailure searchFailure, Grid grid) { - super.addSearchFailureDetails(searchFailure, grid); + public void addSearchWarnings(Grid.SearchFailure searchFailure, Grid grid) { + super.addSearchWarnings(searchFailure, grid); if (ArrayUtils.contains(grid.getHyperNames(), "alpha")) { - // maybe we should find a way to raise this warning at the very beginning of grid search, similar to validation ini ModelBuilder#init(). + // maybe we should find a way to raise this warning at the very beginning of grid search, similar to validation in ModelBuilder#init(). searchFailure.addWarning("Adding alpha array to hyperparameter runs slower with gridsearch. "+ "This is due to the fact that the algo has to run initialization for every alpha value. "+ "Setting the alpha array as a model parameter will skip the initialization and run faster overall."); diff --git a/h2o-core/src/main/java/hex/Model.java b/h2o-core/src/main/java/hex/Model.java index 092776017b87..072dcf509d00 100755 --- a/h2o-core/src/main/java/hex/Model.java +++ b/h2o-core/src/main/java/hex/Model.java @@ -806,7 +806,7 @@ private Parameters getDefaults() { * @param searchFailure * @param grid */ - public void addSearchFailureDetails(Grid.SearchFailure searchFailure, Grid grid) {} + public void addSearchWarnings(Grid.SearchFailure searchFailure, Grid grid) {} } public ModelMetrics addModelMetrics(final ModelMetrics mm) { diff --git a/h2o-core/src/main/java/hex/grid/Grid.java b/h2o-core/src/main/java/hex/grid/Grid.java index 39aa955de9de..7ced7b0f85b9 100644 --- a/h2o-core/src/main/java/hex/grid/Grid.java +++ b/h2o-core/src/main/java/hex/grid/Grid.java @@ -313,7 +313,7 @@ private void appendFailedModelParameters(final Key modelKey, final MP par _failures.put(searchedKey, searchFailure); } searchFailure.appendFailedModelParameters(params, rawParams, failureDetails, stackTrace); - if (params != null) params.addSearchFailureDetails(searchFailure, this); + if (params != null) params.addSearchWarnings(searchFailure, this); } static boolean isJobCanceled(final Throwable t) { @@ -406,6 +406,7 @@ public SearchFailure getFailures() { final Collection values = _failures.values(); // Original failures should be left intact. Also avoid mutability from outer space. final SearchFailure searchFailure = new SearchFailure(_params != null ? _params.getClass() : null); + if (_params != null) _params.addSearchWarnings(searchFailure, this); for (SearchFailure f : values) { searchFailure.appendFailedModelParameters(f._failed_params, f._failed_raw_params, f._failure_details, diff --git a/h2o-core/src/test/java/hex/HyperSpaceWalkerTest.java b/h2o-core/src/test/java/hex/HyperSpaceWalkerTest.java index 5a80a53013a8..d6878b0d3287 100644 --- a/h2o-core/src/test/java/hex/HyperSpaceWalkerTest.java +++ b/h2o-core/src/test/java/hex/HyperSpaceWalkerTest.java @@ -7,6 +7,7 @@ import org.junit.Test; import water.TestUtil; import water.test.dummy.DummyModelParameters; +import water.util.ReflectionUtils; import java.util.HashMap; import java.util.Map; @@ -16,6 +17,17 @@ public class HyperSpaceWalkerTest extends TestUtil { @BeforeClass public static void stall() { stall_till_cloudsize(1); } static public class DummyXGBoostModelParameters extends DummyModelParameters { + + private static final DummyXGBoostModelParameters DEFAULTS; + + static { + try { + DEFAULTS = DummyXGBoostModelParameters.class.newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + public int _max_depth; public double _min_rows; public double _sample_rate; @@ -26,6 +38,12 @@ static public class DummyXGBoostModelParameters extends DummyModelParameters { public float _reg_alpha; public float _scale_pos_weight; public float _max_delta_step; + + @Override + public Object getParameterDefaultValue(String name) { + // tricking the default logic here as this parameters class is not properly registered, so we can't obtain the defaults the usual way. + return ReflectionUtils.getFieldValue(DEFAULTS, name); + } } diff --git a/h2o-py/tests/testdir_algos/glm/pyunit_PUBDEV_8150_warning_alpha_grid.py b/h2o-py/tests/testdir_algos/glm/pyunit_PUBDEV_8150_warning_alpha_grid.py index 383363fe470b..49d6cd4cda8b 100644 --- a/h2o-py/tests/testdir_algos/glm/pyunit_PUBDEV_8150_warning_alpha_grid.py +++ b/h2o-py/tests/testdir_algos/glm/pyunit_PUBDEV_8150_warning_alpha_grid.py @@ -1,4 +1,6 @@ from builtins import range +import contextlib +from io import StringIO import sys sys.path.insert(1,"../../../") import h2o @@ -6,11 +8,6 @@ from h2o.estimators.glm import H2OGeneralizedLinearEstimator from h2o.grid.grid_search import H2OGridSearch -try: # redirect python output - from StringIO import StringIO # for python 3 -except ImportError: - from io import StringIO # for python 2 - # This test is used to make sure when a user tries to set alpha in the hyper-parameter of gridsearch, a warning # should appear to tell the user to set the alpha array as an parameter in the algorithm. def grid_alpha_search(): @@ -25,23 +22,17 @@ def grid_alpha_search(): hyper_parameters = {'alpha': [0, 0.5]} # set hyper_parameters for grid search print("Create models with lambda_search") - buffer = StringIO() # redirect output - sys.stderr=buffer - model_h2o_grid_search = H2OGridSearch(H2OGeneralizedLinearEstimator(family="tweedie", Lambda=0.5), - hyper_parameters) - model_h2o_grid_search.train(x=x, y=y, training_frame=hdf) - sys.stderr=sys.__stderr__ # redirect printout back to normal path + err = StringIO() + with contextlib.redirect_stderr(err): + model_h2o_grid_search = H2OGridSearch(H2OGeneralizedLinearEstimator(family="tweedie", Lambda=0.5), + hyper_parameters) + model_h2o_grid_search.train(x=x, y=y, training_frame=hdf) # check and make sure we get the correct warning message warn_phrase = "Adding alpha array to hyperparameter runs slower with gridsearch." - try: # for python 2.7 - assert len(buffer.buflist)==warnNumber - print(buffer.buflist[0]) - assert warn_phrase in buffer.buflist[0] - except: # for python 3. - warns = buffer.getvalue() - print("*** captured warning message: {0}".format(warns)) - assert warn_phrase in warns + warns = err.getvalue() + print("*** captured warning message: {0}".format(warns)) + assert warn_phrase in warns if __name__ == "__main__": pyunit_utils.standalone_test(grid_alpha_search)