public void SharpLearning_Example()
        {
            // Load data
            var(observations, targets) = DataSetUtilities.LoadWinequalityWhite();

            // transform data for neural net
            var transform = new MinMaxTransformer(0.0, 1.0);

            transform.Transform(observations, observations);

            var featureCount = observations.ColumnCount;

            // define the neural net.
            var net = new NeuralNet();

            net.Add(new InputLayer(inputUnits: featureCount));
            net.Add(new DenseLayer(32, Activation.Relu));
            net.Add(new DenseLayer(32, Activation.Relu));
            net.Add(new SquaredErrorRegressionLayer());

            // using only 10 iteration to make the example run faster.
            // using square error as error metric. This is only used for reporting progress.
            var learner = new RegressionNeuralNetLearner(net, iterations: 10, loss: new SquareLoss(),
                                                         optimizerMethod: OptimizerMethod.Adam);

            var cv          = new RandomCrossValidation <double>(10, seed: 232);
            var predictions = cv.CrossValidate(learner, observations, targets);

            Trace.WriteLine(FormatErrorString(targets, predictions));
        }
        public void Hyper_Parameter_Tuning()
        {
            #region Read data

            // Use StreamReader(filepath) when running from filesystem
            var parser     = new CsvParser(() => new StringReader(Resources.winequality_white));
            var targetName = "quality";

            // read feature matrix
            var observations = parser.EnumerateRows(c => c != targetName)
                               .ToF64Matrix();

            // read classification targets
            var targets = parser.EnumerateRows(targetName)
                          .ToF64Vector();

            #endregion

            // metric to minimize
            var metric = new MeanSquaredErrorRegressionMetric();

            // Parameter ranges for the optimizer
            var paramers = new ParameterBounds[]
            {
                new ParameterBounds(min: 1, max: 100, transform: Transform.Linear), // maximumTreeDepth
                new ParameterBounds(min: 1, max: 16, transform: Transform.Linear),  // minimumSplitSize
            };

            // create random search optimizer
            var optimizer = new RandomSearchOptimizer(paramers, iterations: 30, runParallel: true);

            // other availible optimizers
            // GridSearchOptimizer
            // GlobalizedBoundedNelderMeadOptimizer
            // ParticleSwarmOptimizer
            // BayesianOptimizer

            // function to minimize
            Func <double[], OptimizerResult> minimize = p =>
            {
                var cv          = new RandomCrossValidation <double>(crossValidationFolds: 5, seed: 42);
                var optlearner  = new RegressionDecisionTreeLearner(maximumTreeDepth: (int)p[0], minimumSplitSize: (int)p[1]);
                var predictions = cv.CrossValidate(optlearner, observations, targets);
                var error       = metric.Error(targets, predictions);
                Trace.WriteLine("Error: " + error);
                return(new OptimizerResult(p, error));
            };

            // run optimizer
            var result         = optimizer.OptimizeBest(minimize);
            var bestParameters = result.ParameterSet;

            Trace.WriteLine("Result: " + result.Error);

            // create learner with found parameters
            var learner = new RegressionDecisionTreeLearner(maximumTreeDepth: (int)bestParameters[0], minimumSplitSize: (int)bestParameters[1]);

            // learn model with found parameters
            var model = learner.Learn(observations, targets);
        }
        public void ClassificationModelSelectingEnsembleLearner_Constructor_EnsembleSelection_Null()
        {
            var learners         = new IIndexedLearner <ProbabilityPrediction> [4];
            var metric           = new LogLossClassificationProbabilityMetric();
            var ensembleStrategy = new MeanProbabilityClassificationEnsembleStrategy();
            var crossValidation  = new RandomCrossValidation <ProbabilityPrediction>(5);

            var sut = new ClassificationModelSelectingEnsembleLearner(learners, crossValidation, ensembleStrategy, null);
        }
        public void ClassificationModelSelectingEnsembleLearner_Constructor_Learners_Null()
        {
            var metric            = new LogLossClassificationProbabilityMetric();
            var ensembleStrategy  = new MeanProbabilityClassificationEnsembleStrategy();
            var ensembleSelection = new ForwardSearchClassificationEnsembleSelection(metric, ensembleStrategy, 5, 1, true);
            var crossValidation   = new RandomCrossValidation <ProbabilityPrediction>(5);

            var sut = new ClassificationModelSelectingEnsembleLearner(null, crossValidation, ensembleStrategy, ensembleSelection);
        }
        public void RegressionModelSelectingEnsembleLearner_Constructor_EnsembleSelection_Null()
        {
            var learners         = new IIndexedLearner <double> [4];
            var metric           = new MeanSquaredErrorRegressionMetric();
            var ensembleStrategy = new MeanRegressionEnsembleStrategy();
            var crossValidation  = new RandomCrossValidation <double>(5);

            var sut = new RegressionModelSelectingEnsembleLearner(learners, crossValidation, ensembleStrategy, null);
        }
        public void RegressionModelSelectingEnsembleLearner_Constructor_Learners_Null()
        {
            var metric            = new MeanSquaredErrorRegressionMetric();
            var ensembleStrategy  = new MeanRegressionEnsembleStrategy();
            var ensembleSelection = new ForwardSearchRegressionEnsembleSelection(metric, ensembleStrategy, 5, 1, true);
            var crossValidation   = new RandomCrossValidation <double>(5);

            var sut = new RegressionModelSelectingEnsembleLearner(null, crossValidation, ensembleStrategy, ensembleSelection);
        }
Example #7
0
        double CrossValidate(int folds)
        {
            var(observations, targets) = DataSetUtilities.LoadDecisionTreeDataSet();

            var sut         = new RandomCrossValidation <double>(folds, 42);
            var predictions = sut.CrossValidate(new RegressionDecisionTreeLearner(), observations, targets);
            var metric      = new MeanSquaredErrorRegressionMetric();

            return(metric.Error(targets, predictions));
        }
Example #8
0
        double CrossValidate(int folds)
        {
            var targetName   = "T";
            var parser       = new CsvParser(() => new StringReader(Resources.DecisionTreeData));
            var observations = parser.EnumerateRows(v => !v.Contains(targetName)).ToF64Matrix();
            var targets      = parser.EnumerateRows(targetName).ToF64Vector();

            var sut         = new RandomCrossValidation <double>(folds, 42);
            var predictions = sut.CrossValidate(new RegressionDecisionTreeLearner(), observations, targets);
            var metric      = new MeanSquaredErrorRegressionMetric();

            return(metric.Error(targets, predictions));
        }
Example #9
0
        double CrossValidate_Provide_Indices(int folds)
        {
            var(observations, targets) = DataSetUtilities.LoadDecisionTreeDataSet();

            var sut = new RandomCrossValidation <double>(folds, 42);

            var rowsToCrossvalidate = targets.Length / 2;
            var indices             = Enumerable.Range(0, rowsToCrossvalidate).ToArray();
            var predictions         = new double[rowsToCrossvalidate];

            sut.CrossValidate(new RegressionDecisionTreeLearner(), observations, targets, indices, predictions);
            var metric = new MeanSquaredErrorRegressionMetric();

            return(metric.Error(targets.Take(rowsToCrossvalidate).ToArray(), predictions));
        }
Example #10
0
        double CrossValidate_Provide_Indices(int folds)
        {
            var targetName   = "T";
            var parser       = new CsvParser(() => new StringReader(Resources.DecisionTreeData));
            var observations = parser.EnumerateRows(v => !v.Contains(targetName)).ToF64Matrix();
            var targets      = parser.EnumerateRows(targetName).ToF64Vector();

            var sut = new RandomCrossValidation <double>(folds, 42);

            var rowsToCrossvalidate = targets.Length / 2;
            var indices             = Enumerable.Range(0, rowsToCrossvalidate).ToArray();
            var predictions         = new double[rowsToCrossvalidate];

            sut.CrossValidate(new RegressionDecisionTreeLearner(), observations, targets, indices, predictions);
            var metric = new MeanSquaredErrorRegressionMetric();

            return(metric.Error(targets.Take(rowsToCrossvalidate).ToArray(), predictions));
        }
        public void CrossValidation_CrossValidate_ProbabilityPredictions()
        {
            #region Read data

            // Use StreamReader(filepath) when running from filesystem
            var parser     = new CsvParser(() => new StringReader(Resources.winequality_white));
            var targetName = "quality";

            // read feature matrix (all columns different from the targetName)
            var observations = parser.EnumerateRows(c => c != targetName)
                               .ToF64Matrix();

            // read targets
            var targets = parser.EnumerateRows(targetName)
                          .ToF64Vector();

            #endregion

            // creates cross validator, observations are shuffled randomly
            var cv = new RandomCrossValidation <ProbabilityPrediction>(crossValidationFolds: 5, seed: 42);

            // create learner
            var learner = new ClassificationDecisionTreeLearner();

            // cross-validated predictions
            var cvPredictions = cv.CrossValidate(learner, observations, targets);

            // metric for measuring model error
            var metric = new LogLossClassificationProbabilityMetric();

            // cross-validation provides an estimate on how the model will perform on unseen data
            Trace.WriteLine("Cross-validation error: " + metric.Error(targets, cvPredictions));

            // train and predict training set for comparison
            var predictions = learner.Learn(observations, targets).PredictProbability(observations);

            // The training set is NOT a good estimate of how well the model will perfrom on unseen data.
            Trace.WriteLine("Training error: " + metric.Error(targets, predictions));
        }