Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dowiedz się, jak tworzyć modele uczenia maszynowego, zbierać metryki i mierzyć wydajność przy użyciu ML.NET. Mimo że ten przykład trenuje model regresji, koncepcje mają zastosowanie w większości innych algorytmów.
Dzielenie danych na potrzeby trenowania i testowania
Celem modelu uczenia maszynowego jest zidentyfikowanie wzorców w danych treningowych. Te wzorce służą do przewidywania przy użyciu nowych danych.
Dane mogą być modelowane przez klasę, na przykład 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; }
}
Biorąc pod uwagę następujące dane, które są ładowane do obiektu 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
Użyj metody , aby podzielić dane na zestawy trenowania i testowania. Wynik będzie obiektem zawierającym TrainTestData
dwa IDataView
elementy członkowskie, jeden dla zestawu pociągu i drugi dla zestawu testowego. Procent podziału danych jest określany przez testFraction
parametr . Poniższy fragment kodu zawiera 20 procent oryginalnych danych dla zestawu testowego.
DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;
Przygotowywanie danych
Dane muszą być wstępnie przetworzone przed trenowanie modelu uczenia maszynowego. Więcej informacji na temat przygotowywania danych można znaleźć w artykule z instrukcjami przygotowywania danych, a także w artykule transforms page
.
ML.NET algorytmy mają ograniczenia dotyczące typów kolumn wejściowych. Ponadto wartości domyślne są używane dla nazw kolumn wejściowych i wyjściowych, gdy nie określono żadnych wartości.
Praca z oczekiwanymi typami kolumn
Algorytmy uczenia maszynowego w ML.NET oczekują wektora zmiennoprzecinkowego o znanym rozmiarze jako danych wejściowych. VectorType
Zastosuj atrybut do modelu danych, gdy wszystkie dane są już w formacie liczbowym i mają być przetwarzane razem (tj. piksele obrazu).
Jeśli dane nie są liczbowe i chcesz zastosować różne przekształcenia danych dla każdej z kolumn indywidualnie, użyj Concatenate
metody po przetworzeniu wszystkich kolumn, aby połączyć wszystkie poszczególne kolumny w jeden wektor funkcji, który jest wyjściowy do nowej kolumny.
Poniższy fragment kodu łączy Size
kolumny i HistoricalPrices
w jeden wektor funkcji, który jest wyjściowy do nowej kolumny o nazwie Features
. Ponieważ istnieje różnica w skalach, NormalizeMinMax
jest stosowana do Features
kolumny w celu normalizacji danych.
// 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);
Praca z domyślnymi nazwami kolumn
ML.NET algorytmy używają domyślnych nazw kolumn, jeśli nie są określone. Wszyscy trenerzy mają parametr o nazwie featureColumnName
dla danych wejściowych algorytmu, a jeśli ma to zastosowanie, mają również parametr dla oczekiwanej wartości o nazwie labelColumnName
. Domyślnie te wartości są Features
i Label
odpowiednio.
Używając Concatenate
metody podczas przetwarzania wstępnego w celu utworzenia nowej kolumny o nazwie Features
, nie ma potrzeby określania nazwy kolumny funkcji w parametrach algorytmu, ponieważ już istnieje w wstępnie przetworzonym IDataView
. Kolumna etykiety to CurrentPrice
, ale ponieważ ColumnName
atrybut jest używany w modelu danych, ML.NET zmienia nazwę CurrentPrice
kolumny, w Label
której usunięto konieczność podania labelColumnName
parametru do narzędzia do szacowania algorytmu uczenia maszynowego.
Jeśli nie chcesz używać domyślnych nazw kolumn, przekaż nazwy kolumn funkcji i etykiet jako parametry podczas definiowania narzędzia do szacowania algorytmu uczenia maszynowego, jak pokazano w kolejnym fragmencie kodu:
var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");
Buforowanie danych
Domyślnie, gdy dane są przetwarzane, są ładowane z opóźnieniem lub przesyłane strumieniowo, co oznacza, że trenerzy mogą ładować dane z dysku i iterować je wielokrotnie podczas trenowania. W związku z tym buforowanie jest zalecane w przypadku zestawów danych, które mieszczą się w pamięci, aby zmniejszyć liczbę ładowanych danych z dysku. Buforowanie jest wykonywana w ramach EstimatorChain
elementu przy użyciu polecenia AppendCacheCheckpoint
.
Zaleca się stosowanie AppendCacheCheckpoint
przed wszystkimi trenerami w potoku.
Korzystając z poniższego EstimatorChain
elementu , dodaj AppendCacheCheckpoint
, zanim StochasticDualCoordinateAscent
trener buforuje wyniki poprzednich narzędzia do szacowania do późniejszego użycia przez trenera.
// 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());
Trenowanie modelu uczenia maszynowego
Po wstępnie przetworzonych danych użyj Fit
metody , aby wytrenować model uczenia maszynowego przy użyciu algorytmu StochasticDualCoordinateAscent
regresji.
// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();
// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);
Wyodrębnianie parametrów modelu
Po wytrenowaniu modelu wyodrębnij zdobytą wiedzę ModelParameters
na potrzeby inspekcji lub ponownego trenowania. Zapewniają LinearRegressionModelParameters
stronniczość i poznane współczynniki lub wagi wytrenowanego modelu.
var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;
Uwaga
Inne modele mają parametry specyficzne dla ich zadań. Na przykład algorytm K-Średnich umieszcza dane w klastrze na podstawie centroidów i KMeansModelParameters
zawiera właściwość, która przechowuje te poznane centroidy. Aby dowiedzieć się więcej, odwiedź dokumentację interfejsu Microsoft.ML.Trainers
API i poszukaj klas, które zawierają ModelParameters
ich nazwę.
Ocena jakości modelu
Aby ułatwić wybór najlepszego modelu, należy ocenić jego wydajność na danych testowych. Evaluate
Użyj metody , aby zmierzyć różne metryki dla wytrenowanego modelu.
Uwaga
Metoda Evaluate
tworzy różne metryki w zależności od tego, które zadanie uczenia maszynowego zostało wykonane. Aby uzyskać więcej informacji, odwiedź dokumentację interfejsuMicrosoft.ML.Data
API i poszukaj klas, które zawierają Metrics
w ich nazwie.
// 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;
W poprzednim przykładzie kodu:
- Zestaw danych testowych jest wstępnie przetwarzany przy użyciu wcześniej zdefiniowanych przekształceń przygotowywania danych.
- Wytrenowany model uczenia maszynowego służy do przewidywania danych testowych.
Evaluate
W metodzie wartości wCurrentPrice
kolumnie zestawu danych testowych są porównywane zScore
kolumną nowo przewidywanych danych wyjściowych w celu obliczenia metryk dla modelu regresji, z których jeden z nich R-Squared jest przechowywany w zmiennejrSquared
.
Uwaga
W tym małym przykładzie R-Squared jest liczbą nie z zakresu od 0 do 1 ze względu na ograniczony rozmiar danych. W rzeczywistym scenariuszu powinna zostać wyświetlona wartość z zakresu od 0 do 1.