De ML.NET AutoML-API (Automated Machine Learning) gebruiken
In dit artikel leert u hoe u de ML.NET Automated ML (AutoML API) gebruikt.
Voorbeelden voor de AutoML-API vindt u in de opslagplaats dotnet/machinelearning-samples .
Installatie
Als u de AutoML-API wilt gebruiken, installeert u het Microsoft.ML.AutoML
NuGet-pakket in het .NET-project waarin u ernaar wilt verwijzen.
Notitie
In deze handleiding wordt versie 0.20.0 en hoger van het Microsoft.ML.AutoML
NuGet-pakket gebruikt. Hoewel voorbeelden en code uit eerdere versies nog steeds werken, wordt het ten zeerste aanbevolen om de API's te gebruiken die in deze versie zijn geïntroduceerd voor nieuwe projecten.
Zie de volgende handleidingen voor meer informatie over het installeren van NuGet-pakketten:
- Een NuGet-pakket installeren en gebruiken in Visual Studio
- Een pakket installeren en gebruiken (dotnet CLI)
Snel starten
AutoML biedt verschillende standaardinstellingen voor het snel trainen van machine learning-modellen. In deze sectie leert u het volgende:
- Uw gegevens laden
- Uw pijplijn definiëren
- Uw experiment configureren
- Uw experiment uitvoeren
- Het beste model gebruiken om voorspellingen te doen
Uw probleem definiëren
Gezien een gegevensset die is opgeslagen in een door komma's gescheiden bestand met de naam taxi-fare-train.csv dat er als volgt uitziet:
vendor_id | rate_code | passenger_count | trip_time_in_secs | trip_distance | payment_type | fare_amount |
---|---|---|---|---|---|---|
CMT | 1 | 1 | 1271 | 3.8 | CRD | 17.5 |
CMT | 1 | 1 | 474 | 1.5 | CRD | 8 |
CMT | 1 | 1 | 637 | 1.4 | CRD | 8.5 |
Uw gegevens laden
Begin met het initialiseren van uw MLContext.
MLContext
is een uitgangspunt voor alle ML.NET bewerkingen. Bij het initialiseren van mlContext wordt een nieuwe ML.NET omgeving gemaakt die kan worden gedeeld met de werkstroomobjecten voor het maken van modellen. Het is vergelijkbaar, conceptueel gezien, met DBContext
in Entity Framework.
Gebruik vervolgens de InferColumns methode om uw gegevens te laden.
// Initialize MLContext
MLContext ctx = new MLContext();
// Define data path
var dataPath = Path.GetFullPath(@"..\..\..\..\Data\taxi-fare-train.csv");
// Infer column information
ColumnInferenceResults columnInference =
ctx.Auto().InferColumns(dataPath, labelColumnName: "fare_amount", groupColumns: false);
InferColumns laadt een paar rijen uit de gegevensset. Vervolgens worden de gegevens gecontroleerd en wordt geprobeerd het gegevenstype voor elk van de kolommen te raden of af te stellen op basis van hun inhoud.
Het standaardgedrag is om kolommen van hetzelfde type te groeperen in functievectoren of matrices die de elementen voor elk van de afzonderlijke kolommen bevatten. Instellen groupColumns
dat false
standaardgedrag wordt overschreven en alleen kolomdeductie uitvoert zonder kolommen te groeperen. Door kolommen gescheiden te houden, kunt u verschillende gegevenstransformaties toepassen bij het vooraf verwerken van de gegevens op het niveau van de afzonderlijke kolom in plaats van de kolomgroepering.
Het resultaat is InferColumns een ColumnInferenceResults object dat de opties bevat die nodig zijn voor het maken van een TextLoader en kolomgegevens.
Voor de voorbeeldgegevensset in taxi-fare-train.csv ziet kolomgegevens er mogelijk als volgt uit:
- LabelColumnName: fare_amount
- CategoricalColumnNames: verkoper_id, betalingswijze
- NumericColumnNames: tariefcode, passagiersaantal, ritduur_in_seconden, ritafstand
Zodra u uw kolomgegevens hebt, gebruikt u de TextLoader.Options gedefinieerde door de ColumnInferenceResults functie om een TextLoader gegevens te maken om uw gegevens in een IDataViewte laden.
// Create text loader
TextLoader loader = ctx.Data.CreateTextLoader(columnInference.TextLoaderOptions);
// Load data into IDataView
IDataView data = loader.Load(dataPath);
Het is vaak raadzaam om uw gegevens op te splitsen in trainings- en validatiesets. Gebruik TrainTestSplit dit om een 80% trainings- en 20% validatiesplitsing van uw gegevensset te maken.
TrainTestData trainValidationData = ctx.Data.TrainTestSplit(data, testFraction: 0.2);
Uw pijplijn definiëren
Uw pijplijn definieert de stappen voor gegevensverwerking en machine learning-pijplijn die moeten worden gebruikt voor het trainen van uw model.
SweepablePipeline pipeline =
ctx.Auto().Featurizer(data, columnInformation: columnInference.ColumnInformation)
.Append(ctx.Auto().Regression(labelColumnName: columnInference.ColumnInformation.LabelColumnName));
A SweepablePipeline is een verzameling van SweepableEstimator. A SweepableEstimator is een ML.NET Estimator met een SearchSpace.
De Featurizer api is een handige API waarmee een opruimende pijplijn wordt gebouwd voor gegevensverwerking op basis van de kolomgegevens die u opgeeft. In plaats van een volledig nieuwe pijplijn te bouwen, Featurizer automatiseert u de stap voorverwerking van gegevens. Zie de handleiding voor gegevenstransformaties voor meer informatie over ondersteunde transformaties door ML.NET.
De Featurizer uitvoer is één kolom met een numerieke functievector die de getransformeerde gegevens voor elk van de kolommen vertegenwoordigt. Deze functievector wordt vervolgens gebruikt als invoer voor de algoritmen die worden gebruikt om een machine learning-model te trainen.
Als u meer controle wilt over uw gegevensvoorverwerking, kunt u een pijplijn maken met elk van de afzonderlijke voorverwerkingsstappen. Zie de voorbereidingsgegevens voor het bouwen van een modelhandleiding voor meer informatie.
Tip
Gebruik Featurizer dit om ColumnInferenceResults het hulpprogramma van AutoML te maximaliseren.
Voor training biedt AutoML een opruimende pijplijn met standaardtrainers en zoekruimteconfiguraties voor de volgende machine learning-taken:
Voor het probleem met het taxitarief, omdat het doel is om een numerieke waarde te voorspellen, gebruikt Regression
u . Zie Machine Learning-taken in ML.NET voor meer informatie over het kiezen van een taak
Uw experiment configureren
Maak eerst een AutoML-experiment. Een AutoMLExperiment is een verzameling van TrialResult.
AutoMLExperiment experiment = ctx.Auto().CreateExperiment();
Zodra uw experiment is gemaakt, gebruikt u de extensiemethoden die het biedt om verschillende instellingen te configureren.
experiment
.SetPipeline(pipeline)
.SetRegressionMetric(RegressionMetric.RSquared, labelColumn: columnInference.ColumnInformation.LabelColumnName)
.SetTrainingTimeInSeconds(60)
.SetDataset(trainValidationData);
In dit voorbeeld gaat u als volgt te werk:
- Stel de opruimende pijplijn in die tijdens het experiment moet worden uitgevoerd door aan te roepen SetPipeline.
- Kies
RSquared
als de metrische waarde die u tijdens de training wilt optimaliseren door aan te roepen SetRegressionMetric. Zie de handleiding voor het evalueren van uw ML.NET model met metrische gegevens voor meer informatie over metrische gegevens. - Stel 60 seconden in als de hoeveelheid tijd waarvoor u wilt trainen door te bellen SetTrainingTimeInSeconds. Een goede heuristiek om te bepalen hoe lang u moet trainen, is de grootte van uw gegevens. Normaal gesproken vereisen grotere gegevenssets langere trainingstijd. Zie de richtlijnen voor trainingstijd voor meer informatie.
- Geef de trainings- en validatiegegevenssets op die moeten worden gebruikt door aan te roepen SetDataset.
Zodra uw experiment is gedefinieerd, wilt u de voortgang ervan bijhouden. De snelste manier om de voortgang bij te houden is door de Log gebeurtenis te wijzigen van MLContext.
// Log experiment trials
ctx.Log += (_, e) => {
if (e.Source.Equals("AutoMLExperiment"))
{
Console.WriteLine(e.RawMessage);
}
};
Uw experiment uitvoeren
Nu u uw experiment hebt gedefinieerd, gebruikt u de RunAsync methode om uw experiment te starten.
TrialResult experimentResults = await experiment.RunAsync();
Zodra de tijd om te trainen is verlopen, is het resultaat een TrialResult voor het beste model dat tijdens de training wordt gevonden.
Op dit moment kunt u uw model opslaan of gebruiken voor het maken van voorspellingen. Zie de volgende handleidingen voor meer informatie over het gebruik van een ML.NET model:
Resultaten van kolomdeductie wijzigen
Omdat InferColumns alleen een subset van uw gegevens wordt geladen, is het mogelijk dat randcases buiten de voorbeelden die worden gebruikt om kolommen af te stellen, niet worden afgevangen en dat de verkeerde gegevenstypen zijn ingesteld voor uw kolommen. U kunt de eigenschappen bijwerken om ColumnInformation rekening te houden met die gevallen waarin de resultaten van de kolomdeductie niet juist zijn.
In de gegevensset taxirit is de gegevens in de rate_code
kolom bijvoorbeeld een getal. Deze numerieke waarde vertegenwoordigt echter een categorie.
InferColumns Standaard wordt bellen in de rate_code
eigenschap in NumericColumnNames
plaats van CategoricalColumnNames
in . Omdat deze eigenschappen .NET-verzamelingen zijn, kunt u standaardbewerkingen gebruiken om items eraan toe te voegen en te verwijderen.
U kunt het volgende doen om de ColumnInformation for bij rate_code
te werken.
columnInference.ColumnInformation.NumericColumnNames.Remove("rate_code");
columnInference.ColumnInformation.CategoricalColumnNames.Add("rate_code");
Trainers uitsluiten
AutoML probeert standaard meerdere trainers als onderdeel van het trainingsproces om te zien welke het beste werkt voor uw gegevens. Tijdens het trainingsproces kunt u echter ontdekken dat er een aantal trainers zijn die te veel rekenresources gebruiken of geen goede metrische evaluatiegegevens bieden. U hebt de mogelijkheid om trainers uit te sluiten van het trainingsproces. Welke trainers worden gebruikt, is afhankelijk van de taak. Zie de machine learning-taken in ML.NET handleiding voor een lijst met ondersteunde trainers in ML.NET.
Stel bijvoorbeeld in het scenario voor taxiritme de parameter useLgbm
in op regressie om het LightGBM-algoritme uit te sluitenfalse
.
ctx.Auto().Regression(labelColumnName: columnInference.ColumnInformation.LabelColumnName, useLgbm:false)
Het proces voor het uitsluiten van trainers in andere taken, zoals binaire en multiklasseclassificatie, werkt op dezelfde manier.
Een veegbare estimator aanpassen
Als u meer gedetailleerde aanpassing van de estimatoropties wilt opnemen als onderdeel van uw opruimende pijplijn, moet u het volgende doen:
- Een zoekruimte initialiseren
- De zoekruimte gebruiken om een aangepaste factory te definiëren
- Een veegbare estimator maken
- Uw opruimende estimator toevoegen aan uw opruimende pijplijn
AutoML biedt een set vooraf geconfigureerde zoekruimten voor trainers in de volgende machine learning-taken:
In dit voorbeeld is de gebruikte zoekruimte voor de SdcaRegressionTrainer. Initialiseer het met behulp van SdcaOption.
var sdcaSearchSpace = new SearchSpace<SdcaOption>();
Gebruik vervolgens de zoekruimte om een aangepaste factorymethode te definiëren om de SdcaRegressionTrainer. In dit voorbeeld worden de waarden van L1Regularization
en L2Regularization
beide ingesteld op iets anders dan de standaardwaarde. Voor L1Regularization
, de waarde set wordt bepaald door de tuner tijdens elke proefversie. De L2Regularization
waarde is vast voor elke proefversie op de in code vastgelegde waarde. Tijdens elke proefversie is de uitvoer van de aangepaste factory een SdcaRegressionTrainer met de geconfigureerde hyperparameters.
// Use the search space to define a custom factory to create an SdcaRegressionTrainer
var sdcaFactory = (MLContext ctx, SdcaOption param) =>
{
var sdcaOption = new SdcaRegressionTrainer.Options();
sdcaOption.L1Regularization = param.L1Regularization;
sdcaOption.L2Regularization = 0.02f;
sdcaOption.LabelColumnName = columnInference.ColumnInformation.LabelColumnName;
return ctx.Regression.Trainers.Sdca(sdcaOption);
};
Een opruimende estimator is de combinatie van een estimator en een zoekruimte. Nu u een zoekruimte hebt gedefinieerd en deze hebt gebruikt om een aangepaste fabrieksmethode te maken voor het genereren van trainers, gebruikt u de CreateSweepableEstimator methode om een nieuwe opruimende estimator te maken.
// Define Sdca sweepable estimator (SdcaRegressionTrainer + SdcaOption search space)
var sdcaSweepableEstimator = ctx.Auto().CreateSweepableEstimator(sdcaFactory, sdcaSearchSpace);
Als u uw opruimende estimator in uw experiment wilt gebruiken, voegt u deze toe aan uw opruimende pijplijn.
SweepablePipeline pipeline =
ctx.Auto().Featurizer(data, columnInformation: columnInference.ColumnInformation)
.Append(sdcaSweepableEstimator);
Omdat opruimende pijplijnen een verzameling van sweepable estimators zijn, kunt u zo veel van deze opruimende schattingen configureren en aanpassen als u nodig hebt.
Uw zoekruimte aanpassen
Er zijn scenario's waarin u verder wilt gaan dan het aanpassen van de veegbare schattingen die in uw experiment worden gebruikt en het bereik van de zoekruimte wilt beheren. U kunt dit doen door toegang te krijgen tot de eigenschappen van de zoekruimte met behulp van sleutels. In dit geval is de L1Regularization
parameter een float
. Gebruik daarom om het zoekbereik UniformSingleOptionaan te passen.
sdcaSearchSpace["L1Regularization"] = new UniformSingleOption(min: 0.01f, max: 2.0f, logBase: false, defaultValue: 0.01f);
Afhankelijk van het gegevenstype van de hyperparameter die u wilt instellen, kunt u kiezen uit de volgende opties:
- Cijfers
- Booleaanse waarden en tekenreeksen
Zoekruimten kunnen ook geneste zoekruimten bevatten.
var searchSpace = new SearchSpace();
searchSpace["SingleOption"] = new UniformSingleOption(min:-10f, max:10f, defaultValue=0f)
var nestedSearchSpace = new SearchSpace();
nestedSearchSpace["IntOption"] = new UniformIntOption(min:-10, max:10, defaultValue=0);
searchSpace["Nest"] = nestedSearchSpace;
Een andere optie voor het aanpassen van zoekbereiken is door ze uit te breiden. Geeft bijvoorbeeld SdcaOption alleen de L1Regularization
en L2Regularization
parameters op.
SdcaRegressionTrainer Heeft echter meer parameters die u kunt instellen, zoals BiasLearningRate
.
Als u de zoekruimte wilt uitbreiden, maakt u een nieuwe klasse, zoals SdcaExtendedOption
, die overdrat van SdcaOption.
public class SdcaExtendedOption : SdcaOption
{
[Range(0.10f, 1f, 0.01f)]
public float BiasLearningRate {get;set;}
}
Als u het bereik van de zoekruimte wilt opgeven, gebruikt RangeAttributeu , wat gelijk is aan Microsoft.ML.SearchSpace.Option.
Wanneer u vervolgens uw zoekruimte gebruikt, verwijst u naar de SdcaExtendedOption
plaats van SdcaOption.
Wanneer u bijvoorbeeld uw zoekruimte initialiseert, kunt u dit als volgt doen:
var sdcaSearchSpace = new SearchSpace<SdcaExtendedOption>();
Uw eigen proefloper maken
AutoML biedt standaard ondersteuning voor binaire classificatie, classificatie van meerdere klassen en regressie. ML.NET ondersteunt echter nog veel meer scenario's, zoals:
- Aanbeveling
- Prognoses opstellen
- Rangorde
- Afbeeldingsclassificatie
- Tekstclassificatie
- Gelijkenis van zin
Voor scenario's die geen vooraf geconfigureerde zoekruimten en opruimende schattingen hebben, kunt u uw eigen zoekruimte maken en een proefloper gebruiken om AutoML voor dat scenario in te schakelen.
Als u bijvoorbeeld gegevens van een restaurant bekijkt die er als volgt uitziet:
Wauw... Ik hield van deze plek.
1
Korst is niet goed.
0
U wilt de TextClassificationTrainer trainer gebruiken om gevoel te analyseren waarbij 0 negatief is en 1 positief is. Er is echter geen ctx.Auto().TextClassification()
configuratie.
Als u AutoML wilt gebruiken met de trainer voor tekstclassificatie, moet u het volgende doen:
Maak uw eigen zoekruimte.
// Define TextClassification search space public class TCOption { [Range(64, 128, 32)] public int BatchSize { get; set; } }
In dit geval zoekt AutoML naar verschillende configuraties van de
BatchSize
hyperparameter.Maak een opruimende estimator en voeg deze toe aan uw pijplijn.
// Initialize search space var tcSearchSpace = new SearchSpace<TCOption>(); // Create factory for Text Classification trainer var tcFactory = (MLContext ctx, TCOption param) => { return ctx.MulticlassClassification.Trainers.TextClassification( sentence1ColumnName: textColumnName, batchSize:param.BatchSize); }; // Create text classification sweepable estimator var tcEstimator = ctx.Auto().CreateSweepableEstimator(tcFactory, tcSearchSpace); // Define text classification pipeline var pipeline = ctx.Transforms.Conversion.MapValueToKey(columnInference.ColumnInformation.LabelColumnName) .Append(tcEstimator);
In dit voorbeeld worden de
TCOption
zoekruimte en een aangepaste TextClassificationTrainer fabriek gebruikt om een veegbare estimator te maken.Een aangepaste proefloper maken
Als u een aangepaste proefloper wilt maken, implementeert u ITrialRunner:
public class TCRunner : ITrialRunner { private readonly MLContext _context; private readonly TrainTestData _data; private readonly IDataView _trainDataset; private readonly IDataView _evaluateDataset; private readonly SweepablePipeline _pipeline; private readonly string _labelColumnName; private readonly MulticlassClassificationMetric _metric; public TCRunner( MLContext context, TrainTestData data, SweepablePipeline pipeline, string labelColumnName = "Label", MulticlassClassificationMetric metric = MulticlassClassificationMetric.MicroAccuracy) { _context = context; _data = data; _trainDataset = data.TrainSet; _evaluateDataset = data.TestSet; _labelColumnName = labelColumnName; _pipeline = pipeline; _metric = metric; } public void Dispose() { return; } // Run trial asynchronously public Task<TrialResult> RunAsync(TrialSettings settings, CancellationToken ct) { try { return Task.Run(() => Run(settings)); } catch (Exception ex) when (ct.IsCancellationRequested) { throw new OperationCanceledException(ex.Message, ex.InnerException); } catch (Exception) { throw; } } // Helper function to define trial run logic private TrialResult Run(TrialSettings settings) { try { // Initialize stop watch to measure time var stopWatch = new Stopwatch(); stopWatch.Start(); // Get pipeline parameters var parameter = settings.Parameter["_pipeline_"]; // Use parameters to build pipeline var pipeline = _pipeline.BuildFromOption(_context, parameter); // Train model var model = pipeline.Fit(_trainDataset); // Evaluate the model var predictions = model.Transform(_evaluateDataset); // Get metrics var evaluationMetrics = _context.MulticlassClassification.Evaluate(predictions, labelColumnName: _labelColumnName); var chosenMetric = GetMetric(evaluationMetrics); return new TrialResult() { Metric = chosenMetric, Model = model, TrialSettings = settings, DurationInMilliseconds = stopWatch.ElapsedMilliseconds }; } catch (Exception) { return new TrialResult() { Metric = double.MinValue, Model = null, TrialSettings = settings, DurationInMilliseconds = 0, }; } } // Helper function to choose metric used by experiment private double GetMetric(MulticlassClassificationMetrics metric) { return _metric switch { MulticlassClassificationMetric.MacroAccuracy => metric.MacroAccuracy, MulticlassClassificationMetric.MicroAccuracy => metric.MicroAccuracy, MulticlassClassificationMetric.LogLoss => metric.LogLoss, MulticlassClassificationMetric.LogLossReduction => metric.LogLossReduction, MulticlassClassificationMetric.TopKAccuracy => metric.TopKAccuracy, _ => throw new NotImplementedException(), }; } }
De
TCRunner
implementatie in dit voorbeeld:- Extraheert de hyperparameters die zijn gekozen voor die proefversie
- Gebruikt de hyperparameters om een ML.NET-pijplijn te maken
- Gebruikt de ML.NET-pijplijn om een model te trainen
- Evalueert het model
- Retourneert een TrialResult object met de informatie voor die proefversie
Uw aangepaste proefloper initialiseren
var tcRunner = new TCRunner(context: ctx, data: trainValidationData, pipeline: pipeline);
Uw experiment maken en configureren. Gebruik de SetTrialRunner extensiemethode om uw aangepaste proefloper toe te voegen aan uw experiment.
AutoMLExperiment experiment = ctx.Auto().CreateExperiment(); // Configure AutoML experiment experiment .SetPipeline(pipeline) .SetMulticlassClassificationMetric(MulticlassClassificationMetric.MicroAccuracy, labelColumn: columnInference.ColumnInformation.LabelColumnName) .SetTrainingTimeInSeconds(120) .SetDataset(trainValidationData) .SetTrialRunner(tcRunner);
Uw experiment uitvoeren
var tcCts = new CancellationTokenSource(); TrialResult textClassificationExperimentResults = await experiment.RunAsync(tcCts.Token);
Kies een andere tuner
AutoML ondersteunt verschillende afstemmingsalgoritmen om de zoekruimte te herhalen bij het zoeken naar de optimale hyperparameters. Standaard wordt de Eci Cost Frugal-tuner gebruikt. Met behulp van experimentextensiemethoden kunt u een andere tuner kiezen die het beste bij uw scenario past.
Gebruik de volgende methoden om uw tuner in te stellen:
- SMAC - SetSmacTuner
- Raster zoeken - SetGridSearchTuner
- Willekeurige zoekopdrachten - SetRandomSearchTuner
- Kosten frugal - SetCostFrugalTuner
- Eci Cost Frugal - SetEciCostFrugalTuner
Als u bijvoorbeeld de grid search tuner wilt gebruiken, kan uw code er als volgt uitzien:
experiment.SetGridSearchTuner();
Experimentbewaking configureren
De snelste manier om de voortgang van een experiment te bewaken, is door de Log gebeurtenis te definiëren van MLContext. De Log gebeurtenis voert echter een onbewerkte dump uit van de logboeken die tijdens elke proefversie door AutoML worden gegenereerd. Vanwege de grote hoeveelheid niet-opgemaakte informatie is het moeilijk.
Implementeer een klasse met de IMonitor interface voor een meer gecontroleerde bewakingservaring.
public class AutoMLMonitor : IMonitor
{
private readonly SweepablePipeline _pipeline;
public AutoMLMonitor(SweepablePipeline pipeline)
{
_pipeline = pipeline;
}
public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;
public void ReportBestTrial(TrialResult result)
{
return;
}
public void ReportCompletedTrial(TrialResult result)
{
var trialId = result.TrialSettings.TrialId;
var timeToTrain = result.DurationInMilliseconds;
var pipeline = _pipeline.ToString(result.TrialSettings.Parameter);
Console.WriteLine($"Trial {trialId} finished training in {timeToTrain}ms with pipeline {pipeline}");
}
public void ReportFailTrial(TrialSettings settings, Exception exception = null)
{
if (exception.Message.Contains("Operation was canceled."))
{
Console.WriteLine($"{settings.TrialId} cancelled. Time budget exceeded.");
}
Console.WriteLine($"{settings.TrialId} failed with exception {exception.Message}");
}
public void ReportRunningTrial(TrialSettings setting)
{
return;
}
}
De IMonitor interface heeft vier levenscyclusgebeurtenissen:
Tip
Hoewel dit niet vereist is, neemt u uw SweepablePipeline monitor op, zodat u de pijplijn kunt inspecteren die is gegenereerd voor een proefversie met behulp van de Parameter eigenschap van de TrialSettings.
In dit voorbeeld worden alleen de ReportCompletedTrial en ReportFailTrial geïmplementeerd.
Nadat u uw monitor hebt geïmplementeerd, stelt u deze in als onderdeel van uw experimentconfiguratie met behulp van SetMonitor.
var monitor = new AutoMLMonitor(pipeline);
experiment.SetMonitor(monitor);
Voer vervolgens uw experiment uit:
var cts = new CancellationTokenSource();
TrialResult experimentResults = await experiment.RunAsync(cts.Token);
Wanneer u het experiment met deze implementatie uitvoert, moet de uitvoer er ongeveer als volgt uitzien:
Trial 0 finished training in 5835ms with pipeline ReplaceMissingValues=>OneHotEncoding=>Concatenate=>FastForestRegression
Trial 1 finished training in 15080ms with pipeline ReplaceMissingValues=>OneHotEncoding=>Concatenate=>SdcaRegression
Trial 2 finished training in 3941ms with pipeline ReplaceMissingValues=>OneHotHashEncoding=>Concatenate=>FastTreeRegression
Proefprojecten behouden
Standaard slaat AutoML alleen het TrialResult beste model op. Als u echter elk van de proefversies wilt behouden, kunt u dit doen vanuit uw monitor.
Binnen uw monitor:
Definieer een eigenschap voor uw voltooide proefversies en een methode om deze te openen.
private readonly List<TrialResult> _completedTrials; public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;
Initialiseer deze in uw constructor
public AutoMLMonitor(SweepablePipeline pipeline) { //... _completedTrials = new List<TrialResult>(); //... }
Voeg elk proefresultaat toe aan uw ReportCompletedTrial levenscyclusmethode.
public void ReportCompletedTrial(TrialResult result) { //... _completedTrials.Add(result); }
Wanneer de training is voltooid, hebt u toegang tot alle voltooide proefversies door aan te roepen
GetCompletedTrials
var completedTrials = monitor.GetCompletedTrials();
Op dit moment kunt u aanvullende verwerking uitvoeren voor de verzameling voltooide proefversies. U kunt bijvoorbeeld een ander model kiezen dan het model dat is geselecteerd door AutoML, resultaten van proefabonnementen vastleggen in een database of de pijplijn opnieuw bouwen vanuit een van de voltooide proefversies.
Experimenten annuleren
Wanneer u experimenten asynchroon uitvoert, moet u het proces op schone wijze beëindigen. Gebruik hiervoor een CancellationToken.
Waarschuwing
Als u een experiment annuleert, worden geen tussenliggende uitvoer opgeslagen. Stel een controlepunt in om intermediaire uitvoer op te slaan.
var cts = new CancellationTokenSource();
TrialResult experimentResults = await experiment.RunAsync(cts.Token);
Controlepunten instellen
Controlepunten bieden een manier om tussenliggende uitvoer van het trainingsproces op te slaan in het geval van een vroegtijdige beëindiging of fout. Als u een controlepunt wilt instellen, gebruikt u de SetCheckpoint extensiemethode en geeft u een map op om de tussenliggende uitvoer op te slaan.
var checkpointPath = Path.Join(Directory.GetCurrentDirectory(), "automl");
experiment.SetCheckpoint(checkpointPath);
Het belang van functies bepalen
Omdat machine learning wordt geïntroduceerd in meer aspecten van het dagelijkse leven, zoals gezondheidszorg, is het van het grootste belang om te begrijpen waarom een machine learning-model de beslissingen neemt die het doet. PFI (Permutation Feature Importance) is een techniek die wordt gebruikt om classificatie-, classificatie- en regressiemodellen uit te leggen. Op een hoog niveau is de manier waarop het werkt door willekeurig gegevens één functie tegelijk te shuffling voor de hele gegevensset en door te berekenen hoeveel de metrische prestatiegegevens van belang afnemen. Hoe groter de wijziging, hoe belangrijker die functie is. Zie modelvoorspellingen interpreteren met behulp van Het belang van permutatiefuncties voor meer informatie over PFI.
Notitie
Het berekenen van PFI kan een tijdrovende bewerking zijn. Hoeveel tijd het kost om te berekenen, is evenredig met het aantal functiekolommen dat u hebt. Hoe meer functies, hoe langer het duurt om PFI uit te voeren.
Het belang van functies bepalen met Behulp van AutoML:
Haal het beste model op.
var bestModel = expResult.Model;
Pas het model toe op uw gegevensset.
var transformedData = bestModel.Transform(trainValidationData.TrainSet);
Het belang van functies berekenen met behulp van PermutationFeatureImportance
In dit geval is de taak regressie, maar hetzelfde concept is van toepassing op andere taken, zoals rangschikking en classificatie.
var pfiResults = mlContext.Regression.PermutationFeatureImportance(bestModel, transformedData, permutationCount:3);
Het belang van de functie ordenen door wijzigingen in metrische evaluatiegegevens.
var featureImportance = pfiResults.Select(x => Tuple.Create(x.Key, x.Value.Regression.RSquared)) .OrderByDescending(x => x.Item2);