Trénování a vyhodnocení modelu
Naučte se vytvářet modely strojového učení, shromažďovat metriky a měřit výkon pomocí ML.NET. I když tato ukázka trénuje regresní model, koncepty se vztahují ve většině ostatních algoritmů.
Rozdělení dat pro trénování a testování
Cílem modelu strojového učení je identifikovat vzory v trénovacích datech. Tyto vzory se používají k předpovědím pomocí nových dat.
Data lze modelovat podle třídy, jako je HousingData
.
public class HousingData
{
[LoadColumn(0)]
public float Size { get; set; }
[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }
[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}
S ohledem na následující data, která jsou načtena do objektu IDataView
.
HousingData[] housingData = new HousingData[]
{
new HousingData
{
Size = 600f,
HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
CurrentPrice = 170000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
CurrentPrice = 225000f
},
new HousingData
{
Size = 1000f,
HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
CurrentPrice = 195000f
},
new HousingData
{
Size = 850f,
HistoricalPrices = new float[] { 150000f,175000f,210000f },
CurrentPrice = 205000f
},
new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
CurrentPrice = 210000f
},
new HousingData
{
Size = 550f,
HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
CurrentPrice = 180000f
}
};
TrainTestSplit
Pomocí metody rozdělte data do trénovacích a testovacích sad. Výsledkem bude TrainTestData
objekt, který obsahuje dva IDataView
členy, jeden pro trénovací sadu a druhý pro testovací sadu. Procento rozdělení dat je určeno parametrem testFraction
. Následující fragment kódu obsahuje 20 procent původních dat pro testovací sadu.
DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;
Příprava dat
Před trénováním modelu strojového učení je potřeba data předem zpracovat. Další informace o přípravě dat najdete v článku s návody k přípravě dat a také o transforms page
.
ML.NET algoritmy mají omezení pro typy vstupních sloupců. Výchozí hodnoty se navíc používají pro názvy vstupních a výstupních sloupců, pokud nejsou zadány žádné hodnoty.
Práce s očekávanými typy sloupců
Algoritmy strojového učení ve ML.NET očekávají plovoucí vektor známé velikosti jako vstup. VectorType
Atribut použijte u datového modelu, pokud jsou všechna data již v číselném formátu a je určená ke společnému zpracování (tj. obrazových pixelů).
Pokud data nejsou všechna číselná a chcete u každého sloupce použít různé transformace dat jednotlivě, použijte Concatenate
metodu po zpracování všech sloupců ke kombinování všech jednotlivých sloupců do jednoho vektoru funkce, který je výstupem nového sloupce.
Následující fragment kódu kombinuje Size
sloupce a HistoricalPrices
sloupce do jednoho vektoru funkce, který je výstupem do nového sloupce volaného Features
. Vzhledem k tomu, že existuje rozdíl ve škálách, NormalizeMinMax
použije se u Features
sloupce k normalizaci dat.
// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
.Append(mlContext.Transforms.NormalizeMinMax("Features"));
// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(trainData);
// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);
Práce s výchozími názvy sloupců
ML.NET algoritmy používají výchozí názvy sloupců, pokud nejsou zadány žádné. Všichni trenéři mají parametr volaný featureColumnName
pro vstupy algoritmu a pokud je to možné, mají také parametr pro očekávanou hodnotu volanou labelColumnName
. Ve výchozím nastavení jsou Features
tyto hodnoty a Label
v uvedeném pořadí.
Při použití Concatenate
metody během předběžného zpracování k vytvoření nového sloupce volaného Features
, není nutné zadat název sloupce funkce v parametrech algoritmu, protože již existuje v předzpracované IDataView
. Sloupec popisku je CurrentPrice
, ale protože ColumnName
se atribut používá v datovém modelu, ML.NET přejmenuje CurrentPrice
sloupec, na Label
který se odebere potřeba poskytnout labelColumnName
parametr estimátoru algoritmů strojového učení.
Pokud nechcete používat výchozí názvy sloupců, předejte názvy sloupců funkcí a popisků jako parametry při definování estimátoru algoritmů strojového učení, jak ukazuje následující fragment kódu:
var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");
Ukládání dat do mezipaměti
Ve výchozím nastavení se při zpracování dat lazily načítá nebo streamuje, což znamená, že trenéři můžou načíst data z disku a iterovat je vícekrát během trénování. Proto se doporučuje ukládání do mezipaměti pro datové sady, které se vejdou do paměti, aby se snížil počet načtení dat z disku. Ukládání do mezipaměti se provádí jako součást EstimatorChain
nástroje .AppendCacheCheckpoint
Doporučuje se použít AppendCacheCheckpoint
před všemi trenéry v kanálu.
Pomocí následujícího EstimatorChain
příkazu přidáte AppendCacheCheckpoint
před StochasticDualCoordinateAscent
trenér do mezipaměti výsledky předchozích odhadců pro pozdější použití trenérem.
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
.Append(mlContext.Transforms.NormalizeMinMax("Features"))
.AppendCacheCheckpoint(mlContext);
.Append(mlContext.Regression.Trainers.Sdca());
Trénování modelu strojového učení
Po předběžném zpracování dat použijte metodu Fit
k trénování modelu strojového StochasticDualCoordinateAscent
učení pomocí regresního algoritmu.
// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();
// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);
Extrahování parametrů modelu
Po natrénování modelu extrahujte získané poznatky ModelParameters
pro kontrolu nebo opětovné trénování. Poskytuje LinearRegressionModelParameters
předsudky a naučené koeficienty nebo váhy natrénovaného modelu.
var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;
Poznámka:
Jiné modely mají parametry specifické pro jejich úlohy. Například algoritmus K-Means vkládá data do clusteru na základě centroidů a KMeansModelParameters
obsahuje vlastnost, která ukládá tyto naučené centroidy. Další informace najdete v Microsoft.ML.Trainers
dokumentaci k rozhraní API a vyhledejte třídy, které obsahují ModelParameters
jejich název.
Vyhodnocení kvality modelu
Aby bylo možné zvolit model s nejlepším výkonem, je důležité vyhodnotit jeho výkon na testovacích datech. Použijte metodu Evaluate
k měření různých metrik pro natrénovaný model.
Poznámka:
Metoda Evaluate
vytváří různé metriky v závislosti na tom, jakou úlohu strojového učení se provedly. Další podrobnosti najdete v Microsoft.ML.Data
dokumentaci k rozhraní API a vyhledejte třídy, které obsahují Metrics
jejich název.
// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);
// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);
// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;
V předchozí ukázce kódu:
- Testovací datová sada je předem zpracována pomocí dříve definovaných transformací přípravy dat.
- Trénovaný model strojového učení slouží k předpovědím testovacích dat.
Evaluate
V metodě se hodnoty veCurrentPrice
sloupci testovací sady dat porovnávají seScore
sloupcem nově výstupních predikcí pro výpočet metrik regresního modelu, z nichž jeden je uložen vrSquared
proměnné R-Squared.
Poznámka:
V tomto malém příkladu je R-Squared číslo, které není v rozsahu 0–1 kvůli omezené velikosti dat. Ve skutečném scénáři byste měli očekávat, že uvidíte hodnotu od 0 do 1.