public void train(RegressionDataSet dataSet, ExecutorService threadPool) {
    List<Vec> inputs = new ArrayList<Vec>(dataSet.getSampleSize());
    for (int i = 0; i < dataSet.getSampleSize(); i++)
      inputs.add(dataSet.getDataPoint(i).getNumericalValues());

    coefficents = new DenseVector(dataSet.getNumNumericalVars() + 1);
    Vec targetValues = dataSet.getTargetValues();
    double minTarget = targetValues.min();
    double maxTarget = targetValues.max();
    shift = minTarget;
    scale = maxTarget - minTarget;

    // Now all values are in the range [0, 1]
    targetValues.subtract(shift);
    targetValues.mutableDivide(scale);

    Optimizer optimizer = new IterativelyReweightedLeastSquares();

    coefficents =
        optimizer.optimize(
            1e-5, 100, logitFun, logitFunD, coefficents, inputs, targetValues, threadPool);
  }