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
aCurrentPrices
veHousingData
třídě. - Více sloupců najednou ve formě vektoru, jako
HistoricalPrices
je třídaHousingData
.
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 TextLoader
k 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
- Pokud chcete data vyčistit nebo jinak zpracovat, přečtěte si téma Příprava dat pro vytvoření modelu.
- Až budete připraveni vytvořit model, přečtěte si téma Trénování a vyhodnocení modelu.