Freigeben über


PermutationFeatureImportanceExtensions.PermutationFeatureImportanceNonCalibrated Methode

Definition

Permutation Feature Importance (PFI) für binäre Klassifizierung.

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)

Parameter

catalog
BinaryClassificationCatalog

Der binärklassifizierungskatalog.

model
ITransformer

Das Modell, auf dem die Feature-Wichtigkeit ausgewertet werden soll.

data
IDataView

Der Auswertungsdatensatz.

labelColumnName
String

Bezeichnungsspaltenname. Die Spaltendaten müssen sein Boolean.

useFeatureWeightFilter
Boolean

Verwenden Sie features weight to pre-filter features.

numberOfExamplesToUse
Nullable<Int32>

Beschränken Sie die Anzahl der Beispiele, die ausgewertet werden sollen. bedeutet bis zu 2 bln Beispiele von werden verwendet.

permutationCount
Int32

Die Anzahl der auszuführenden Permutationen.

Gibt zurück

Wörterbuchzuordnung jedes Features zu seinen "Beiträgen" pro Feature zur Bewertung.

Beispiele

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

Hinweise

Permutation feature importance (PFI) ist eine Technik, um die globale Bedeutung von Features in einem trainierten Machine Learning-Modell zu bestimmen. PFI ist eine einfache, aber leistungsstarke Technik, die von Breiman in seinem Zufallswaldpapier, Abschnitt 10 (Breiman) motiviert wurde. "Zufällige Wälder." Machine Learning, 2001.) Der Vorteil der PFI-Methode besteht darin, dass es modellagnostisch ist - es funktioniert mit jedem Modell, das ausgewertet werden kann - und es kann jedes Dataset verwenden, nicht nur den Schulungssatz, um Feature-Wichtigkeitsmetriken zu berechnen.

PFI funktioniert, indem ein beschriftetes Dataset verwendet wird, ein Feature auswählen und die Werte für dieses Feature in allen Beispielen per Stummschaltung ändern, sodass jedes Beispiel jetzt einen Zufälligen Wert für das Feature und die ursprünglichen Werte für alle anderen Features aufweist. Die Auswertungsmetrik (z. B. AUC) wird dann für dieses geänderte Dataset berechnet, und die Änderung der Auswertungsmetrik aus dem ursprünglichen Dataset wird berechnet. Je größer die Änderung der Auswertungsmetrik ist, desto wichtiger ist das Feature für das Modell. PFI funktioniert, indem diese Permutationsanalyse über alle Features eines Modells hinweg ausgeführt wird, und zwar nacheinander.

In dieser Implementierung berechnet PFI die Änderung aller möglichen Binären Klassifizierungsauswertungsmetriken für jedes Feature, und eine ImmutableArray von BinaryClassificationMetrics Objekten wird zurückgegeben. Sehen Sie sich das folgende Beispiel an, um mit diesen Ergebnissen zu arbeiten, um die Feature-Wichtigkeit eines Modells zu analysieren.

Gilt für: