Wat is ML.NET en hoe werkt het?

ML.NET biedt u de mogelijkheid om machine learning toe te voegen aan .NET-toepassingen, in online- of offlinescenario's. Met deze mogelijkheid kunt u automatische voorspellingen doen met behulp van de gegevens die beschikbaar zijn voor uw toepassing. Machine learning-toepassingen maken gebruik van patronen in de gegevens om voorspellingen te doen in plaats van expliciet te moeten worden geprogrammeerd.

Centraal in ML.NET is een machine learning-model. Het model geeft de stappen op die nodig zijn om uw invoergegevens te transformeren in een voorspelling. Met ML.NET kunt u een aangepast model trainen door een algoritme op te geven of u kunt vooraf getrainde TensorFlow- en ONNX-modellen importeren.

Zodra u een model hebt, kunt u het toevoegen aan uw toepassing om de voorspellingen te doen.

ML.NET wordt uitgevoerd in Windows, Linux en macOS met .NET of in Windows met .NET Framework. 64-bits wordt ondersteund op alle platforms. 32-bits wordt ondersteund in Windows, met uitzondering van TensorFlow-, LightGBM- en ONNX-gerelateerde functionaliteit.

In de volgende tabel ziet u voorbeelden van het type voorspellingen dat u met ML.NET kunt doen.

Type voorspelling Opmerking
Classificatie/categorisatie Deel feedback van klanten automatisch op in positieve en negatieve categorieën.
Regressie/Continue waarden voorspellen De prijs van huizen voorspellen op basis van grootte en locatie.
Anomaly Detection Frauduleuze banktransacties detecteren.
Aanbevelingen Stel producten voor die online klanten mogelijk willen kopen, op basis van hun vorige aankopen.
Tijdreeks/sequentiële gegevens Het weer of de productverkoop voorspellen.
Afbeeldingsclassificatie Categoriseerpathologieën in medische afbeeldingen.
Tekstclassificatie Documenten categoriseren op basis van hun inhoud.
Gelijkenis van zin Meet hoe vergelijkbaar twee zinnen zijn.

Hallo ML.NET wereld

De code in het volgende codefragment toont de eenvoudigste ML.NET toepassing. In dit voorbeeld wordt een lineair regressiemodel samengesteld om huizenprijzen te voorspellen met behulp van woninggrootte- en prijsgegevens.

   using System;
   using Microsoft.ML;
   using Microsoft.ML.Data;

   class Program
   {
       public class HouseData
       {
           public float Size { get; set; }
           public float Price { get; set; }
       }

       public class Prediction
       {
           [ColumnName("Score")]
           public float Price { get; set; }
       }

       static void Main(string[] args)
       {
           MLContext mlContext = new MLContext();

           // 1. Import or create training data
           HouseData[] houseData = {
               new HouseData() { Size = 1.1F, Price = 1.2F },
               new HouseData() { Size = 1.9F, Price = 2.3F },
               new HouseData() { Size = 2.8F, Price = 3.0F },
               new HouseData() { Size = 3.4F, Price = 3.7F } };
           IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

           // 2. Specify data preparation and model training pipeline
           var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
               .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

           // 3. Train model
           var model = pipeline.Fit(trainingData);

           // 4. Make a prediction
           var size = new HouseData() { Size = 2.5F };
           var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

           Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");

           // Predicted price for size: 2500 sq ft= $261.98k
       }
   }

Code-werkstroom

Het volgende diagram vertegenwoordigt de structuur van de toepassingscode, evenals het iteratieve proces van modelontwikkeling:

  • Trainingsgegevens verzamelen en laden in een IDataView-object
  • Een pijplijn met bewerkingen opgeven om functies te extraheren en een machine learning-algoritme toe te passen
  • Een model trainen door Fit() aan te roepen in de pijplijn
  • Het model evalueren en herhalen om te verbeteren
  • Sla het model op in binaire indeling, voor gebruik in een toepassing
  • Het model weer laden in een ITransformer-object
  • Voorspellingen doen door CreatePredictionEngine.Predict() aan te roepen

ML.NET toepassingsontwikkelingsstroom, waaronder onderdelen voor het genereren van gegevens, pijplijnontwikkeling, modeltraining, modelevaluatie en modelgebruik

Laten we eens wat dieper ingaan op deze concepten.

Machine learning-model

Een ML.NET model is een object dat transformaties bevat die moeten worden uitgevoerd op uw invoergegevens om de voorspelde uitvoer te bereiken.

Basis

Het meest elementaire model is tweedimensionale lineaire regressie, waarbij één doorlopende hoeveelheid evenredig is met een ander, zoals in het bovenstaande voorbeeld van de woningprijs.

Lineair regressiemodel met parameters voor vooroordelen en gewicht

Het model is simpelweg: $Price = b + Grootte * w$. De parameters $b$ en $w$ worden geschat door een lijn aan te passen op een set (grootte, prijs) paren. De gegevens die worden gebruikt om de parameters van het model te vinden, worden trainingsgegevens genoemd. De invoer van een machine learning-model wordt functies genoemd. In dit voorbeeld is $Size$ de enige functie. De grond-waarheidswaarden die worden gebruikt om een machine learning-model te trainen, worden labels genoemd. Hier zijn de $Price$ waarden in de trainingsgegevensset de labels.

Complexer

Een complexer model classificeert financiële transacties in categorieën met behulp van de beschrijving van de transactietekst.

Elke transactiebeschrijving wordt onderverdeeld in een set functies door overbodige woorden en tekens te verwijderen en woord- en tekencombinaties te tellen. De functieset wordt gebruikt om een lineair model te trainen op basis van de set categorieën in de trainingsgegevens. Hoe vergelijkbaarer een nieuwe beschrijving is voor de beschrijvingen in de trainingsset, hoe waarschijnlijker deze wordt toegewezen aan dezelfde categorie.

Model voor tekstclassificatie

Zowel het huisprijsmodel als het model voor tekstclassificatie zijn lineaire modellen. Afhankelijk van de aard van uw gegevens en het probleem dat u oplost, kunt u ook beslissingsstructuurmodellen, gegeneraliseerde additiefmodellen en andere gebruiken. Meer informatie over de modellen vindt u in Taken.

Gegevensvoorbereiding

In de meeste gevallen zijn de gegevens die u beschikbaar hebt, niet geschikt om rechtstreeks te worden gebruikt om een machine learning-model te trainen. De onbewerkte gegevens moeten worden voorbereid of vooraf verwerkt voordat ze kunnen worden gebruikt om de parameters van uw model te vinden. Uw gegevens moeten mogelijk worden geconverteerd van tekenreekswaarden naar een numerieke weergave. Mogelijk hebt u redundante informatie in uw invoergegevens. Mogelijk moet u de dimensies van uw invoergegevens verminderen of uitbreiden. Uw gegevens moeten mogelijk worden genormaliseerd of geschaald.

In de ML.NET zelfstudies leert u over verschillende pijplijnen voor gegevensverwerking voor tekst-, afbeeldings-, numerieke en tijdreeksgegevens die worden gebruikt voor specifieke machine learning-taken.

Hoe u uw gegevens voorbereidt, ziet u hoe u gegevensvoorbereiding in het algemeen kunt toepassen.

U vindt een bijlage van alle beschikbare transformaties in de sectie Resources.

Modelevaluatie

Zodra u uw model hebt getraind, hoe weet u hoe goed het toekomstige voorspellingen zal doen? Met ML.NET kunt u uw model evalueren op basis van enkele nieuwe testgegevens.

Elk type machine learning-taak bevat metrische gegevens die worden gebruikt om de nauwkeurigheid en precisie van het model te evalueren op basis van de testgegevensset.

Voor ons voorbeeld van de woningprijs hebben we de regressietaak gebruikt. Als u het model wilt evalueren, voegt u de volgende code toe aan het oorspronkelijke voorbeeld.

        HouseData[] testHouseData =
        {
            new HouseData() { Size = 1.1F, Price = 0.98F },
            new HouseData() { Size = 1.9F, Price = 2.1F },
            new HouseData() { Size = 2.8F, Price = 2.9F },
            new HouseData() { Size = 3.4F, Price = 3.6F }
        };

        var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
        var testPriceDataView = model.Transform(testHouseDataView);

        var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");

        Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
        Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");

        // R^2: 0.96
        // RMS error: 0.19

De metrische evaluatiegegevens geven aan dat de fout laag is en dat de correlatie tussen de voorspelde uitvoer en de testuitvoer hoog is. Dat was gemakkelijk! In echte voorbeelden is er meer afstemming nodig om goede modelmetrieken te bereiken.

ML.NET architectuur

In deze sectie worden de architectuurpatronen van ML.NET beschreven. Als u een ervaren .NET-ontwikkelaar bent, zijn sommige van deze patronen bekend voor u en sommige minder bekend.

Een ML.NET toepassing begint met een MLContext object. Dit singleton-object bevat catalogi. Een catalogus is een fabriek voor het laden en opslaan van gegevens, transformaties, trainers en modelbewerkingsonderdelen. Elk catalogusobject heeft methoden om de verschillende typen onderdelen te maken.

Opdracht Catalogus
Gegevens laden en opslaan DataOperationsCatalog
Gegevensvoorbereiding TransformsCatalog
Binaire classificatie BinaryClassificationCatalog
Classificatie met meerdere klassen MulticlassClassificationCatalog
Anomaliedetectie AnomalyDetectionCatalog
Clustering ClusteringCatalog
Prognoses opstellen ForecastingCatalog
Rangorde RankingCatalog
Regressie RegressionCatalog
Aanbeveling RecommendationCatalog
Tijdreeks TimeSeriesCatalog
Modelgebruik ModelOperationsCatalog

