Udostępnij za pośrednictwem


PermutationFeatureImportanceExtensions.PermutationFeatureImportance Metoda

Definicja

Przeciążenia

PermutationFeatureImportance(MulticlassClassificationCatalog, ITransformer, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji wieloklasyfikacji.

PermutationFeatureImportance(RegressionCatalog, ITransformer, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla regresji.

PermutationFeatureImportance(RankingCatalog, ITransformer, IDataView, String, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji.

PermutationFeatureImportance<TModel>(BinaryClassificationCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji binarnej.

PermutationFeatureImportance<TModel>(MulticlassClassificationCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji wieloklasyfikacji.

PermutationFeatureImportance<TModel>(RegressionCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla regresji.

PermutationFeatureImportance<TModel>(RankingCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji.

PermutationFeatureImportance(MulticlassClassificationCatalog, ITransformer, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji wieloklasyfikacji.

public static System.Collections.Immutable.ImmutableDictionary<string,Microsoft.ML.Data.MulticlassClassificationMetricsStatistics> PermutationFeatureImportance (this Microsoft.ML.MulticlassClassificationCatalog catalog, Microsoft.ML.ITransformer model, Microsoft.ML.IDataView data, string labelColumnName = "Label", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1);
static member PermutationFeatureImportance : Microsoft.ML.MulticlassClassificationCatalog * Microsoft.ML.ITransformer * Microsoft.ML.IDataView * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableDictionary<string, Microsoft.ML.Data.MulticlassClassificationMetricsStatistics>
<Extension()>
Public Function PermutationFeatureImportance (catalog As MulticlassClassificationCatalog, model As ITransformer, data As IDataView, Optional labelColumnName As String = "Label", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableDictionary(Of String, MulticlassClassificationMetricsStatistics)

Parametry

catalog
MulticlassClassificationCatalog

Wykaz klasyfikacji wieloklasowej.

model
ITransformer

Model, na którym należy ocenić znaczenie funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą mieć wartość KeyDataViewType.

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że będą używane maksymalnie 2 przykłady obiektów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Słownik mapuje każdą funkcję na swoją "współtworzenie" poszczególnych funkcji na ocenę.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.MulticlassClassification
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns =
                new string[] { nameof(Data.Feature1), nameof(Data.Feature2) };

            var pipeline = mlContext.Transforms
                .Concatenate("Features", featureColumns)
                .Append(mlContext.Transforms.Conversion.MapValueToKey("Label"))
                .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                .Append(mlContext.MulticlassClassification.Trainers
                .SdcaMaximumEntropy());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.MulticlassClassification
                .PermutationFeatureImportance(linearPredictor, transformedData,
                permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on
            // microaccuracy.
            var sortedIndices = permutationMetrics
                .Select((metrics, index) => new { index, metrics.MicroAccuracy })
                .OrderByDescending(feature => Math.Abs(feature.MicroAccuracy.Mean))
                .Select(feature => feature.index);

            Console.WriteLine("Feature\tChange in MicroAccuracy\t95% Confidence in "
                + "the Mean Change in MicroAccuracy");

            var microAccuracy = permutationMetrics.Select(x => x.MicroAccuracy)
                .ToArray();

            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:G4}\t{2:G4}",
                    featureColumns[i],
                    microAccuracy[i].Mean,
                    1.96 * microAccuracy[i].StandardError);
            }

            // Expected output:
            //Feature     Change in MicroAccuracy  95% Confidence in the Mean Change in MicroAccuracy
            //Feature2     -0.1395                 0.0006567
            //Feature1     -0.05367                0.0006908
        }

        private class Data
        {
            public float Label { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// <param name="nExamples">The number of examples.</param>
        /// <param name="bias">The bias, or offset, in the calculation of the
        /// label.</param>
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1)
        {
            var rng = new Random(seed);
            var max = bias + 4.5 * weight1 + 4.5 * weight2 + 0.5;
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                var value = (float)
                    (bias + weight1 * data.Feature1 + weight2 * data.Feature2 +
                    rng.NextDouble() - 0.5);

                if (value < max / 3)
                    data.Label = 0;
                else if (value < 2 * max / 3)
                    data.Label = 1;
                else
                    data.Label = 2;
                yield return data;
            }
        }
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — współpracuje z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość dla funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. mikro-dokładność) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki oceny z oryginalnego zestawu danych jest obliczana. Większa zmiana metryki oceny, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po kolei.

W tej implementacji funkcja PFI oblicza zmianę wszystkich możliwych metryk oceny klasyfikacji wieloklasowej dla każdej funkcji, a ImmutableArrayMulticlassClassificationMetrics obiekt jest zwracany. Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy

PermutationFeatureImportance(RegressionCatalog, ITransformer, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla regresji.

public static System.Collections.Immutable.ImmutableDictionary<string,Microsoft.ML.Data.RegressionMetricsStatistics> PermutationFeatureImportance (this Microsoft.ML.RegressionCatalog catalog, Microsoft.ML.ITransformer model, Microsoft.ML.IDataView data, string labelColumnName = "Label", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1);
static member PermutationFeatureImportance : Microsoft.ML.RegressionCatalog * Microsoft.ML.ITransformer * Microsoft.ML.IDataView * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableDictionary<string, Microsoft.ML.Data.RegressionMetricsStatistics>
<Extension()>
Public Function PermutationFeatureImportance (catalog As RegressionCatalog, model As ITransformer, data As IDataView, Optional labelColumnName As String = "Label", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableDictionary(Of String, RegressionMetricsStatistics)

Parametry

catalog
RegressionCatalog

Wykaz regresji.

model
ITransformer

Model, na którym należy ocenić znaczenie funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą mieć wartość Single.

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że będą używane maksymalnie 2 przykłady obiektów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Słownik mapuje każdą funkcję na swoją "współtworzenie" poszczególnych funkcji na ocenę.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.Regression
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns = new string[] { nameof(Data.Feature1),
                nameof(Data.Feature2) };

            var pipeline = mlContext.Transforms.Concatenate(
                "Features",
                featureColumns)
                .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                .Append(mlContext.Regression.Trainers.Ols());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.Regression
                .PermutationFeatureImportance(
                linearPredictor, transformedData, permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on RMSE.
            var sortedIndices = permutationMetrics
                .Select((metrics, index) => new
                {
                    index,
                    metrics.RootMeanSquaredError
                })

                .OrderByDescending(feature => Math.Abs(
                    feature.RootMeanSquaredError.Mean))

                .Select(feature => feature.index);

            Console.WriteLine("Feature\tModel Weight\tChange in RMSE\t95%" +
                "Confidence in the Mean Change in RMSE");

            var rmse = permutationMetrics.Select(x => x.RootMeanSquaredError)
                .ToArray();

            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:0.00}\t{2:G4}\t{3:G4}",
                    featureColumns[i],
                    linearPredictor.Model.Weights[i],
                    rmse[i].Mean,
                    1.96 * rmse[i].StandardError);
            }

            // Expected output:
            //  Feature    Model Weight Change in RMSE  95% Confidence in the Mean Change in RMSE
            //  Feature2        9.00        4.009       0.008304
            //  Feature1        4.48        1.901       0.003351
        }

        private class Data
        {
            public float Label { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// <param name="nExamples">The number of examples.</param>
        /// <param name="bias">The bias, or offset, in the calculation of the label.
        /// </param>
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1)
        {
            var rng = new Random(seed);
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                data.Label = (float)(bias + weight1 * data.Feature1 + weight2 *
                    data.Feature2 + rng.NextDouble() - 0.5);
                yield return data;
            }
        }
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — współpracuje z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość dla funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. R-squared) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki oceny z oryginalnego zestawu danych jest obliczana. Większa zmiana metryki oceny, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po kolei.

W tej implementacji funkcja PFI oblicza zmianę wszystkich możliwych metryk oceny regresji dla każdej funkcji i zwracany jest obiekt ImmutableArrayRegressionMetrics . Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy

PermutationFeatureImportance(RankingCatalog, ITransformer, IDataView, String, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji.

public static System.Collections.Immutable.ImmutableDictionary<string,Microsoft.ML.Data.RankingMetricsStatistics> PermutationFeatureImportance (this Microsoft.ML.RankingCatalog catalog, Microsoft.ML.ITransformer model, Microsoft.ML.IDataView data, string labelColumnName = "Label", string rowGroupColumnName = "GroupId", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1);
static member PermutationFeatureImportance : Microsoft.ML.RankingCatalog * Microsoft.ML.ITransformer * Microsoft.ML.IDataView * string * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableDictionary<string, Microsoft.ML.Data.RankingMetricsStatistics>
<Extension()>
Public Function PermutationFeatureImportance (catalog As RankingCatalog, model As ITransformer, data As IDataView, Optional labelColumnName As String = "Label", Optional rowGroupColumnName As String = "GroupId", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableDictionary(Of String, RankingMetricsStatistics)

Parametry

catalog
RankingCatalog

Wykaz klasyfikacji.

model
ITransformer

Model, na którym należy ocenić znaczenie funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą mieć wartość Single lub KeyDataViewType.

rowGroupColumnName
String

Nazwa kolumny GroupId

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że będą używane maksymalnie 2 przykłady obiektów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Słownik mapuje każdą funkcję na swoją "współtworzenie" poszczególnych funkcji na ocenę.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.Ranking
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns = new string[] { nameof(Data.Feature1), nameof(
                Data.Feature2) };
            var pipeline = mlContext.Transforms.Concatenate("Features",
                featureColumns)
                    .Append(mlContext.Transforms.Conversion.MapValueToKey("Label"))
                    .Append(mlContext.Transforms.Conversion.MapValueToKey(
                        "GroupId"))
                    .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                    .Append(mlContext.Ranking.Trainers.FastTree());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.Ranking.PermutationFeatureImportance(
                linearPredictor, transformedData, permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on NDCG@1.
            var sortedIndices = permutationMetrics.Select((metrics, index) => new
            {
                index,
                metrics.NormalizedDiscountedCumulativeGains
            })
                .OrderByDescending(feature => Math.Abs(
                    feature.NormalizedDiscountedCumulativeGains[0].Mean))

                .Select(feature => feature.index);

            Console.WriteLine("Feature\tChange in NDCG@1\t95% Confidence in the" +
                "Mean Change in NDCG@1");
            var ndcg = permutationMetrics.Select(
                x => x.NormalizedDiscountedCumulativeGains).ToArray();
            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:G4}\t{2:G4}",
                    featureColumns[i],
                    ndcg[i][0].Mean,
                    1.96 * ndcg[i][0].StandardError);
            }

            // Expected output:
            //  Feature     Change in NDCG@1    95% Confidence in the Mean Change in NDCG@1
            //  Feature2     -0.2421            0.001748
            //  Feature1     -0.0513            0.001184
        }

        private class Data
        {
            public float Label { get; set; }

            public int GroupId { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// 
        /// <param name="nExamples">The number of examples.</param>
        /// 
        /// <param name="bias">The bias, or offset, in the calculation of the label.
        /// </param>
        /// 
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// 
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// 
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// 
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1,
                int groupSize = 5)
        {
            var rng = new Random(seed);
            var max = bias + 4.5 * weight1 + 4.5 * weight2 + 0.5;
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    GroupId = i / groupSize,
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                var value = (float)(bias + weight1 * data.Feature1 + weight2 *
                    data.Feature2 + rng.NextDouble() - 0.5);
                if (value < max / 3)
                    data.Label = 0;
                else if (value < 2 * max / 3)
                    data.Label = 1;
                else
                    data.Label = 2;
                yield return data;
            }
        }
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — współpracuje z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość dla funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. NDCG) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki oceny z oryginalnego zestawu danych jest obliczana. Większa zmiana metryki oceny, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po kolei.

W tej implementacji funkcja PFI oblicza zmianę wszystkich możliwych metryk oceny klasyfikacji dla każdej funkcji, a ImmutableArrayRankingMetrics obiekt jest zwracany. Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy

PermutationFeatureImportance<TModel>(BinaryClassificationCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji binarnej.

public static System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.BinaryClassificationMetricsStatistics> PermutationFeatureImportance<TModel> (this Microsoft.ML.BinaryClassificationCatalog catalog, Microsoft.ML.ISingleFeaturePredictionTransformer<TModel> predictionTransformer, Microsoft.ML.IDataView data, string labelColumnName = "Label", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1) where TModel : class;
static member PermutationFeatureImportance : Microsoft.ML.BinaryClassificationCatalog * Microsoft.ML.ISingleFeaturePredictionTransformer<'Model (requires 'Model : null)> * Microsoft.ML.IDataView * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.BinaryClassificationMetricsStatistics> (requires 'Model : null)
<Extension()>
Public Function PermutationFeatureImportance(Of TModel As Class) (catalog As BinaryClassificationCatalog, predictionTransformer As ISingleFeaturePredictionTransformer(Of TModel), data As IDataView, Optional labelColumnName As String = "Label", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableArray(Of BinaryClassificationMetricsStatistics)

Parametry typu

TModel

Parametry

catalog
BinaryClassificationCatalog

Wykaz klasyfikacji binarnej.

predictionTransformer
ISingleFeaturePredictionTransformer<TModel>

Model, na którym należy ocenić znaczenie funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą mieć wartość Boolean.

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że będą używane maksymalnie 2 przykłady obiektów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Tablica "wkładów" dla poszczególnych funkcji do wyniku.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.BinaryClassification
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns =
                new string[] { nameof(Data.Feature1), nameof(Data.Feature2) };
            var pipeline = mlContext.Transforms
                .Concatenate("Features", featureColumns)
                .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                .Append(mlContext.BinaryClassification.Trainers
                .SdcaLogisticRegression());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.BinaryClassification
                .PermutationFeatureImportance(linearPredictor, transformedData,
                permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on AUC.
            var sortedIndices = permutationMetrics
                .Select((metrics, index) => new { index, metrics.AreaUnderRocCurve })
                .OrderByDescending(
                feature => Math.Abs(feature.AreaUnderRocCurve.Mean))
                .Select(feature => feature.index);

            Console.WriteLine("Feature\tModel Weight\tChange in AUC"
                + "\t95% Confidence in the Mean Change in AUC");
            var auc = permutationMetrics.Select(x => x.AreaUnderRocCurve).ToArray();
            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:0.00}\t{2:G4}\t{3:G4}",
                    featureColumns[i],
                    linearPredictor.Model.SubModel.Weights[i],
                    auc[i].Mean,
                    1.96 * auc[i].StandardError);
            }

            // Expected output:
            //  Feature     Model Weight Change in AUC  95% Confidence in the Mean Change in AUC
            //  Feature2        35.15     -0.387        0.002015
            //  Feature1        17.94     -0.1514       0.0008963
        }

        private class Data
        {
            public bool Label { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// <param name="nExamples">The number of examples.</param>
        /// <param name="bias">The bias, or offset, in the calculation of the label.
        /// </param>
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1)
        {
            var rng = new Random(seed);
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                var value = (float)(bias + weight1 * data.Feature1 + weight2 *
                    data.Feature2 + rng.NextDouble() - 0.5);

                data.Label = Sigmoid(value) > 0.5;
                yield return data;
            }
        }

        private static double Sigmoid(double x) => 1.0 / (1.0 + Math.Exp(-1 * x));
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — współpracuje z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość dla funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. AUC) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki oceny z oryginalnego zestawu danych jest obliczana. Większa zmiana metryki oceny, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po kolei.

W tej implementacji pfI oblicza zmianę we wszystkich możliwych binarnych metrykach oceny klasyfikacji dla każdej funkcji, a ImmutableArrayBinaryClassificationMetrics obiekt jest zwracany. Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy

PermutationFeatureImportance<TModel>(MulticlassClassificationCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji wieloklasyfikacji.

public static System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.MulticlassClassificationMetricsStatistics> PermutationFeatureImportance<TModel> (this Microsoft.ML.MulticlassClassificationCatalog catalog, Microsoft.ML.ISingleFeaturePredictionTransformer<TModel> predictionTransformer, Microsoft.ML.IDataView data, string labelColumnName = "Label", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1) where TModel : class;
static member PermutationFeatureImportance : Microsoft.ML.MulticlassClassificationCatalog * Microsoft.ML.ISingleFeaturePredictionTransformer<'Model (requires 'Model : null)> * Microsoft.ML.IDataView * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.MulticlassClassificationMetricsStatistics> (requires 'Model : null)
<Extension()>
Public Function PermutationFeatureImportance(Of TModel As Class) (catalog As MulticlassClassificationCatalog, predictionTransformer As ISingleFeaturePredictionTransformer(Of TModel), data As IDataView, Optional labelColumnName As String = "Label", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableArray(Of MulticlassClassificationMetricsStatistics)

Parametry typu

TModel

Parametry

catalog
MulticlassClassificationCatalog

Wykaz klasyfikacji wieloklasowej.

predictionTransformer
ISingleFeaturePredictionTransformer<TModel>

Model, na którym należy ocenić znaczenie funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą mieć wartość KeyDataViewType.

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że zostanie użytych maksymalnie 2 przykładów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Tablica "wkładów" dla poszczególnych funkcji do wyniku.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.MulticlassClassification
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns =
                new string[] { nameof(Data.Feature1), nameof(Data.Feature2) };

            var pipeline = mlContext.Transforms
                .Concatenate("Features", featureColumns)
                .Append(mlContext.Transforms.Conversion.MapValueToKey("Label"))
                .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                .Append(mlContext.MulticlassClassification.Trainers
                .SdcaMaximumEntropy());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.MulticlassClassification
                .PermutationFeatureImportance(linearPredictor, transformedData,
                permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on
            // microaccuracy.
            var sortedIndices = permutationMetrics
                .Select((metrics, index) => new { index, metrics.MicroAccuracy })
                .OrderByDescending(feature => Math.Abs(feature.MicroAccuracy.Mean))
                .Select(feature => feature.index);

            Console.WriteLine("Feature\tChange in MicroAccuracy\t95% Confidence in "
                + "the Mean Change in MicroAccuracy");

            var microAccuracy = permutationMetrics.Select(x => x.MicroAccuracy)
                .ToArray();

            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:G4}\t{2:G4}",
                    featureColumns[i],
                    microAccuracy[i].Mean,
                    1.96 * microAccuracy[i].StandardError);
            }

            // Expected output:
            //Feature     Change in MicroAccuracy  95% Confidence in the Mean Change in MicroAccuracy
            //Feature2     -0.1395                 0.0006567
            //Feature1     -0.05367                0.0006908
        }

        private class Data
        {
            public float Label { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// <param name="nExamples">The number of examples.</param>
        /// <param name="bias">The bias, or offset, in the calculation of the
        /// label.</param>
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1)
        {
            var rng = new Random(seed);
            var max = bias + 4.5 * weight1 + 4.5 * weight2 + 0.5;
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                var value = (float)
                    (bias + weight1 * data.Feature1 + weight2 * data.Feature2 +
                    rng.NextDouble() - 0.5);

                if (value < max / 3)
                    data.Label = 0;
                else if (value < 2 * max / 3)
                    data.Label = 1;
                else
                    data.Label = 2;
                yield return data;
            }
        }
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — działa z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. mikro-dokładność) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki ewaluacyjnej z oryginalnego zestawu danych jest obliczana. Większe zmiany w metryce ewaluacyjnej, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po sobie po drugiej.

W tej implementacji pfI oblicza zmianę wszystkich możliwych metryk oceny klasyfikacji wieloklasowej dla każdej funkcji, a ImmutableArrayMulticlassClassificationMetrics obiekt jest zwracany. Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy

PermutationFeatureImportance<TModel>(RegressionCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla regresji.

public static System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.RegressionMetricsStatistics> PermutationFeatureImportance<TModel> (this Microsoft.ML.RegressionCatalog catalog, Microsoft.ML.ISingleFeaturePredictionTransformer<TModel> predictionTransformer, Microsoft.ML.IDataView data, string labelColumnName = "Label", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1) where TModel : class;
static member PermutationFeatureImportance : Microsoft.ML.RegressionCatalog * Microsoft.ML.ISingleFeaturePredictionTransformer<'Model (requires 'Model : null)> * Microsoft.ML.IDataView * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.RegressionMetricsStatistics> (requires 'Model : null)
<Extension()>
Public Function PermutationFeatureImportance(Of TModel As Class) (catalog As RegressionCatalog, predictionTransformer As ISingleFeaturePredictionTransformer(Of TModel), data As IDataView, Optional labelColumnName As String = "Label", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableArray(Of RegressionMetricsStatistics)

Parametry typu

TModel

Parametry

catalog
RegressionCatalog

Wykaz regresji.

predictionTransformer
ISingleFeaturePredictionTransformer<TModel>

Model, na którym ma być oceniana ważność funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą mieć wartość Single.

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że zostanie użytych maksymalnie 2 przykładów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Tablica "wkładów" dla poszczególnych funkcji do wyniku.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.Regression
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns = new string[] { nameof(Data.Feature1),
                nameof(Data.Feature2) };

            var pipeline = mlContext.Transforms.Concatenate(
                "Features",
                featureColumns)
                .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                .Append(mlContext.Regression.Trainers.Ols());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.Regression
                .PermutationFeatureImportance(
                linearPredictor, transformedData, permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on RMSE.
            var sortedIndices = permutationMetrics
                .Select((metrics, index) => new
                {
                    index,
                    metrics.RootMeanSquaredError
                })

                .OrderByDescending(feature => Math.Abs(
                    feature.RootMeanSquaredError.Mean))

                .Select(feature => feature.index);

            Console.WriteLine("Feature\tModel Weight\tChange in RMSE\t95%" +
                "Confidence in the Mean Change in RMSE");

            var rmse = permutationMetrics.Select(x => x.RootMeanSquaredError)
                .ToArray();

            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:0.00}\t{2:G4}\t{3:G4}",
                    featureColumns[i],
                    linearPredictor.Model.Weights[i],
                    rmse[i].Mean,
                    1.96 * rmse[i].StandardError);
            }

            // Expected output:
            //  Feature    Model Weight Change in RMSE  95% Confidence in the Mean Change in RMSE
            //  Feature2        9.00        4.009       0.008304
            //  Feature1        4.48        1.901       0.003351
        }

        private class Data
        {
            public float Label { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// <param name="nExamples">The number of examples.</param>
        /// <param name="bias">The bias, or offset, in the calculation of the label.
        /// </param>
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1)
        {
            var rng = new Random(seed);
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                data.Label = (float)(bias + weight1 * data.Feature1 + weight2 *
                    data.Feature2 + rng.NextDouble() - 0.5);
                yield return data;
            }
        }
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — działa z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. R-squared) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki ewaluacyjnej z oryginalnego zestawu danych jest obliczana. Większe zmiany w metryce ewaluacyjnej, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po sobie po drugiej.

W tej implementacji funkcja PFI oblicza zmianę wszystkich możliwych metryk oceny regresji dla każdej funkcji, a ImmutableArrayRegressionMetrics obiekt jest zwracany. Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy

PermutationFeatureImportance<TModel>(RankingCatalog, ISingleFeaturePredictionTransformer<TModel>, IDataView, String, String, Boolean, Nullable<Int32>, Int32)

Ważność funkcji permutacji (PFI) dla klasyfikacji.

public static System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.RankingMetricsStatistics> PermutationFeatureImportance<TModel> (this Microsoft.ML.RankingCatalog catalog, Microsoft.ML.ISingleFeaturePredictionTransformer<TModel> predictionTransformer, Microsoft.ML.IDataView data, string labelColumnName = "Label", string rowGroupColumnName = "GroupId", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1) where TModel : class;
static member PermutationFeatureImportance : Microsoft.ML.RankingCatalog * Microsoft.ML.ISingleFeaturePredictionTransformer<'Model (requires 'Model : null)> * Microsoft.ML.IDataView * string * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableArray<Microsoft.ML.Data.RankingMetricsStatistics> (requires 'Model : null)
<Extension()>
Public Function PermutationFeatureImportance(Of TModel As Class) (catalog As RankingCatalog, predictionTransformer As ISingleFeaturePredictionTransformer(Of TModel), data As IDataView, Optional labelColumnName As String = "Label", Optional rowGroupColumnName As String = "GroupId", Optional useFeatureWeightFilter As Boolean = false, Optional numberOfExamplesToUse As Nullable(Of Integer) = Nothing, Optional permutationCount As Integer = 1) As ImmutableArray(Of RankingMetricsStatistics)

Parametry typu

TModel

Parametry

catalog
RankingCatalog

Wykaz klasyfikacji.

predictionTransformer
ISingleFeaturePredictionTransformer<TModel>

Model, na którym ma być oceniana ważność funkcji.

data
IDataView

Zestaw danych oceny.

labelColumnName
String

Nazwa kolumny etykiety. Dane kolumny muszą być Single lub KeyDataViewType.

rowGroupColumnName
String

Nazwa kolumny GroupId

useFeatureWeightFilter
Boolean

Używanie wagi funkcji do wstępnego filtrowania funkcji.

numberOfExamplesToUse
Nullable<Int32>

Ogranicz liczbę przykładów do oceny. oznacza, że zostanie użytych maksymalnie 2 przykładów bln z.

permutationCount
Int32

Liczba permutacji do wykonania.

Zwraca

Tablica "wkładów" dla poszczególnych funkcji do wyniku.

Przykłady

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.ML;

namespace Samples.Dynamic.Trainers.Ranking
{
    public static class PermutationFeatureImportance
    {
        public static void Example()
        {
            // Create a new context for ML.NET operations. It can be used for
            // exception tracking and logging, as a catalog of available operations
            // and as the source of randomness.
            var mlContext = new MLContext(seed: 1);

            // Create sample data.
            var samples = GenerateData();

            // Load the sample data as an IDataView.
            var data = mlContext.Data.LoadFromEnumerable(samples);

            // Define a training pipeline that concatenates features into a vector,
            // normalizes them, and then trains a linear model.
            var featureColumns = new string[] { nameof(Data.Feature1), nameof(
                Data.Feature2) };
            var pipeline = mlContext.Transforms.Concatenate("Features",
                featureColumns)
                    .Append(mlContext.Transforms.Conversion.MapValueToKey("Label"))
                    .Append(mlContext.Transforms.Conversion.MapValueToKey(
                        "GroupId"))
                    .Append(mlContext.Transforms.NormalizeMinMax("Features"))
                    .Append(mlContext.Ranking.Trainers.FastTree());

            // Fit the pipeline to the data.
            var model = pipeline.Fit(data);

            // Transform the dataset.
            var transformedData = model.Transform(data);

            // Extract the predictor.
            var linearPredictor = model.LastTransformer;

            // Compute the permutation metrics for the linear model using the
            // normalized data.
            var permutationMetrics = mlContext.Ranking.PermutationFeatureImportance(
                linearPredictor, transformedData, permutationCount: 30);

            // Now let's look at which features are most important to the model
            // overall. Get the feature indices sorted by their impact on NDCG@1.
            var sortedIndices = permutationMetrics.Select((metrics, index) => new
            {
                index,
                metrics.NormalizedDiscountedCumulativeGains
            })
                .OrderByDescending(feature => Math.Abs(
                    feature.NormalizedDiscountedCumulativeGains[0].Mean))

                .Select(feature => feature.index);

            Console.WriteLine("Feature\tChange in NDCG@1\t95% Confidence in the" +
                "Mean Change in NDCG@1");
            var ndcg = permutationMetrics.Select(
                x => x.NormalizedDiscountedCumulativeGains).ToArray();
            foreach (int i in sortedIndices)
            {
                Console.WriteLine("{0}\t{1:G4}\t{2:G4}",
                    featureColumns[i],
                    ndcg[i][0].Mean,
                    1.96 * ndcg[i][0].StandardError);
            }

            // Expected output:
            //  Feature     Change in NDCG@1    95% Confidence in the Mean Change in NDCG@1
            //  Feature2     -0.2421            0.001748
            //  Feature1     -0.0513            0.001184
        }

        private class Data
        {
            public float Label { get; set; }

            public int GroupId { get; set; }

            public float Feature1 { get; set; }

            public float Feature2 { get; set; }
        }

        /// <summary>
        /// Generate an enumerable of Data objects, creating the label as a simple
        /// linear combination of the features.
        /// </summary>
        /// 
        /// <param name="nExamples">The number of examples.</param>
        /// 
        /// <param name="bias">The bias, or offset, in the calculation of the label.
        /// </param>
        /// 
        /// <param name="weight1">The weight to multiply the first feature with to
        /// compute the label.</param>
        /// 
        /// <param name="weight2">The weight to multiply the second feature with to
        /// compute the label.</param>
        /// 
        /// <param name="seed">The seed for generating feature values and label
        /// noise.</param>
        /// 
        /// <returns>An enumerable of Data objects.</returns>
        private static IEnumerable<Data> GenerateData(int nExamples = 10000,
            double bias = 0, double weight1 = 1, double weight2 = 2, int seed = 1,
                int groupSize = 5)
        {
            var rng = new Random(seed);
            var max = bias + 4.5 * weight1 + 4.5 * weight2 + 0.5;
            for (int i = 0; i < nExamples; i++)
            {
                var data = new Data
                {
                    GroupId = i / groupSize,
                    Feature1 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                    Feature2 = (float)(rng.Next(10) * (rng.NextDouble() - 0.5)),
                };

                // Create a noisy label.
                var value = (float)(bias + weight1 * data.Feature1 + weight2 *
                    data.Feature2 + rng.NextDouble() - 0.5);
                if (value < max / 3)
                    data.Label = 0;
                else if (value < 2 * max / 3)
                    data.Label = 1;
                else
                    data.Label = 2;
                yield return data;
            }
        }
    }
}

Uwagi

Znaczenie funkcji permutacji (PFI) to technika określania globalnego znaczenia funkcji w wytrenowanym modelu uczenia maszynowego. PFI to prosta, ale potężna technika motywowana przez Breimana w swoim dokumencie Random Forest, sekcja 10 (Breiman. "Lasy losowe". Machine Learning, 2001). Zaletą metody PFI jest to, że jest ona niezależna od modelu — działa z dowolnym modelem, który można ocenić — i może używać dowolnego zestawu danych, a nie tylko zestawu szkoleniowego, do obliczania metryk ważności funkcji.

Funkcja PFI działa przez pobranie oznaczonego zestawu danych, wybranie funkcji i permutowanie wartości dla tej funkcji we wszystkich przykładach, dzięki czemu każdy przykład ma teraz losową wartość funkcji i oryginalne wartości dla wszystkich innych funkcji. Metryka oceny (np. NDCG) jest następnie obliczana dla tego zmodyfikowanego zestawu danych, a zmiana metryki ewaluacyjnej z oryginalnego zestawu danych jest obliczana. Większe zmiany w metryce ewaluacyjnej, tym ważniejsze jest, aby funkcja dotyczyła modelu. Funkcja PFI działa, wykonując tę analizę permutacji we wszystkich funkcjach modelu, po sobie po drugiej.

W tej implementacji funkcja PFI oblicza zmianę wszystkich możliwych metryk oceny klasyfikacji dla każdej funkcji i ImmutableArrayRankingMetrics zwracane są obiekty. Zapoznaj się z poniższym przykładem pracy z tymi wynikami, aby przeanalizować znaczenie funkcji modelu.

Dotyczy