Laden von Daten aus Dateien und anderen QuellenLoad data from files and other sources

Diese Anleitung zeigt Ihnen, wie Sie Daten mithilfe der API für die Verarbeitung und das Training in ML.NET laden.Learn how to load data for processing and training into ML.NET using the API. Die Daten werden ursprünglich in Dateien oder anderen Datenquellen wie Datenbanken, JSON, XML oder In-Memory-Sammlungen gespeichert.The data is originally stored in files or other data sources such as databases, JSON, XML or in-memory collections.

Wenn Sie den Modell-Generator verwenden, finden Sie weitere Informationen unter Laden von Trainingsdaten in den Modell-Generator.If you're using Model Builder, see Load training data into Model Builder.

Erstellen des DatenmodellsCreate the data model

Mit ML.NET können Sie Datenmodelle über Klassen definieren.ML.NET enables you to define data models via classes. Nehmen wir zum Beispiel die folgenden Eingabedaten:For example, given the following input data:

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

Erstellen Sie ein Datenmodell, das den folgenden Codeausschnitt darstellt:Create a data model that represents the snippet below:

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

Kommentieren des Datenmodells mit SpaltenattributenAnnotating the data model with column attributes

Attribute geben ML.NET mehr Informationen über das Datenmodell und die Datenquelle.Attributes give ML.NET more information about the data model and the data source.

Das LoadColumn-Attribut gibt die Spaltenindizes Ihrer Eigenschaften an.The LoadColumn attribute specifies your properties' column indices.

Wichtig

LoadColumn ist nur erforderlich, wenn Daten aus einer Datei geladen werden.LoadColumn is only required when loading data from a file.

Spalten werden folgendermaßen geladen:Load columns as:

  • Als Einzelspalten, wie Size und CurrentPrices in der HousingData-Klasse.Individual columns like Size and CurrentPrices in the HousingData class.
  • In mehreren Spalten gleichzeitig in Form eines Vektors wie HistoricalPrices in der HousingData-Klasse.Multiple columns at a time in the form of a vector like HistoricalPrices in the HousingData class.

Wenn Sie eine Vektoreigenschaft haben, wenden Sie das VectorType-Attribut auf die Eigenschaft in Ihrem Datenmodell an.If you have a vector property, apply the VectorType attribute to the property in your data model. Dabei ist zu beachten, dass alle Elemente im Vektor vom gleichen Typ sein müssen.It's important to note that all of the elements in the vector need to be the same type. Die Trennung der Spalten ermöglicht einfaches und flexibles Merkmalsengineering, aber bei einer sehr großen Anzahl von Spalten führt die Bearbeitung der einzelnen Spalten zu einem negativen Einfluss auf die Trainingsgeschwindigkeit.Keeping the columns separated allows for ease and flexibility of feature engineering, but for a very large number of columns, operating on the individual columns causes an impact on training speed.

ML.NET arbeitet mit Spaltennamen.ML.NET Operates through column names. Wenn die Spalte einen anderen Namen als den Eigenschaftsnamen haben soll, verwenden Sie das ColumnName-Attribut.If you want to change the name of a column to something other than the property name, use the ColumnName attribute. Beim Erstellen von In-Memory-Objekten erstellen Sie Objekte weiterhin unter Verwendung des Eigenschaftsnamens.When creating in-memory objects, you still create objects using the property name. Für die Datenverarbeitung und die Erstellung von Machine Learning-Modellen überschreibt und referenziert ML.NET jedoch die Eigenschaft mit dem im ColumnName-Attribut angegebenen Wert.However, for data processing and building machine learning models, ML.NET overrides and references the property with the value provided in the ColumnName attribute.

Laden von Daten aus einer EinzeldateiLoad data from a single file

Um Daten aus einer Datei zu laden, verwenden Sie die LoadFromTextFile-Methode zusammen mit dem Datenmodell für die zu ladenden Daten.To load data from a file use the LoadFromTextFile method along with the data model for the data to be loaded. Da der separatorChar-Parameter standardmäßig mit Tabstopptrennzeichen getrennt ist, ändern Sie ihn bei Bedarf für Ihre Datendatei.Since separatorChar parameter is tab-delimited by default, change it for your data file as needed. Wenn Ihre Datei einen Header hat, setzen Sie den hasHeader-Parameter auf true, um die erste Zeile in der Datei zu ignorieren und mit dem Laden von Daten aus der zweiten Zeile zu beginnen.If your file has a header, set the hasHeader parameter to true to ignore the first line in the file and begin to load data from the second line.

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

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

Laden von Daten aus mehreren DateienLoad data from multiple files

Wenn Ihre Daten in mehreren Dateien gespeichert sind, können Sie mit ML.NET Daten aus mehreren Dateien laden, die sich entweder im gleichen Verzeichnis oder in mehreren Verzeichnissen befinden, solange das Datenschema gleich ist.In the event that your data is stored in multiple files, as long as the data schema is the same, ML.NET allows you to load data from multiple files that are either in the same directory or multiple directories.

Laden von Dateien in einem einzigen VerzeichnisLoad from files in a single directory

