Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,12 @@ public void run() {
// train default
DeepLearning dl = new DeepLearning(p);
DeepLearningModel mymodel = dl.trainModel().get();
Assert.assertEquals(ScoreKeeper.StoppingMetric.MSE, p._stopping_metric); // AE early-stops on MSE
Assert.assertEquals(ScoreKeeper.StoppingMetric.MSE, dl._parms._stopping_metric); // AE early-stops on MSE

// train non-standardized
DeepLearning dlNoStand = new DeepLearning(pNoStand);
DeepLearningModel mymodelNoStand = dlNoStand.trainModel().get();
Assert.assertEquals(ScoreKeeper.StoppingMetric.MSE, pNoStand._stopping_metric);
Assert.assertEquals(ScoreKeeper.StoppingMetric.MSE, dlNoStand._parms._stopping_metric);

Frame l2_frame_train=null, l2_frame_test=null;

Expand Down
31 changes: 31 additions & 0 deletions h2o-algos/src/test/java/hex/deeplearning/DeepLearningTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1318,6 +1318,37 @@ public void testCheckpointBackwards() {
}
}

@Test
public void testCheckpointAutoDistribution() {
Frame tfr = null;
DeepLearningModel dl = null;
DeepLearningModel dl2 = null;

try {
tfr = parseTestFile("./smalldata/iris/iris.csv");
DeepLearningParameters parms = new DeepLearningParameters();
parms._train = tfr._key;
parms._epochs = 1;
parms._response_column = "C5";
parms._reproducible = true;
parms._hidden = new int[]{2, 2};
parms._seed = 0xdecaf;

dl = new DeepLearning(parms).trainModel().get();

DeepLearningParameters parms2 = (DeepLearningParameters) parms.clone();
parms2._epochs = 2;
parms2._checkpoint = dl._key;

dl2 = new DeepLearning(parms2).trainModel().get();
Assert.assertTrue(dl2.epoch_counter > dl.epoch_counter);
} finally {
if (tfr != null) tfr.delete();
if (dl != null) dl.delete();
if (dl2 != null) dl2.delete();
}
}

@Test
public void testConvergenceLogloss() {
Frame tfr = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,17 @@ public void testTP1D() {
params._lambda_search = false;
GAMModel gam = new GAM(params).trainModel().get();
// check starT is of size k x M
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == params._M[0]));
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == gam._parms._M[0]));
// check penalty_CS is size k x k
assertTrue((gam._output._penaltyMatCS[0].length == (k-params._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-params._M[0])));
assertTrue((gam._output._penaltyMatCS[0].length == (k-gam._parms._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-gam._parms._M[0])));
Scope.track_generic(gam);
} finally {
Scope.exit();
}
}

// test with Gaussian with only thin plate regression smoothers with two predictors.
// test with Gaussian with only thin plate regression smoothers with two predictors.
@Test
public void testTP2D() {
Scope.enter();
Expand All @@ -117,15 +117,15 @@ public void testTP2D() {
GAMModel gam = new GAM(params).trainModel().get();
Scope.track_generic(gam);
// check starT is of size k x M
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == params._M[0]));
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == gam._parms._M[0]));
// check penalty_CS is size k x k
assertTrue((gam._output._penaltyMatCS[0].length == (k-params._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-params._M[0])));
assertTrue((gam._output._penaltyMatCS[0].length == (k-gam._parms._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-gam._parms._M[0])));
} finally {
Scope.exit();
}
}

