Načtení dat ze souborů a dalších zdrojů

Naučte se načítat data pro zpracování a trénování do ML.NET pomocí rozhraní API. Data jsou původně uložená v souborech nebo jiných zdrojích dat, jako jsou databáze, JSON, XML nebo kolekce v paměti.

Pokud používáte Tvůrce modelů, přečtěte si téma Načtení trénovacích dat do Tvůrce modelů.

Vytvoření datového modelu

ML.NET umožňuje definovat datové modely prostřednictvím tříd. Například při zadání následujících vstupních dat:

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

Vytvořte datový model, který představuje následující fragment kódu:

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

Přidávání poznámek k datovému modelu s atributy sloupců

Atributy poskytují ML.NET další informace o datovém modelu a zdroji dat.

Atribut LoadColumn určuje indexy sloupců vlastností.

Důležité

LoadColumn je vyžadován pouze při načítání dat ze souboru.

Načtěte sloupce jako:

  • Jednotlivé sloupce jako Size a CurrentPrices ve HousingData třídě.
  • Více sloupců najednou ve formě vektoru, jako HistoricalPrices je třída HousingData .

Pokud máte vektorovou vlastnost, použijte VectorType atribut na vlastnost v datovém modelu. Je důležité si uvědomit, že všechny prvky vektoru musí být stejného typu. Oddělení sloupců umožňuje snadno a flexibilně pracovat s technickými funkcemi, ale u velmi velkého počtu sloupců způsobuje provoz na jednotlivých sloupcích vliv na rychlost trénování.

ML.NET Funguje prostřednictvím názvů sloupců. Pokud chcete změnit název sloupce na jiný než název vlastnosti, použijte ColumnName atribut. Při vytváření objektů v paměti stále vytváříte objekty pomocí názvu vlastnosti. Pro zpracování dat a vytváření modelů strojového učení však ML.NET přepsání a odkazování na vlastnost s hodnotou zadanou v atributu ColumnName .

Načtení dat z jednoho souboru

K načtení dat ze souboru použijte metodu LoadFromTextFile spolu s datovým modelem pro načtení dat. Vzhledem k tomu, že separatorChar parametr je ve výchozím nastavení oddělený tabulátorem, změňte ho pro datový soubor podle potřeby. Pokud má soubor záhlaví, nastavte hasHeader parametr tak, aby true ignoroval první řádek v souboru a začal načítat data z druhého řádku.

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

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

Načtení dat z více souborů

V případě, že jsou vaše data uložená ve více souborech, pokud je schéma dat stejné, ML.NET umožňuje načíst data z více souborů, které jsou buď ve stejném adresáři, nebo ve více adresářích.

Načtení ze souborů v jednom adresáři

Pokud jsou všechny datové soubory ve stejném adresáři, použijte v LoadFromTextFile metodě zástupné cardy.

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

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

Načtení ze souborů v několika adresářích

Chcete-li načíst data z více adresářů, použijte CreateTextLoader metodu TextLoaderk vytvoření . Pak použijte metodu TextLoader.Load a určete jednotlivé cesty k souborům (zástupné cardy nelze použít).

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

Načtení dat z relační databáze

ML.NET podporuje načítání dat z různých relačních databází podporovaných sql Serverem System.Data , Azure SQL Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 a mnoho dalších.

Poznámka:

Chcete-li použít DatabaseLoader, odkazujte na balíček NuGet System.Data.SqlClient .

Databáze s názvem House a následujícím schématem:

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

Data lze modelovat podle třídy, jako je HouseData.

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

    public float NumBed { get; set; }

    public float Price { get; set; }
}

Pak v aplikaci vytvořte DatabaseLoader.

MLContext mlContext = new MLContext();

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

Definujte připojovací řetězec a také příkaz SQL, který se má spustit v databázi, a vytvořte DatabaseSource instanci. Tato ukázka používá databázi SQL Serveru LocalDB s cestou k souboru. DatabaseLoader ale podporuje všechny další platné připojovací řetězec pro místní databáze i v cloudu.

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

Číselná data, která nejsou typu Real , musí být převedena na Real. Typ Real je reprezentován jako hodnota s plovoucí desetinnou čárkou s jednou přesností nebo Single, vstupní typ očekávaný ML.NET algoritmy. V této ukázce Size jsou sloupce NumBed celá čísla v databázi. CAST Pomocí integrované funkce se převede na Real. Vzhledem k tomu, že Price vlastnost je již typu Real , je načtena tak, jak je.

Použijte metodu Load k načtení dat do objektu IDataView.

IDataView data = loader.Load(dbSource);

Načtení dat z jiných zdrojů

Kromě načítání dat uložených v souborech ML.NET podporuje načítání dat ze zdrojů, které zahrnují, ale nejsou omezené na:

  • Kolekce v paměti
  • JSON/XML

Všimněte si, že při práci se zdroji streamování ML.NET očekává, že vstup bude ve formě kolekce v paměti. Proto při práci se zdroji, jako je JSON/XML, nezapomeňte data naformátovat do kolekce v paměti.

S ohledem na následující kolekci v paměti:

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

Načtěte kolekci v paměti do IDataViewLoadFromEnumerable metody:

Důležité

LoadFromEnumerable předpokládá, že IEnumerable zatížení z něj je bezpečné pro přístup z více vláken.

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

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

Další kroky