public override IRegressionModel Build(IRegressionProblemData pd, IRandom random, CancellationToken cancellationToken, out int numberOfParameters) { if (pd.Dataset.Rows < MinLeafSize(pd)) { throw new ArgumentException("The number of training instances is too small to create a linear model"); } numberOfParameters = pd.AllowedInputVariables.Count() + 1; double x1, x2; var coeffs = ElasticNetLinearRegression.CalculateModelCoefficients(pd, 1, 0.2, out x1, out x2); numberOfParameters = coeffs.Length; return(ElasticNetLinearRegression.CreateSymbolicSolution(coeffs, pd).Model); }
private void CalculateCoefficients(IEnumerable <BasisFunction> basisFunctions, out double[] lambda, out double[,] coeff, out double[] trainNMSE, out double[] testNMSE, out double[] intercept, out IRegressionProblemData elnetData) { elnetData = PrepareData(Problem.ProblemData, basisFunctions); if (Verbose) { Results.Add(new Result( "Basis Functions", "Dataset which contains the Basis Functions after FFX Step 1.", elnetData )); } // "real" iteration with all Basis Functions in X_b ElasticNetLinearRegression.RunElasticNetLinearRegression(elnetData, Penalty, out lambda, out trainNMSE, out testNMSE, out coeff, out intercept, double.NegativeInfinity, double.PositiveInfinity); }
private IEnumerable <BasisFunction> CreateBasisFunctions() { IEnumerable <BasisFunction> basisFunctions = CreateUnivariateBases(Problem.ProblemData); if (Verbose) { Results.Add(new Result( "Problem.ProblemData", "The problem data the algorithm gets as input.", Problem.ProblemData )); } // wraps the list of basis functions in a dataset, so that it can be passed on to the ElNet function var elnetData = PrepareData(Problem.ProblemData, basisFunctions); if (Verbose) { Results.Add(new Result( "Univariate basis Functions", "A Dataset consisting of the univariate basis functions.", elnetData )); } if (ConsiderInteractions) { // for the purpose of efficiency, only the "most important" sqrt(n) basis functions are to be selected for the merge of multivariate bases step (see FFX paper) ElasticNetLinearRegression.RunElasticNetLinearRegression(elnetData, Penalty, out var lambda, out var trainNMSE, out var testNMSE, out var coeff, out var intercept); basisFunctions = FilterCoeffs(basisFunctions, coeff); basisFunctions = CreateMultivariateBases(basisFunctions); return(basisFunctions); } // add denominator bases to the already existing basis functions if (ConsiderDenominations) { basisFunctions = CreateDenominatorBases(Problem.ProblemData, basisFunctions); } return(basisFunctions); }