U kunt naar de methoden voor het maken in elk van de bovenstaande categorieën navigeren. Met Visual Studio worden de catalogi weergegeven via IntelliSense.

Intellisense voor regressietrainers

De pijplijn bouwen

In elke catalogus bevindt zich een set uitbreidingsmethoden die u kunt gebruiken om een trainingspijplijn te maken.

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

In het fragment Concatenate en Sdca beide methoden in de catalogus. Ze maken elk een IEstimator-object dat wordt toegevoegd aan de pijplijn.

Op dit moment zijn de objecten gemaakt, maar er is geen uitvoering gebeurd.

Het model trainen

Zodra de objecten in de pijplijn zijn gemaakt, kunnen gegevens worden gebruikt om het model te trainen.

var model = pipeline.Fit(trainingData);

Aanroepen Fit() maken gebruik van de invoertrainingsgegevens om de parameters van het model te schatten. Dit staat bekend als het trainen van het model. Het lineaire regressiemodel dat eerder werd weergegeven, had twee modelparameters: bias en gewicht. Na de Fit() aanroep zijn de waarden van de parameters bekend. (De meeste modellen hebben veel meer parameters dan dit.)

Meer informatie over modeltraining vindt u in Het trainen van uw model.

Het resulterende modelobject implementeert de ITransformer interface. Dat wil gezegd, het model transformeert invoergegevens in voorspellingen.

IDataView predictions = model.Transform(inputData);

Het model gebruiken

U kunt invoergegevens bulksgewijs transformeren in voorspellingen of één invoer tegelijk. Het voorbeeld van de woningprijs heeft beide gedaan: bulksgewijs voor het evalueren van het model en één voor één om een nieuwe voorspelling te doen. Laten we eens kijken naar het maken van enkele voorspellingen.

var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);

De CreatePredictionEngine() methode gebruikt een invoerklasse en een uitvoerklasse. De veldnamen of codekenmerken bepalen de namen van de gegevenskolommen die worden gebruikt tijdens het trainen en voorspellen van modellen. Zie Voorspellingen maken met een getraind model voor meer informatie.

Gegevensmodellen en -schema's

De kern van een ML.NET machine learning-pijplijn zijn DataView-objecten .

Elke transformatie in de pijplijn heeft een invoerschema (gegevensnamen, typen en grootten die de transformatie verwacht te zien op de invoer); en een uitvoerschema (gegevensnamen, typen en grootten die de transformatie produceert na de transformatie).

Als het uitvoerschema van de ene transformatie in de pijplijn niet overeenkomt met het invoerschema van de volgende transformatie, genereert ML.NET een uitzondering.

Een gegevensweergaveobject bevat kolommen en rijen. Elke kolom heeft een naam en een type en een lengte. De invoerkolommen in het voorbeeld van de woningprijs zijn bijvoorbeeld Grootte en Prijs. Ze zijn beide typen en ze zijn scalaire hoeveelheden in plaats van vectoren.

voorbeeld van ML.NET gegevensweergave met voorspellingsgegevens voor huizenprijzen

Alle ML.NET algoritmen zoeken naar een invoerkolom die een vector is. Deze vectorkolom wordt standaard Functies genoemd. Daarom heeft het voorbeeld van de woningprijs de kolom Grootte samengevoegd in een nieuwe kolom met de naam Functies.

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })

Alle algoritmen maken ook nieuwe kolommen nadat ze een voorspelling hebben uitgevoerd. De vaste namen van deze nieuwe kolommen zijn afhankelijk van het type machine learning-algoritme. Voor de regressietaak wordt een van de nieuwe kolommen Score genoemd, zoals wordt weergegeven in het kenmerk prijsgegevens.

public class Prediction
{
    [ColumnName("Score")]
    public float Price { get; set; }
}

Meer informatie over uitvoerkolommen van verschillende machine learning-taken vindt u in de handleiding Machine Learning-taken .

Een belangrijke eigenschap van DataView-objecten is dat ze lazily worden geëvalueerd. Gegevensweergaven worden alleen geladen en gebruikt tijdens het trainen en evalueren van modellen en gegevensvoorspelling. Terwijl u uw ML.NET-toepassing schrijft en test, kunt u het foutopsporingsprogramma van Visual Studio gebruiken om een kijkje te nemen in elk gegevensweergaveobject door de preview-methode aan te roepen.

var debug = testPriceDataView.Preview();

U kunt de debug variabele bekijken in het foutopsporingsprogramma en de inhoud ervan bekijken. Gebruik de preview-methode niet in productiecode, omdat de prestaties aanzienlijk afnemen.

Modelimplementatie

In echte toepassingen is uw modeltrainings- en evaluatiecode gescheiden van uw voorspelling. Deze twee activiteiten worden vaak uitgevoerd door afzonderlijke teams. Uw modelontwikkelingsteam kan het model opslaan voor gebruik in de voorspellingstoepassing.

mlContext.Model.Save(model, trainingData.Schema,"model.zip");

Volgende stappen