Share via


LearningPipelineExtensions.WithOnFitDelegate<TTransformer> Metodo

Definizione

Dato un stimatore, restituire un oggetto wrapping che chiamerà un delegato una volta Fit(IDataView) chiamato. Spesso è importante che un stimatore restituisca informazioni su ciò che è stato adatto, che è il motivo per cui il Fit(IDataView) metodo restituisce un oggetto tipizzato in modo specifico, anziché solo un oggetto generale ITransformer. Tuttavia, allo stesso tempo, IEstimator<TTransformer> sono spesso formati in pipeline con molti oggetti, quindi potrebbe essere necessario creare una catena di stima tramite EstimatorChain<TLastTransformer> dove lo stimatore per cui si vuole ottenere il trasformatore è sepolto da qualche parte in questa catena. Per questo scenario, è possibile collegare questo metodo a un delegato che verrà chiamato una volta chiamato fit.

public static Microsoft.ML.IEstimator<TTransformer> WithOnFitDelegate<TTransformer> (this Microsoft.ML.IEstimator<TTransformer> estimator, Action<TTransformer> onFit) where TTransformer : class, Microsoft.ML.ITransformer;
static member WithOnFitDelegate : Microsoft.ML.IEstimator<'ransformer (requires 'ransformer : null and 'ransformer :> Microsoft.ML.ITransformer)> * Action<'ransformer (requires 'ransformer : null and 'ransformer :> Microsoft.ML.ITransformer)> -> Microsoft.ML.IEstimator<'ransformer (requires 'ransformer : null and 'ransformer :> Microsoft.ML.ITransformer)> (requires 'ransformer : null and 'ransformer :> Microsoft.ML.ITransformer)
<Extension()>
Public Function WithOnFitDelegate(Of TTransformer As {Class, ITransformer}) (estimator As IEstimator(Of TTransformer), onFit As Action(Of TTransformer)) As IEstimator(Of TTransformer)

Parametri di tipo

TTransformer

Tipo di ITransformer restituito da estimator

Parametri

estimator
IEstimator<TTransformer>

Valore di stima da eseguire a capo

onFit
Action<TTransformer>

Delegato chiamato con le istanze risultanti TTransformer una volta Fit(IDataView) chiamato. Poiché Fit(IDataView) può essere chiamato più volte, questo delegato può anche essere chiamato più volte.

Restituisce

Valore di stima di wrapping che chiama il delegato indicato ogni volta che viene chiamato l'adattamento

Esempio

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Transforms;
using static Microsoft.ML.Transforms.NormalizingTransformer;

namespace Samples.Dynamic
{
    public class WithOnFitDelegate
    {
        public static void Example()
        {
            // Create a new ML context, for ML.NET operations. It can be used for
            // exception tracking and logging, as well as the source of randomness.
            var mlContext = new MLContext();
            var samples = new List<DataPoint>()
            {
                new DataPoint(){ Features = new float[4] { 8, 1, 3, 0},
                    Label = true },

                new DataPoint(){ Features = new float[4] { 6, 2, 2, 0},
                    Label = true },

                new DataPoint(){ Features = new float[4] { 4, 0, 1, 0},
                    Label = false },

                new DataPoint(){ Features = new float[4] { 2,-1,-1, 1},
                    Label = false }

            };
            // Convert training data to IDataView, the general data type used in
            // ML.NET.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Create a pipeline to normalize the features and train a binary
            // classifier. We use WithOnFitDelegate for the intermediate binning
            // normalization step, so that we can inspect the properties of the
            // normalizer after fitting.
            NormalizingTransformer binningTransformer = null;
            var pipeline =
                mlContext.Transforms
                .NormalizeBinning("Features", maximumBinCount: 3)
                .WithOnFitDelegate(
                fittedTransformer => binningTransformer = fittedTransformer)
                .Append(mlContext.BinaryClassification.Trainers
                .LbfgsLogisticRegression());

            Console.WriteLine(binningTransformer == null);
            // Expected Output:
            //   True

            var model = pipeline.Fit(data);

            // During fitting binningTransformer will get assigned a new value
            Console.WriteLine(binningTransformer == null);
            // Expected Output:
            //   False

            // Inspect some of the properties of the binning transformer
            var binningParam = binningTransformer.GetNormalizerModelParameters(0) as
                BinNormalizerModelParameters<ImmutableArray<float>>;

            for (int i = 0; i < binningParam.UpperBounds.Length; i++)
            {
                var upperBounds = string.Join(", ", binningParam.UpperBounds[i]);
                Console.WriteLine(
                    $"Bin {i}: Density = {binningParam.Density[i]}, " +
                    $"Upper-bounds = {upperBounds}");

            }
            // Expected output:
            //   Bin 0: Density = 2, Upper-bounds = 3, 7, Infinity
            //   Bin 1: Density = 2, Upper-bounds = -0.5, 1.5, Infinity
            //   Bin 2: Density = 2, Upper-bounds = 0, 2.5, Infinity
            //   Bin 3: Density = 1, Upper-bounds = 0.5, Infinity
        }

        private class DataPoint
        {
            [VectorType(4)]
            public float[] Features { get; set; }
            public bool Label { get; set; }
        }
    }
}

Si applica a