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

ML.NET alkalmazásfejlesztési folyamat, beleértve az adatgenerálás, a folyamatfejlesztés, a modellbetanítás, a modellértékelés és a modellhasználat összetevőit

Á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ó.

Lineáris regressziós modell torzításokkal és súlyparaméterekkel

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.

Szövegbesorolási modell

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.

Intellisense for Regression Trainers

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 ConcatenateSdca 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.

ML.NET Data View-példa a házárak előrejelzési adataival

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.