Compartilhar via


PermutationFeatureImportanceExtensions.PermutationFeatureImportanceNonCalibrated Método

Definição

PFI (Importância do Recurso de Permutação) para Classificação Binária.

public static System.Collections.Immutable.ImmutableDictionary<string,Microsoft.ML.Data.BinaryClassificationMetricsStatistics> PermutationFeatureImportanceNonCalibrated (this Microsoft.ML.BinaryClassificationCatalog catalog, Microsoft.ML.ITransformer model, Microsoft.ML.IDataView data, string labelColumnName = "Label", bool useFeatureWeightFilter = false, int? numberOfExamplesToUse = default, int permutationCount = 1);
static member PermutationFeatureImportanceNonCalibrated : Microsoft.ML.BinaryClassificationCatalog * Microsoft.ML.ITransformer * Microsoft.ML.IDataView * string * bool * Nullable<int> * int -> System.Collections.Immutable.ImmutableDictionary<string, Microsoft.ML.Data.BinaryClassificationMetricsStatistics>
<Extension()>
Public Function PermutationFeatureImportanceNonCalibrated (catalog As BinaryClassificationCatalog, 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, BinaryClassificationMetricsStatistics)

Parâmetros

catalog
BinaryClassificationCatalog

O catálogo de classificação binária.

model
ITransformer

O modelo no qual avaliar a importância do recurso.

data
IDataView

O conjunto de dados de avaliação.

labelColumnName
String

Nome da coluna de rótulo. Os dados da coluna devem ser Boolean.

useFeatureWeightFilter
Boolean

Use o peso dos recursos para pré-filtrar recursos.

numberOfExamplesToUse
Nullable<Int32>

Limite o número de exemplos a serem avaliados. significa que até ~2 exemplos de bln serão usados.

permutationCount
Int32

O número de permutações a serem executadas.

Retornos

Mapeamento de dicionário de cada recurso para suas "contribuições" por recurso para a pontuação.

Exemplos

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));
    }
}

Comentários

A PFI (importância do recurso de permutação) é uma técnica para determinar a importância global dos recursos em um modelo de aprendizado de máquina treinado. PFI é uma técnica simples, mas poderosa, motivada por Breiman em seu artigo da Floresta Aleatória, seção 10 (Breiman. "Florestas aleatórias". Machine Learning, 2001.) A vantagem do método PFI é que ele é agnóstico de modelo , ele funciona com qualquer modelo que pode ser avaliado - e pode usar qualquer conjunto de dados, não apenas o conjunto de treinamento, para calcular métricas de importância do recurso.

O PFI funciona usando um conjunto de dados rotulado, escolhendo um recurso e permutando os valores desse recurso em todos os exemplos, de modo que cada exemplo agora tenha um valor aleatório para o recurso e os valores originais para todos os outros recursos. A métrica de avaliação (por exemplo, AUC) é calculada para esse conjunto de dados modificado e a alteração na métrica de avaliação do conjunto de dados original é calculada. Quanto maior a alteração na métrica de avaliação, mais importante será o recurso para o modelo. O PFI funciona executando essa análise de permutação em todos os recursos de um modelo, um após o outro.

Nesta implementação, o PFI calcula a alteração em todas as possíveis métricas de avaliação de classificação binária para cada recurso e um ImmutableArray dos BinaryClassificationMetrics objetos é retornado. Confira o exemplo abaixo para obter um exemplo de como trabalhar com esses resultados para analisar a importância do recurso de um modelo.

Aplica-se a