Wenn sich alle Ihre Datendateien im gleichen Verzeichnis befinden, verwenden Sie in der LoadFromTextFile-Methode Platzhalter.When all of your data files are in the same directory, use wildcards in the LoadFromTextFile method.

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

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

Laden von Dateien in mehreren VerzeichnissenLoad from files in multiple directories

Um Daten aus mehreren Verzeichnissen zu laden, verwenden Sie die CreateTextLoader-Methode, um einen TextLoader zu erstellen.To load data from multiple directories, use the CreateTextLoader method to create a TextLoader. Verwenden Sie dann die TextLoader.Load-Methode, und geben Sie die einzelnen Dateipfade an (Platzhalter können nicht verwendet werden).Then, use the TextLoader.Load method and specify the individual file paths (wildcards can't be used).

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

Laden von Daten aus einer relationalen DatenbankLoad data from a relational database

ML.NET unterstützt das Laden von Daten aus einer Vielzahl von relationalen Datenbanken, die von System.Data unterstützt werden, darunter SQL Server, Azure SQL-Datenbank, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 und viele mehr.ML.NET supports loading data from a variety of relational databases supported by System.Data that include SQL Server, Azure SQL Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2, and many more.

Hinweis

Um DatabaseLoaderzu verwenden, verweisen Sie auf das NuGet-Paket System. Data. SqlClient.To use DatabaseLoader, reference the System.Data.SqlClient NuGet package.

Bei einer Datenbank mit einer Tabelle mit dem Namen House und dem folgenden Schema:Given a database with a table named House and the following 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])
);

Die Daten können durch eine Klasse wie HouseData modelliert werden.The data can be modeled by a class like HouseData.

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

    public float NumBed { get; set; }

    public float Price { get; set; }
}

Erstellen Sie dann in der Anwendung eine DatabaseLoader-Klasse.Then, inside of your application, create a DatabaseLoader.

MLContext mlContext = new MLContext();

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

Definieren Sie die Verbindungszeichenfolge sowie den SQL-Befehl, der für die Datenbank ausgeführt werden soll, und erstellen Sie eine DatabaseSource-Instanz.Define your connection string as well as the SQL command to be executed on the database and create a DatabaseSource instance. Dieses Beispiel verwendet eine LocalDB-SQL Server-Datenbank mit einem Dateipfad.This sample uses a LocalDB SQL Server database with a file path. DatabaseLoader unterstützt jedoch jede andere gültige Verbindungszeichenfolge für lokale Datenbanken und Clouddatenbanken.However, DatabaseLoader supports any other valid connection string for databases on-premises and in the cloud.

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

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

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

Numerische Daten, die nicht vom Typ Real sind, müssen in Real konvertiert werden.Numerical data that is not of type Real has to be converted to Real. Der Real-Typ wird als Gleitkommawert mit einfacher Genauigkeit oder Single dargestellt (der von ML.NET-Algorithmen erwartete Eingabetyp).The Real type is represented as a single-precision floating-point value or Single, the input type expected by ML.NET algorithms. In diesem Beispiel ist die Spalte NumBed eine ganze Zahl in der Datenbank.In this sample, the NumBed column is an integer in the database. Mithilfe der integrierten Funktion CAST wird sie in Real konvertiert.Using the CAST built-in function, it's converted to Real. Da die Price-Eigenschaft bereits vom Typ Real ist, wird sie unverändert geladen.Because the Price property is already of type Real it is loaded as is.

Verwenden Sie die Load-Methode, um die Daten in ein IDataView-Element zu laden.Use the Load method to load the data into an IDataView.

IDataView data = loader.Load(dbSource);

Laden von Daten aus anderen QuellenLoad data from other sources

Zusätzlich zum Laden von Daten, die in Dateien gespeichert sind, unterstützt ML.NET das Laden von Daten aus verschiedenen Quellen, wie zum Beispiel:In addition to loading data stored in files, ML.NET supports loading data from sources that include but are not limited to:

  • In-Memory-SammlungenIn-memory collections
  • JSON/XMLJSON/XML

Beachten Sie, dass ML.NET bei der Arbeit mit Streamingquellen erwartet, dass die Eingabe in Form einer In-Memory-Sammlung erfolgt.Note that when working with streaming sources, ML.NET expects input to be in the form of an in-memory collection. Achten Sie daher bei der Arbeit mit Quellen wie JSON/XML darauf, die Daten in eine In-Memory-Sammlung zu formatieren.Therefore, when working with sources like JSON/XML, make sure to format the data into an in-memory collection.

Schauen Sie sich die folgende in-Memory-Sammlung an:Given the following in-memory collection:

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

Laden Sie die in-Memory-Sammlung mit der LoadFromEnumerable-Methode in eine IDataView:Load the in-memory collection into an IDataView with the LoadFromEnumerable method:

Wichtig

LoadFromEnumerable geht davon aus, dass das IEnumerable-Element, aus dem es geladen wird, threadsicher ist.LoadFromEnumerable assumes that the IEnumerable it loads from is thread-safe.

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

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

Nächste SchritteNext steps