Sdílet prostřednictvím


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

Naučte se načítat data do ML.NET pro zpracování a trénování 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, například 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. 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 velkého počtu sloupců má provoz na jednotlivé sloupce vliv na rychlost trénování.

ML.NET pracuje s názvy 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

Pokud chcete načíst data ze souboru, použijte LoadFromTextFile metodu s datovým modelem, který se má načíst. 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 je možné modelovat podle třídy, například 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.

Důležité

Microsoft doporučuje používat nejbezpečnější dostupný tok ověřování. Pokud se připojujete k Azure SQL, spravované identity pro prostředky Azure se doporučují metodou ověřování.

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í imagí

Pokud chcete načíst data obrázku z adresáře, nejprve vytvořte model, který obsahuje cestu k imagi a popisek. ImagePath je absolutní cesta k obrázku v adresáři zdroje dat. Label je třída nebo kategorie skutečného souboru obrázku.

public class ImageData
{
    [LoadColumn(0)]
    public string ImagePath;

    [LoadColumn(1)]
    public string Label;
}

public static IEnumerable<ImageData> LoadImagesFromDirectory(string folder,
            bool useFolderNameAsLabel = true)
{
    string[] files = Directory.GetFiles(folder, "*", searchOption: SearchOption.AllDirectories);

    foreach (string file in files)
    {
        if (Path.GetExtension(file) != ".jpg")
            continue;

        string label = Path.GetFileName(file);

        if (useFolderNameAsLabel)
            label = Directory.GetParent(file).Name;
        else
        {
            for (int index = 0; index < label.Length; index++)
            {
                if (!char.IsLetter(label[index]))
                {
                    label = label.Substring(0, index);
                    break;
                }
            }
        }

        yield return new ImageData()
        {
            ImagePath = file,
            Label = label
        };
    }
}

Pak načtěte image:

IEnumerable<ImageData> images = LoadImagesFromDirectory(
                folder: "your-image-directory-path",
                useFolderNameAsLabel: true
                );

Pokud chcete načíst nezpracované obrázky v paměti z adresáře, vytvořte model pro uložení nezpracovaného pole bajtů a popisku obrázku:

public class InMemoryImageData
{
    [LoadColumn(0)]
    public byte[] Image;

    [LoadColumn(1)]
    public string Label;
}

static IEnumerable<InMemoryImageData> LoadInMemoryImagesFromDirectory(
    string folder,
    bool useFolderNameAsLabel = true
    )
{
    string[] files = Directory.GetFiles(folder, "*",
        searchOption: SearchOption.AllDirectories);
    foreach (string file in files)
    {
        if (Path.GetExtension(file) != ".jpg")
            continue;

        string label = Path.GetFileName(file);
        if (useFolderNameAsLabel)
            label = Directory.GetParent(file).Name;
        else
        {
            for (int index = 0; index < label.Length; index++)
            {
                if (!char.IsLetter(label[index]))
                {
                    label = label.Substring(0, index);
                    break;
                }
            }
        }

        yield return new InMemoryImageData()
        {
            Image = File.ReadAllBytes(file),
            Label = label
        };

    }
}

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í:

  • Kolekce v paměti
  • JSON/XML

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 IDataView LoadFromEnumerable 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