Mi ML.NET és hogyan működik?
ML.NET lehetővé teszi gépi tanulás hozzáadását a .NET-alkalmazásokhoz online vagy offline forgatókönyvekben. Ezzel a funkcióval automatikus előrejelzéseket készíthet az alkalmazás számára elérhető adatokkal. A gépi tanulási alkalmazások mintákat használnak az adatokban, hogy előrejelzéseket készítsenek, és nem kell explicit módon programozzanak.
A ML.NET központi része egy gépi tanulási modell. A modell megadja a bemeneti adatok előrejelzéssé alakításához szükséges lépéseket. A ML.NET egy algoritmus megadásával betaníthat egy egyéni modellt, vagy importálhat előre betanított TensorFlow- és ONNX-modelleket.
Miután rendelkezik egy modellel, hozzáadhatja az alkalmazáshoz az előrejelzések készítéséhez.
ML.NET Windowson, Linuxon és macOS-en fut .NET-en vagy Windowson a .NET-keretrendszer használatával. A 64 bites verziók minden platformon támogatottak. A 32 bites verzió támogatott Windows rendszeren, kivéve a TensorFlow, a LightGBM és az ONNX-hez kapcsolódó funkciókat.
Az alábbi táblázat példákat mutat be a ML.NET használható előrejelzések típusára.
Előrejelzés típusa | Példa |
---|---|
Besorolás/kategorizálás | Az ügyfelek visszajelzéseinek automatikus felosztása pozitív és negatív kategóriákba. |
Regresszió/Folyamatos értékek előrejelzése | Előrejelezheti a házak árát a méret és a hely alapján. |
Rendellenességek észlelése | Hamis banki tranzakciók észlelése. |
Ajánlások | Javasoljon olyan termékeket, amelyeket az online vásárlók a korábbi vásárlásaik alapján meg szeretnének vásárolni. |
Idősor/szekvenciális adatok | Időjárás- vagy termékértékesítések előrejelzése. |
Képbesorolás | Kategorizálja a patológiákat az orvosi képeken. |
Szövegbesorolás | A dokumentumok kategorizálása a tartalmuk alapján. |
Mondatok hasonlósága | Két mondat hasonlóságának mérése. |
Hello ML.NET World
Az alábbi kódrészlet a legegyszerűbb ML.NET alkalmazást mutatja be. Ez a példa egy lineáris regressziós modellt hoz létre a lakásárak előrejelzéséhez a házméret és az áradatok alapján.
using System;
using Microsoft.ML;
using Microsoft.ML.Data;
class Program
{
public class HouseData
{
public float Size { get; set; }
public float Price { get; set; }
}
public class Prediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
static void Main(string[] args)
{
MLContext mlContext = new MLContext();
// 1. Import or create training data
HouseData[] houseData = {
new HouseData() { Size = 1.1F, Price = 1.2F },
new HouseData() { Size = 1.9F, Price = 2.3F },
new HouseData() { Size = 2.8F, Price = 3.0F },
new HouseData() { Size = 3.4F, Price = 3.7F } };
IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);
// 2. Specify data preparation and model training pipeline
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));
// 3. Train model
var model = pipeline.Fit(trainingData);
// 4. Make a prediction
var size = new HouseData() { Size = 2.5F };
var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);
Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");
// Predicted price for size: 2500 sq ft= $261.98k
}
}
Kódfolyamat
Az alábbi ábra az alkalmazáskód struktúráját, valamint a modellfejlesztés iteratív folyamatát mutatja be:
- Betanítási adatok gyűjtése és betöltése IDataView-objektumba
- Műveletek folyamatának megadása funkciók kinyeréséhez és gépi tanulási algoritmus alkalmazásához
- Modell betanítása a folyamat Fit() meghívásával
- A modell kiértékelése és iterálása a fejlesztéshez
- A modell mentése bináris formátumba egy alkalmazásban való használatra
- A modell betöltése újra egy ITransformer-objektumba
- Előrejelzések készítése a CreatePredictionEngine.Predict() meghívásával
Ássunk egy kicsit részletesebben ezekbe a fogalmakba.
Gépi tanulási modell
A ML.NET modell olyan objektum, amely a bemeneti adatokon végrehajtandó átalakításokat tartalmaz az előrejelzett kimenet eléréséhez.
Alap
A legalapvetőbb modell a kétdimenziós lineáris regresszió, ahol az egyik folyamatos mennyiség arányos a másikéval, ahogy a fenti lakásár-példában is látható.
A modell egyszerűen: $Price = b + Méret * w$. A $b$ és $w$ paraméterek becslése egy sor (méret, ár) párra való illesztésével történik. A modell paramétereinek megkereséséhez használt adatokat betanítási adatoknak nevezzük. A gépi tanulási modellek bemeneteit funkcióknak nevezzük. Ebben a példában a $Size$ az egyetlen funkció. A gépi tanulási modellek betanítása során használt alapigazság-értékeket címkéknek nevezzük. Itt a betanítási adatkészlet $Price$ értékei a címkék.
Összetettebb
Egy összetettebb modell kategóriákba sorolja a pénzügyi tranzakciókat a tranzakció szövegének leírásával.
Az egyes tranzakcióleírások a redundáns szavak és karakterek eltávolításával, valamint a szó- és karakterkombinációk számlálásával különböző funkciókra oszlanak. A funkciókészlet egy lineáris modell betanítására szolgál a betanítási adatok kategóriái alapján. Minél hasonlóbb az új leírás a betanítási csoportban lévőkhöz, annál valószínűbb, hogy ugyanahhoz a kategóriához lesz rendelve.
A házármodell és a szövegbesorolási modell is lineáris modell. Az adatok jellegétől és a megoldódott problémától függően döntési famodelleket, általánosított additív modelleket és másokat is használhat. A feladatokban további információkat talál a modellekről.
Adatok előkészítése
A legtöbb esetben a rendelkezésre álló adatok nem alkalmasak közvetlenül a gépi tanulási modellek betanítása gombra. A nyers adatokat elő kell készíteni vagy előre fel kell dolgozni ahhoz, hogy a modell paramétereit lehessen megtalálni. Előfordulhat, hogy az adatokat sztringértékekből numerikus ábrázolásba kell konvertálni. Előfordulhat, hogy redundáns információk találhatók a bemeneti adatokban. Előfordulhat, hogy csökkentenie vagy bővítenie kell a bemeneti adatok méretét. Előfordulhat, hogy az adatokat normalizálni vagy skálázni kell.
Az ML.NET oktatóanyagok bemutatja az egyes gépi tanulási feladatokhoz használt szöveg-, kép-, numerikus- és idősorozat-adatok különböző adatfeldolgozási folyamatait.
Az adatok előkészítése bemutatja, hogyan alkalmazhat általánosabb adatelőkészítést.
Az erőforrások szakaszban megtalálja az összes elérhető átalakítás függelékét.
A modell kiértékelése
A modell betanítása után honnan tudja, hogy milyen jól fog jövőbeli előrejelzéseket készíteni? A ML.NET segítségével kiértékelheti a modellt néhány új tesztadat alapján.
A gépi tanulási feladatok minden típusa metrikákkal rendelkezik a modell pontosságának és pontosságának kiértékeléséhez a tesztadatkészleten.
A házárak példájához a Regressziós feladatot használtuk. A modell kiértékeléséhez adja hozzá a következő kódot az eredeti mintához.
HouseData[] testHouseData =
{
new HouseData() { Size = 1.1F, Price = 0.98F },
new HouseData() { Size = 1.9F, Price = 2.1F },
new HouseData() { Size = 2.8F, Price = 2.9F },
new HouseData() { Size = 3.4F, Price = 3.6F }
};
var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
var testPriceDataView = model.Transform(testHouseDataView);
var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");
Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");
// R^2: 0.96
// RMS error: 0.19
A kiértékelési metrikák azt jelzik, hogy a hiba alacsony, és hogy az előrejelzett kimenet és a tesztkimenet közötti korreláció magas. Ez könnyen ment! Valós példákban több hangolás szükséges a jó modellmetrikák eléréséhez.
ML.NET architektúra
Ez a szakasz a ML.NET architekturális mintáit ismerteti. Ha ön tapasztalt .NET-fejlesztő, néhány ilyen minta ismerős lesz, és néhány kevésbé ismerős lesz.
Egy ML.NET alkalmazás egy MLContext objektummal kezdődik. Ez a singleton objektum katalógusokat tartalmaz. A katalógus az adatok betöltésének és mentésének, átalakításának, oktatóinak és modellműveleti összetevőinek előállítója. Minden katalógusobjektum rendelkezik metódusokkal a különböző típusú összetevők létrehozásához.
Task | Katalógus |
---|---|
Adatok betöltése és mentése | DataOperationsCatalog |
Adatok előkészítése | TransformsCatalog |
Bináris besorolás | BinaryClassificationCatalog |
Többosztályos besorolás | MulticlassClassificationCatalog |
Annak észlelődése, hogy a rendszer nem észlelt | AnomalyDetectionCatalog |
Fürtözés | ClusteringCatalog |
Előrejelzés | ForecastingCatalog |
Rangsorolás | RankingCatalog |
Regresszió | RegressionCatalog |
Ajánlás | RecommendationCatalog |
Idősor | TimeSeriesCatalog |
Modellhasználat | ModelOperationsCatalog |
A fenti kategóriák mindegyikében navigálhat a létrehozási módszerekre. A Visual Studio használatával a katalógusok az IntelliSense-en keresztül jelennek meg.
A folyamat létrehozása
Az egyes katalógusok bővítménymetalógusok készlete, amelyekkel betanítási folyamatot hozhat létre.
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));
A kódrészletben mindkét Concatenate
Sdca
metódus szerepel a katalógusban. Mindegyik létrehoz egy IEstimator objektumot, amely hozzá van fűzve a folyamathoz.
Ezen a ponton az objektumok létre lettek hozva, de nem történt végrehajtás.
A modell betanítása
A folyamat objektumainak létrehozása után adatokkal taníthatja be a modellt.
var model = pipeline.Fit(trainingData);
A hívás Fit()
a bemeneti betanítási adatokat használja a modell paramétereinek becsléséhez. Ez a modell betanítása. Ne feledje, hogy a korábban bemutatott lineáris regressziós modellnek két modellparamétere volt: torzítás és súly. A Fit()
hívás után a paraméterek értékei ismertek lesznek. (A legtöbb modell ennél sokkal több paramétert fog használni.)
A modell betanításáról a Modell betanítása című témakörben olvashat bővebben.
Az eredményként kapott modellobjektum implementálja az interfészt ITransformer . Ez azt jelzi, hogy a modell a bemeneti adatokat előrejelzésekké alakítja.
IDataView predictions = model.Transform(inputData);
A modell használata
A bemeneti adatokat tömegesen vagy egyszerre egy bemenetté alakíthatja. A házárak példája mindkettőt megtette: tömegesen a modell kiértékelése céljából, és egyenként egy új előrejelzést. Nézzük meg, hogy egyetlen előrejelzéseket.
var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);
A CreatePredictionEngine()
metódus egy bemeneti osztályt és egy kimeneti osztályt használ. A mezőnevek vagy kódattribútumok határozzák meg a modell betanítása és előrejelzése során használt adatoszlopok nevét. További információ: Előrejelzés készítése betanított modellel.
Adatmodellek és séma
Egy ML.NET gépi tanulási folyamat középpontjában DataView-objektumok állnak.
A folyamat minden egyes transzformációja rendelkezik bemeneti sémával (adatnevek, típusok és méretek, amelyeket az átalakítás várhatóan látni fog a bemenetén); és egy kimeneti sémát (adatneveket, típusokat és méreteket, amelyeket az átalakítás után hoz létre).
Ha a folyamat egyik átalakításának kimeneti sémája nem egyezik meg a következő átalakítás bemeneti sémájában, ML.NET kivételt fog eredményezni.
Az adatnézet-objektumok oszlopokat és sorokat tartalmaznak. Minden oszlopnak van neve, típusa és hossza. A házárak példa bemeneti oszlopai például a Méret és az Ár. Mindkettő típus, és vektor helyett skaláris mennyiség.
Minden ML.NET algoritmus egy vektort tartalmazó bemeneti oszlopot keres. Alapértelmezés szerint ezt a vektoroszlopot Szolgáltatásoknak nevezzük. Ezért a házárak példája összefűzte a Méret oszlopot egy új, Szolgáltatások nevű oszlopba.
var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
Az összes algoritmus új oszlopokat is létrehoz az előrejelzés végrehajtása után. Az új oszlopok rögzített neve a gépi tanulási algoritmus típusától függ. A regressziós tevékenységhez az egyik új oszlopot pontozásnak nevezzük, ahogy az az áradat-attribútumban is látható.
public class Prediction
{
[ColumnName("Score")]
public float Price { get; set; }
}
A különböző gépi tanulási feladatok kimeneti oszlopairól a Gépi Tanulás Feladatok útmutatóban talál további információkat.
A DataView-objektumok fontos tulajdonsága, hogy azokat lazán értékelik ki. Az adatnézetek csak a modell betanítása és kiértékelése, valamint az adat-előrejelzés során töltődnek be és működnek. A ML.NET alkalmazás írása és tesztelése során a Visual Studio hibakeresőjével betekinthet bármely adatnézet-objektumba az Előnézet metódus meghívásával.
var debug = testPriceDataView.Preview();
Megtekintheti a változót a debug
hibakeresőben, és megvizsgálhatja annak tartalmát. Ne használja az előzetes verziójú metódust az éles kódban, mivel jelentősen csökkenti a teljesítményt.
Modell üzembe helyezése
A valós alkalmazásokban a modell betanítási és kiértékelési kódja eltér az előrejelzéstől. Valójában ezt a két tevékenységet gyakran külön csapatok végzik. A modellfejlesztési csapat mentheti a modellt az előrejelzési alkalmazásban való használatra.
mlContext.Model.Save(model, trainingData.Schema,"model.zip");
Következő lépések
Megtudhatja, hogyan hozhat létre alkalmazásokat különböző gépi tanulási feladatokkal, és hogyan hozhat létre reálisabb adatkészleteket az oktatóanyagokban.
Az útmutatókban részletesebben megismerhet konkrét témaköröket.
Ha nagyon lelkes, az API referenciadokumentációját is megismerheti.
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: