Modell betanítása és kiértékelése

Megtudhatja, hogyan hozhat létre gépi tanulási modelleket, gyűjthet metrikákat és mérheti a teljesítményt ML.NET. Bár ez a minta egy regressziós modellt képez be, a fogalmak a többi algoritmus többségében alkalmazhatók.

Adatok felosztása betanításhoz és teszteléshez

A gépi tanulási modell célja a betanítási adatokon belüli minták azonosítása. Ezek a minták új adatokkal történő előrejelzések készítésére szolgálnak.

Az adatokat egy olyan osztály modellezheti, mint a 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; }
}

A következő adatok, amelyek betöltve vannak egy 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
    }
};

Ezzel a TrainTestSplit módszerrel feloszthatja az adatokat betanítási és tesztelési csoportokra. Az eredmény egy TrainTestData olyan objektum lesz, amely két IDataView tagot tartalmaz, egyet a vonatkészlethez, a másikat a tesztkészlethez. Az adatfelosztás százalékos értékét a testFraction paraméter határozza meg. Az alábbi kódrészlet a tesztkészlet eredeti adatainak 20 százalékát tartalmazza.

DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;

Az adatok előkészítése

A gépi tanulási modellek betanítása előtt az adatokat előre fel kell dolgozni. Az adatelőkészítéssel kapcsolatos további információk az adatelőkészítési útmutatóban , valamint a transforms page.

ML.NET algoritmusok korlátozásokkal rendelkeznek a bemeneti oszloptípusokra. Emellett az alapértelmezett értékek a bemeneti és kimeneti oszlopnevekhez is használhatók, ha nincsenek megadva értékek.

A várt oszloptípusok használata

A ML.NET gépi tanulási algoritmusai bemenetként ismert méretű lebegőpontos vektort várnak. Alkalmazza az VectorType attribútumot az adatmodellre, ha az összes adat már numerikus formátumban van, és közös feldolgozásra szolgál (például kép képpontok).

Ha az adatok nem mind numerikusak, és külön-külön szeretné alkalmazni a különböző adatátalakításokat az egyes oszlopokra, akkor a Concatenate metódust az összes oszlop feldolgozása után használhatja az összes oszlop egyetlen funkcióvektorává való kombinálásához, amely egy új oszlopot eredményez.

Az alábbi kódrészlet egyetlen funkcióvektorba egyesíti az oszlopokat és HistoricalPrices az Size oszlopokat, amelyek egy új, úgynevezett Featuresoszlopba kerülnek. Mivel különbség van a méretezésben, NormalizeMinMax a rendszer az oszlopra alkalmazza az Features adatok normalizálásához.

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

Az alapértelmezett oszlopnevek használata

ML.NET algoritmusok alapértelmezett oszlopneveket használnak, ha nincs megadva. Minden oktató rendelkezik egy paraméterrel, amely az algoritmus bemeneteihez van meghívva featureColumnName , és ha alkalmazható, a várt értékhez is rendelkezik egy paraméterrel labelColumnName. Alapértelmezés szerint ezek az értékek és FeaturesLabel azok is.

Ha a metódust az Concatenate előfeldolgozás során egy új, úgynevezett Featuresoszlop létrehozásához használja, nem szükséges megadni a funkcióoszlop nevét az algoritmus paramétereiben, mivel az már létezik az előre feldolgozott IDataViewoszlopban. A címkeoszlop a CurrentPricekövetkező, de mivel az ColumnName attribútumot az adatmodellben használja, ML.NET átnevezi azt az CurrentPrice oszlopot Label , amelyre nem szükséges megadni a labelColumnName paramétert a gépi tanulási algoritmus becslőjének.

Ha nem szeretné használni az alapértelmezett oszlopneveket, adja meg a funkció nevét, és adja meg paraméterként a címkeoszlopokat a gépi tanulási algoritmus becslőjének meghatározásakor, ahogyan azt a következő kódrészlet is mutatja:

var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");

Adatok gyorsítótárazása

Alapértelmezés szerint az adatok feldolgozásakor a rendszer lazán betölti vagy streameli az adatokat, ami azt jelenti, hogy az oktatók a betanítás során többször is betölthetik az adatokat a lemezről, és iterálhatnak rajta. Ezért a gyorsítótárazást a memóriába illeszkedő adathalmazok esetében javasoljuk, hogy csökkentse az adatok lemezről való betöltésének számát. A gyorsítótárazás a használatával AppendCacheCheckpointtörténik.EstimatorChain

Javasoljuk, hogy a folyamat bármely oktatója előtt használja AppendCacheCheckpoint .

Az alábbi EstimatorChain, hozzáadás AppendCacheCheckpoint előtt az StochasticDualCoordinateAscent oktató gyorsítótárazza a korábbi becslési eredmények későbbi használatra az edző.

// 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());

A gépi tanulási modell betanítása

Az adatok előzetes feldolgozása után a Fit módszerrel betanítsa a gépi tanulási modellt a StochasticDualCoordinateAscent regressziós algoritmussal.

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);

Modellparaméterek kinyerése

A modell betanítása után nyerje ki a tanultakat ModelParameters ellenőrzésre vagy újratanításra. Ez LinearRegressionModelParameters biztosítja a betanított modell torzítását és tanult együtthatóit vagy súlyait.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Feljegyzés

Más modellek a feladataikra jellemző paraméterekkel rendelkeznek. A K-Means algoritmus például centroidok alapján helyezi az adatokat a fürtökbe, és egy KMeansModelParameters olyan tulajdonságot tartalmaz, amely ezeket a tanult centroidokat tárolja. További információkért látogasson el az Microsoft.ML.Trainers API dokumentációjához , és keresse fel a nevükben szereplő ModelParameters osztályokat.

Modellminőség kiértékelése

A legjobban teljesítő modell kiválasztásához elengedhetetlen a tesztadatok teljesítményének kiértékelése. A metódus használatával Evaluate a betanított modell különböző metrikáit méri.

Feljegyzés

A Evaluate metódus különböző metrikákat állít elő attól függően, hogy melyik gépi tanulási feladatot hajtották végre. További részletekért tekintse meg az API dokumentációjátMicrosoft.ML.Data, és keresse fel a nevükben szereplő Metrics osztályokat.

// 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;

Az előző kódmintában:

  1. A tesztadatkészlet előre feldolgozva van a korábban definiált adatelőkészítési átalakításokkal.
  2. A betanított gépi tanulási modell a tesztadatokra vonatkozó előrejelzések készítésére szolgál.
  3. A metódusban a Evaluate tesztadatkészlet oszlopában lévő CurrentPrice értékeket összehasonlítjuk az Score újonnan kijelzett előrejelzések oszlopával a regressziós modell metrikáinak kiszámításához, amelyek közül az egyik az R-Squared a változóban rSquared van tárolva.

Feljegyzés

Ebben a kis példában az R-Négyzet egy olyan szám, amely az adatok korlátozott mérete miatt nem szerepel a 0-1 tartományban. Valós forgatókönyv esetén 0 és 1 közötti értékre kell számítania.