// test with binomial for thin plate regression smoothers with three predictors and check that the polynomials
// are generated correctly by checking starT values
@Test
Expand All @@ -151,10 +151,10 @@ public void testTP3DStarT() {
GAMModel gam = new GAM(params).trainModel().get();
Scope.track_generic(gam);
// check starT is of size k x M
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == params._M[0]));
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == gam._parms._M[0]));
// check penalty_CS is size k x k
assertTrue((gam._output._penaltyMatCS[0].length == (k - params._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k - params._M[0])));
assertTrue((gam._output._penaltyMatCS[0].length == (k - gam._parms._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k - gam._parms._M[0])));
// check and make sure polynomials are generated correctly by checking starT
for (int gamInd = 0; gamInd < gamCols.length; gamInd++) {
assertCorrectStarT(gam._output, gamInd, gamCols[gamInd]);
Expand Down Expand Up @@ -288,11 +288,11 @@ public void testDataTransform() {
GAMModel gamStandardize = new GAM(params).trainModel().get();
Scope.track_generic(gamStandardize);
// check CS smoother penalty matrix has correct dimension
assertTrue((params._num_knots_sorted[0]-1) == gamStandardize._output._penaltyMatricesCenter[0][0].length);
assertTrue((gamStandardize._parms._num_knots_sorted[0]-1) == gamStandardize._output._penaltyMatricesCenter[0][0].length);
// check TP smoother penalty matrices have correct dimension
assertTrue((params._num_knots_sorted[1]-1) == gamStandardize._output._penaltyMatricesCenter[1][0].length); // for smoother {"C13", "C14", "C16"}
assertTrue((params._num_knots_sorted[2]-1) == gamStandardize._output._penaltyMatricesCenter[2][0].length); // for smoother {"C11", "C17"}
assertTrue((params._num_knots_sorted[3]-1) == gamStandardize._output._penaltyMatricesCenter[3][0].length); // for smoother {"C16"}
assertTrue((gamStandardize._parms._num_knots_sorted[1]-1) == gamStandardize._output._penaltyMatricesCenter[1][0].length); // for smoother {"C13", "C14", "C16"}
assertTrue((gamStandardize._parms._num_knots_sorted[2]-1) == gamStandardize._output._penaltyMatricesCenter[2][0].length); // for smoother {"C11", "C17"}
assertTrue((gamStandardize._parms._num_knots_sorted[3]-1) == gamStandardize._output._penaltyMatricesCenter[3][0].length); // for smoother {"C16"}
} finally {
Scope.exit();
}
Expand Down Expand Up @@ -353,10 +353,10 @@ public void testKnotsDefault() {
params._lambda = new double[]{10};
GAMModel gam = new GAM(params).trainModel().get();
// check starT is of size k x M
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == params._M[0]));
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == gam._parms._M[0]));
// check penalty_CS is size k x k
assertTrue((gam._output._penaltyMatCS[0].length == (k-params._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-params._M[0])));
assertTrue((gam._output._penaltyMatCS[0].length == (k-gam._parms._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-gam._parms._M[0])));
Scope.track_generic(gam);
} finally {
Scope.exit();
Expand Down Expand Up @@ -406,10 +406,10 @@ public void testKnotsGenerationFromFrame() {
params._savePenaltyMat = true;
GAMModel gam = new GAM(params).trainModel().get();
// check starT is of size k x M
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == params._M[0]));
assertTrue((gam._output._starT[0].length == k) && (gam._output._starT[0][0].length == gam._parms._M[0]));
// check penalty_CS is size k x k
assertTrue((gam._output._penaltyMatCS[0].length == (k-params._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-params._M[0])));
assertTrue((gam._output._penaltyMatCS[0].length == (k-gam._parms._M[0])) &&
(gam._output._penaltyMatCS[0][0].length == (k-gam._parms._M[0])));
Scope.track_generic(gam);
} finally {
Scope.exit();
Expand Down Expand Up @@ -510,7 +510,7 @@ public void testTransformData() {
Frame dataFrame = DKV.getGet(gam._output._gamTransformedTrainCenter); // transformed GAM columns from gam model
Scope.track(dataFrame);
for (int gamInd = 0; gamInd < gamCols.length; gamInd++)
assertCorrectTransform(train, dataFrame, 0.2, gamInd, params, gam._output);
assertCorrectTransform(train, dataFrame, 0.2, gamInd, gam._parms, gam._output);
} finally {
Scope.exit();
}
Expand Down
15 changes: 9 additions & 6 deletions h2o-algos/src/test/java/hex/glm/GLMTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -793,7 +793,7 @@ public void testBounds() {
DKV.put(fr._key, fr);
// now check the ginfo
DataInfo dinfo = new DataInfo(fr, null, 1, true, TransformType.NONE, DataInfo.TransformType.NONE, true, false, false, false, false, false);
GLMGradientTask lt = new GLMBinomialGradientTask(null,dinfo,params,0,beta).doAll(dinfo._adaptedFrame);
GLMGradientTask lt = new GLMBinomialGradientTask(null,dinfo,model._parms,0,beta).doAll(dinfo._adaptedFrame);
double [] grad = lt._gradient;
String [] names = model.dinfo().coefNames();
BufferedString tmpStr = new BufferedString();
Expand Down Expand Up @@ -1058,7 +1058,7 @@ public void testProximal() {
fr.add("CAPSULE", fr.remove("CAPSULE"));
// now check the ginfo
DataInfo dinfo = new DataInfo(fr, null, 1, true, TransformType.NONE, DataInfo.TransformType.NONE, true, false, false, false, false, false);
GLMGradientTask lt = new GLMBinomialGradientTask(null,dinfo, params, 0, beta_1).doAll(dinfo._adaptedFrame);
GLMGradientTask lt = new GLMBinomialGradientTask(null,dinfo, model._parms, 0, beta_1).doAll(dinfo._adaptedFrame);
double[] grad = lt._gradient;
for (int i = 0; i < beta_1.length; ++i)
assertEquals(0, grad[i] + betaConstraints.vec("rho").at(i) * (beta_1[i] - betaConstraints.vec("beta_given").at(i)), 1e-4);
Expand Down Expand Up @@ -1720,6 +1720,7 @@ public void testProstate() throws InterruptedException, ExecutionException {
model = glm.trainModel().get();
assertTrue(model._output.bestSubmodel().iteration == 5);
model.delete();
params = (GLMParameters) model._parms.clone();
params._max_iterations = 4;
glm = new GLM(params);
model = glm.trainModel().get();
Expand Down Expand Up @@ -1748,6 +1749,7 @@ public void testProstate() throws InterruptedException, ExecutionException {
assertEquals(model._output._training_metrics._MSE, mm._MSE, 1e-8);
assertEquals(((ModelMetricsBinomialGLM)model._output._training_metrics)._resDev, ((ModelMetricsBinomialGLM)mm)._resDev, 1e-8);
double prior = 1e-5;
params = (GLMParameters) model._parms.clone();
params._prior = prior;
// test the same data and model with prior, should get the same model except for the intercept
glm = new GLM(params);
Expand All @@ -1758,17 +1760,18 @@ public void testProstate() throws InterruptedException, ExecutionException {
assertEquals(model.beta()[model.beta().length-1] -Math.log(model._ymu[0] * (1-prior)/(prior * (1-model._ymu[0]))),model2.beta()[model.beta().length-1],1e-10);

// run with lambda search, check the final submodel
params = (GLMParameters) model2._parms.clone();
params._lambda_search = true;
params._lambda = null;
params._alpha = new double[]{0};
params._prior = -1;
params._obj_reg = -1;
params._max_iterations = 500;
params._objective_epsilon = 1e-6;
// test the same data and model with prior, should get the same model except for the intercept
glm = new GLM(params);
model3 = glm.trainModel().get();
double lambda = model3._output._submodels[model3._output._best_lambda_idx].lambda_value;
params = (GLMParameters) model3._parms.clone();
params._lambda_search = false;
params._lambda = new double[]{lambda};
ModelMetrics mm3 = ModelMetrics.getFromDKV(model3,fr);
Expand All @@ -1781,7 +1784,6 @@ public void testProstate() throws InterruptedException, ExecutionException {
mm3 = ModelMetrics.getFromDKV(model3,fr);
assertEquals("mse don't match, " + model3._output._training_metrics._MSE + " != " + mm3._MSE,model3._output._training_metrics._MSE,mm3._MSE,1e-8);
assertEquals("res-devs don't match, " + ((ModelMetricsBinomialGLM)model3._output._training_metrics)._resDev + " != " + ((ModelMetricsBinomialGLM)mm3)._resDev,((ModelMetricsBinomialGLM)model3._output._training_metrics)._resDev, ((ModelMetricsBinomialGLM)mm3)._resDev,1e-4);
// test the same data and model with prior, should get the same model except for the intercept
glm = new GLM(params);
model4 = glm.trainModel().get();
assertEquals("mse don't match, " + model3._output._training_metrics._MSE + " != " + model4._output._training_metrics._MSE,model3._output._training_metrics._MSE,model4._output._training_metrics._MSE,1e-6);
Expand Down Expand Up @@ -2018,7 +2020,7 @@ public void testCustomLambdaSearch(){
}
double obj_ls = likelihood_ls / nobs + ((1 - alpha) * parms._lambda[i] * .5 * ArrayUtils.l2norm2(beta_ls, true)) + alpha * parms._lambda[i] * ArrayUtils.l1norm(beta_ls, true);
double obj = likelihood / nobs + ((1 - alpha) * parms._lambda[i] * .5 * ArrayUtils.l2norm2(beta, true)) + alpha * parms._lambda[i] * ArrayUtils.l1norm(beta, true);
Assert.assertEquals(obj, obj_ls, 2*parms._objective_epsilon);
Assert.assertEquals(obj, obj_ls, 2*model._parms._objective_epsilon);
model2.delete();
}
model.delete();
Expand Down Expand Up @@ -2386,6 +2388,7 @@ public void testBoundsCategoricalCol() {
ModelMetricsBinomialGLM val = (ModelMetricsBinomialGLM) model._output._training_metrics;
assertEquals(512.2888, val._nullDev, 1e-1);
assertTrue(val._resDev <= 388.5);
params = (GLMParameters) model._parms.clone();
model.delete();
params._lambda = new double[]{0};
params._alpha = new double[]{0};
Expand All @@ -2401,7 +2404,7 @@ public void testBoundsCategoricalCol() {
fr.remove("ID").remove();
DKV.put(fr._key, fr);
DataInfo dinfo = new DataInfo(fr, null, 1, true, TransformType.NONE, DataInfo.TransformType.NONE, true, false, false, false, false, false);
GLMGradientTask lt = new GLMBinomialGradientTask(null,dinfo,params,0,beta).doAll(dinfo._adaptedFrame);
GLMGradientTask lt = new GLMBinomialGradientTask(null,dinfo,model._parms,0,beta).doAll(dinfo._adaptedFrame);
double [] grad = lt._gradient;
String [] names = model.dinfo().coefNames();
BufferedString tmpStr = new BufferedString();
Expand Down
4 changes: 2 additions & 2 deletions h2o-core/src/main/java/hex/ModelBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -78,16 +78,16 @@ protected ModelBuilder(P parms) {
/** Unique new job and named result key */
protected ModelBuilder(P parms, Key<M> key) {
_job = new Job<>(_result = key, parms.javaName(), parms.algoName());
_parms = parms;
_input_parms = (P) parms.clone();
_parms = (P) parms.clone();
}

/** Shared pre-existing Job and unique new result key */
protected ModelBuilder(P parms, Job<M> job) {
_job = job;
_result = defaultKey(parms.algoName());
_parms = parms;
_input_parms = (P) parms.clone();
_parms = (P) parms.clone();
}

/** List of known ModelBuilders with all default args; endlessly cloned by
Expand Down
11 changes: 9 additions & 2 deletions h2o-core/src/main/java/water/Job.java
Original file line number Diff line number Diff line change
Expand Up @@ -437,8 +437,15 @@ public T get() {
if( bar != null ) // Barrier may be null if task already completed
bar.join(); // Block on the *barrier* task, which blocks until the fjtask on*Completion code runs completely
assert isStopped();
if (_ex!=null)
throw new RuntimeException((Throwable)AutoBuffer.javaSerializeReadPojo(_ex));
if (_ex!=null) {
// Deliver the failure consistently with the barrier.join() path above, which rethrows
// the original exception - otherwise callers see a different exception type depending
// on whether the job failed before or after get() was called (GH-16717).
Throwable ex = (Throwable) AutoBuffer.javaSerializeReadPojo(_ex);
if (ex instanceof RuntimeException)
throw (RuntimeException) ex;
throw new RuntimeException(ex);
}
// Maybe null return, if the started fjtask does not actually produce a result at this Key
return _result==null ? null : _result.get();
}
Expand Down