Share via


Gegevens laden uit bestanden en andere bronnen

Meer informatie over het laden van gegevens in ML.NET voor verwerking en training met behulp van de API. De gegevens worden oorspronkelijk opgeslagen in bestanden of andere gegevensbronnen, zoals databases, JSON, XML of in-memory verzamelingen.

Als u Model Builder gebruikt, raadpleegt u Trainingsgegevens laden in Model Builder.

Het gegevensmodel maken

ML.NET kunt u gegevensmodellen definiëren via klassen. Bijvoorbeeld op basis van de volgende invoergegevens:

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

Maak een gegevensmodel dat het volgende codefragment vertegenwoordigt:

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

Aantekeningen toevoegen aan het gegevensmodel met kolomkenmerken

Kenmerken geven ML.NET meer informatie over het gegevensmodel en de gegevensbron.

Het LoadColumn kenmerk geeft de kolomindexen van uw eigenschappen op.

Belangrijk

LoadColumn is alleen vereist bij het laden van gegevens uit een bestand.

Kolommen laden als:

  • Afzonderlijke kolommen, zoals Size en CurrentPrices in de HousingData klas.
  • Meerdere kolommen tegelijk in de vorm van een vector, zoals HistoricalPrices in de HousingData klasse.

Als u een vectoreigenschap hebt, past u het VectorType kenmerk toe op de eigenschap in uw gegevensmodel. Alle elementen in de vector moeten hetzelfde type zijn. Door de kolommen gescheiden te houden, kunnen functies gemakkelijker en flexibel worden gemaakt, maar voor een groot aantal kolommen zorgt het gebruik van de afzonderlijke kolommen voor een impact op de trainingssnelheid.

ML.NET werkt via kolomnamen. Als u de naam van een kolom wilt wijzigen in iets anders dan de eigenschapsnaam, gebruikt u het ColumnName kenmerk. Wanneer u in-memory objecten maakt, maakt u nog steeds objecten met behulp van de naam van de eigenschap. Voor gegevensverwerking en het bouwen van machine learning-modellen ML.NET echter overschrijven en verwijst naar de eigenschap met de waarde die in het ColumnName kenmerk is opgegeven.

Gegevens laden uit één bestand

Als u gegevens uit een bestand wilt laden, gebruikt u de LoadFromTextFile methode met het gegevensmodel om de gegevens te laden. Aangezien separatorChar de parameter standaard door tabs wordt gescheiden, wijzigt u deze indien nodig voor uw gegevensbestand. Als uw bestand een header heeft, stelt u de hasHeader parameter in om true de eerste regel in het bestand te negeren en begint u met het laden van gegevens vanaf de tweede regel.

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

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

Gegevens uit meerdere bestanden laden

In het geval dat uw gegevens worden opgeslagen in meerdere bestanden, zolang het gegevensschema hetzelfde is, ML.NET kunt u gegevens laden uit meerdere bestanden die zich in dezelfde map of meerdere mappen bevinden.

Laden vanuit bestanden in één map

Wanneer al uw gegevensbestanden zich in dezelfde map bevinden, gebruikt u jokertekens in de LoadFromTextFile methode.

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

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

Laden vanuit bestanden in meerdere mappen

Als u gegevens uit meerdere mappen wilt laden, gebruikt u de CreateTextLoader methode om een TextLoader. Gebruik vervolgens de TextLoader.Load methode en geef de afzonderlijke bestandspaden op (jokertekens kunnen niet worden gebruikt).

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

Gegevens laden uit een relationele database

ML.NET ondersteunt het laden van gegevens uit verschillende relationele databases die worden ondersteund door System.Data SQL Server, Azure SQL Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 en nog veel meer.

Notitie

Raadpleeg het NuGet-pakket System.Data.SqlClient om te gebruikenDatabaseLoader.

Gegeven een database met een tabel met de naam House en het volgende schema:

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

De gegevens kunnen worden gemodelleerd door een klasse zoals HouseData:

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

Maak vervolgens in uw toepassing een DatabaseLoader.

MLContext mlContext = new MLContext();

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

Definieer uw verbindingsreeks en de SQL-opdracht die moet worden uitgevoerd op de database en maak een DatabaseSource exemplaar. In dit voorbeeld wordt een LocalDB SQL Server-database met een bestandspad gebruikt. DatabaseLoader ondersteunt echter alle andere geldige verbindingsreeks voor on-premises databases en in de cloud.

Belangrijk

Microsoft raadt u aan de veiligste verificatiestroom te gebruiken die beschikbaar is. Als u verbinding maakt met Azure SQL, is Managed Identities voor Azure-resources de aanbevolen verificatiemethode.

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

Numerieke gegevens die niet van het type Real zijn, moeten worden geconverteerd naar Real. Het Real type wordt weergegeven als een drijvendekommawaarde met één precisie of Single, het invoertype dat wordt verwacht door ML.NET algoritmen. In dit voorbeeld zijn de Size en NumBed kolommen gehele getallen in de database. Met behulp van de CAST ingebouwde functie wordt deze geconverteerd naar Real. Omdat de Price eigenschap al van het type Realis, wordt deze net zo geladen.

Gebruik de Load methode om de gegevens in een IDataView.

IDataView data = loader.Load(dbSource);

Afbeeldingen laden

Als u afbeeldingsgegevens uit een map wilt laden, maakt u eerst een model dat het pad naar de installatiekopieën en een label bevat. ImagePath is het absolute pad van de afbeelding in de gegevensbronmap. Label is de klasse of categorie van het werkelijke afbeeldingsbestand.

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

Laad vervolgens de installatiekopieën:

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

Als u onbewerkte afbeeldingen uit de map in het geheugen wilt laden, maakt u een model voor het opslaan van de bytematrix en het label voor onbewerkte afbeeldingen:

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

    }
}

Gegevens laden uit andere bronnen

Naast het laden van gegevens die zijn opgeslagen in bestanden, biedt ML.NET ondersteuning voor het laden van gegevens uit bronnen, waaronder:

  • Verzamelingen in het geheugen
  • JSON/XML

Wanneer u met streamingbronnen werkt, verwacht ML.NET dat invoer de vorm heeft van een in-memory verzameling. Zorg er daarom voor dat u bij het werken met bronnen zoals JSON/XML de gegevens opmaakt in een in-memory verzameling.

Gegeven de volgende in-memory verzameling:

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

Laad de in-memory verzameling in een IDataView met de LoadFromEnumerable methode:

Belangrijk

LoadFromEnumerable wordt ervan uitgegaan dat de waaruit het IEnumerable wordt geladen thread-safe is.

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

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

Volgende stappen