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 Features
oszlopba 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 Features
Label
azok is.
Ha a metódust az Concatenate
előfeldolgozás során egy új, úgynevezett Features
oszlop 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 IDataView
oszlopban. A címkeoszlop a CurrentPrice
kö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 AppendCacheCheckpoint
tö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:
- A tesztadatkészlet előre feldolgozva van a korábban definiált adatelőkészítési átalakításokkal.
- A betanított gépi tanulási modell a tesztadatokra vonatkozó előrejelzések készítésére szolgál.
- A metódusban a
Evaluate
tesztadatkészlet oszlopában lévőCurrentPrice
értékeket összehasonlítjuk azScore
ú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óbanrSquared
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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: