Adatok betöltése fájlokból és más forrásokból

Megtudhatja, hogyan tölthet be adatokat feldolgozásra és betanításra ML.NET az API használatával. Az adatok eredetileg fájlokban vagy más adatforrásokban, például adatbázisokban, JSON-ban, XML-ben vagy memóriabeli gyűjteményekben vannak tárolva.

Ha a Model Buildert használja, olvassa el a Betanítási adatok betöltése a Model Builderbe című témakört.

Az adatmodell létrehozása

ML.NET lehetővé teszi az adatmodellek osztályokon keresztüli meghatározását. Például a következő bemeneti adatok alapján:

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000

Hozzon létre egy adatmodellt, amely az alábbi kódrészletet jelöli:

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

Az adatmodell jegyzetelése oszlopattribútumokkal

Az attribútumok további információkat nyújtanak ML.NET az adatmodellről és az adatforrásról.

Az LoadColumn attribútum megadja a tulajdonságok oszlopindexeit.

Fontos

LoadColumn csak akkor szükséges, ha adatokat tölt be egy fájlból.

Oszlopok betöltése a következő módon:

  • Az egyes oszlopok az osztályhoz hasonlóan Size és CurrentPrices az HousingData osztályban is.
  • Egyszerre több oszlop vektor formájában, mint HistoricalPrices az HousingData osztályban.

Ha vektortulajdonságsal rendelkezik, alkalmazza az VectorType attribútumot az adatmodell tulajdonságára. Fontos megjegyezni, hogy a vektor összes elemének azonos típusúnak kell lennie. Az oszlopok elkülönítése lehetővé teszi a funkciófejlesztés egyszerűségét és rugalmasságát, de nagyon sok oszlop esetében az egyes oszlopokon végzett munka hatással van a betanítási sebességre.

ML.NET Oszlopneveken keresztül működik. Ha egy oszlop nevét a tulajdonságnéven kívül másra szeretné módosítani, használja az ColumnName attribútumot. Memóriabeli objektumok létrehozásakor továbbra is a tulajdonságnév használatával hozhat létre objektumokat. Az adatfeldolgozáshoz és a gépi tanulási modellek létrehozásához azonban ML.NET felülbírálja és hivatkozik a tulajdonságra az ColumnName attribútumban megadott értékkel.

Adatok betöltése egyetlen fájlból

Ha fájlból szeretne adatokat betölteni, használja a LoadFromTextFile metódust a betöltendő adatok adatmodelljével együtt. Mivel separatorChar a paraméter alapértelmezés szerint tabulátorral tagolt, szükség szerint módosítsa az adatfájlhoz. Ha a fájl fejléccel rendelkezik, állítsa a hasHeader paramétert úgy, hogy true figyelmen kívül hagyja a fájl első sorát, és kezdje el betölteni az adatokat a második sorból.

//Create MLContext
MLContext mlContext = new MLContext();

//Load Data
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("my-data-file.csv", separatorChar: ',', hasHeader: true);

Adatok betöltése több fájlból

Abban az esetben, ha az adatok több fájlban vannak tárolva, mindaddig, amíg az adatséma megegyezik, ML.NET lehetővé teszi az adatok betöltését több fájlból, amelyek ugyanabban a könyvtárban vagy több könyvtárban találhatók.

Betöltés egyetlen könyvtárban lévő fájlokból

Ha az összes adatfájl ugyanabban a könyvtárban található, használjon helyettesítő karaktereket a LoadFromTextFile metódusban.

//Create MLContext
MLContext mlContext = new MLContext();

//Load Data File
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("Data/*", separatorChar: ',', hasHeader: true);

Betöltés több könyvtárban lévő fájlokból

Ha több könyvtárból szeretne adatokat betölteni, a CreateTextLoader metódussal hozzon létre egy TextLoader. Ezután használja a metódust TextLoader.Load , és adja meg az egyes fájlelérési utakat (helyettesítő karakterek nem használhatók).

//Create MLContext
MLContext mlContext = new MLContext();

// Create TextLoader
TextLoader textLoader = mlContext.Data.CreateTextLoader<HousingData>(separatorChar: ',', hasHeader: true);

// Load Data
IDataView data = textLoader.Load("DataFolder/SubFolder1/1.txt", "DataFolder/SubFolder2/1.txt");

Adatok betöltése relációs adatbázisból

ML.NET támogatja az adatok betöltését az SQL Server, az Azure SQL Database, az Oracle, az SQLite, a PostgreSQL, a Progress, az IBM DB2 és sok más által System.Data támogatott relációs adatbázisból.

Feljegyzés

A használatához DatabaseLoaderhivatkozzon a System.Data.SqlClient NuGet-csomagra.

Adott egy adatbázis nevesített táblával House és a következő sémával:

CREATE TABLE [House] (
    [HouseId] INT NOT NULL IDENTITY,
    [Size] INT NOT NULL,
    [NumBed] INT NOT NULL,
    [Price] REAL NOT NULL
    CONSTRAINT [PK_House] PRIMARY KEY ([HouseId])
);

Az adatokat egy olyan osztály modellezheti, mint a HouseData.

public class HouseData
{
    public float Size { get; set; }

    public float NumBed { get; set; }

    public float Price { get; set; }
}

Ezután az alkalmazáson belül hozzon létre egy DatabaseLoader.

MLContext mlContext = new MLContext();

DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<HouseData>();

Adja meg a kapcsolati sztring, valamint az adatbázison végrehajtandó SQL-parancsot, és hozzon létre egy példánytDatabaseSource. Ez a minta egy LocalDB SQL Server-adatbázist használ egy fájl elérési útjával. A DatabaseLoader azonban minden más érvényes kapcsolati sztring támogat a helyszíni és a felhőbeli adatbázisokhoz.

string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=<YOUR-DB-FILEPATH>;Database=<YOUR-DB-NAME>;Integrated Security=True;Connect Timeout=30";

string sqlCommand = "SELECT CAST(Size as REAL) as Size, CAST(NumBed as REAL) as NumBed, Price FROM House";

DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance, connectionString, sqlCommand);

A nem típusú Real numerikus adatokat konvertálni Realkell . A Real típus egy pontosságú lebegőpontos értékként vagy SingleML.NET algoritmusok által várt bemeneti típusként jelenik meg. Ebben a mintában az Size oszlopok egész NumBed számok az adatbázisban. A beépített függvény használatával a CAST rendszer átalakítja Real. Mivel a Price tulajdonság már típusként Real van betöltve, a rendszer betölti.

Load A metódus használatával töltse be az adatokat egy IDataView.

IDataView data = loader.Load(dbSource);

Adatok betöltése más forrásokból

A fájlokban tárolt adatok betöltése mellett a ML.NET támogatja az adatok betöltését olyan forrásokból, amelyek tartalmazzák, de nem korlátozódnak a következőkre:

  • Memóriabeli gyűjtemények
  • JSON/XML

Vegye figyelembe, hogy a streamelési források használatakor a ML.NET a bemeneti adatok memórián belüli gyűjtemény formájában fognak működni. Ezért amikor olyan forrásokkal dolgozik, mint a JSON/XML, ügyeljen arra, hogy az adatokat memórián belüli gyűjteménybe formázza.

A következő memóriabeli gyűjteményre tekintettel:

HousingData[] inMemoryCollection = new HousingData[]
{
    new HousingData
    {
        Size =700f,
        HistoricalPrices = new float[]
        {
            100000f, 3000000f, 250000f
        },
        CurrentPrice = 500000f
    },
    new HousingData
    {
        Size =1000f,
        HistoricalPrices = new float[]
        {
            600000f, 400000f, 650000f
        },
        CurrentPrice=700000f
    }
};

Töltse be a memóriabeli gyűjteményt egy IDataView metódusba LoadFromEnumerable :

Fontos

LoadFromEnumerable feltételezi, hogy a IEnumerable terhelés szálbiztos.

// Create MLContext
MLContext mlContext = new MLContext();

//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);

Következő lépések