Udostępnij za pośrednictwem


Ładowanie danych z plików i innych źródeł

Dowiedz się, jak ładować dane do ML.NET na potrzeby przetwarzania i trenowania przy użyciu interfejsu API. Dane są pierwotnie przechowywane w plikach lub innych źródłach danych, takich jak bazy danych, dane JSON, XML lub kolekcje w pamięci.

Jeśli używasz narzędzia Model Builder, zobacz Ładowanie danych szkoleniowych do narzędzia Model Builder.

Tworzenie modelu danych

ML.NET umożliwia definiowanie modeli danych za pomocą klas. Na przykład biorąc pod uwagę następujące dane wejściowe:

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

Utwórz model danych reprezentujący następujący fragment kodu:

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

Dodawanie adnotacji do modelu danych przy użyciu atrybutów kolumny

Atrybuty zapewniają ML.NET więcej informacji o modelu danych i źródle danych.

Atrybut LoadColumn określa indeksy kolumn właściwości.

Ważne

LoadColumn program jest wymagany tylko podczas ładowania danych z pliku.

Załaduj kolumny jako:

  • Poszczególne kolumny, takie jak Size i CurrentPrices w HousingData klasie.
  • Wiele kolumn jednocześnie w postaci wektora, na przykład HistoricalPrices w HousingData klasie.

Jeśli masz właściwość wektora, zastosuj VectorType atrybut do właściwości w modelu danych. Wszystkie elementy w wektorze muszą być tego samego typu. Utrzymywanie rozdzielonych kolumn pozwala na łatwość i elastyczność inżynierii cech, ale w przypadku dużej liczby kolumn działanie na poszczególnych kolumnach powoduje wpływ na szybkość trenowania.

ML.NET działa za pomocą nazw kolumn. Jeśli chcesz zmienić nazwę kolumny na inną niż nazwa właściwości, użyj atrybutu ColumnName . Podczas tworzenia obiektów w pamięci nadal tworzone są obiekty przy użyciu nazwy właściwości. Jednak w przypadku przetwarzania danych i tworzenia modeli uczenia maszynowego ML.NET przesłania i odwołuje się do właściwości z wartością podaną w atrybucie ColumnName .

Ładowanie danych z pojedynczego pliku

Aby załadować dane z pliku, użyj LoadFromTextFile metody z modelem danych do załadowania. Ponieważ separatorChar parametr jest domyślnie rozdzielany tabulatorami, zmień go dla pliku danych zgodnie z potrzebami. Jeśli plik ma nagłówek, ustaw hasHeader parametr , aby true zignorować pierwszy wiersz w pliku i rozpocząć ładowanie danych z drugiego wiersza.

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

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

Ładowanie danych z wielu plików

W przypadku, gdy dane są przechowywane w wielu plikach, o ile schemat danych jest taki sam, ML.NET umożliwia ładowanie danych z wielu plików, które znajdują się w tym samym katalogu lub wielu katalogach.

Ładowanie z plików w jednym katalogu

Gdy wszystkie pliki danych znajdują się w tym samym katalogu, użyj symboli wieloznacznych w metodzie LoadFromTextFile .

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

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

Ładowanie z plików w wielu katalogach

Aby załadować dane z wielu katalogów, użyj CreateTextLoader metody , aby utworzyć element TextLoader. Następnie użyj TextLoader.Load metody i określ poszczególne ścieżki plików (nie można używać symboli wieloznacznych).

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

Ładowanie danych z relacyjnej bazy danych

ML.NET obsługuje ładowanie danych z różnych relacyjnych baz danych obsługiwanych przez System.Data program SQL Server, azure SQL Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 i wiele innych.

Uwaga

Aby użyć polecenia DatabaseLoader, odwołaj się do pakietu NuGet System.Data.SqlClient .

Nadaj bazie danych z tabelą o nazwie House i następującym schematem:

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

Dane można modelować według klasy, takiej jak HouseData:

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

Następnie wewnątrz aplikacji utwórz element DatabaseLoader.

MLContext mlContext = new MLContext();

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

Zdefiniuj parametry połączenia, a także polecenie SQL do wykonania w bazie danych i utwórz DatabaseSource wystąpienie. W tym przykładzie użyto bazy danych Sql Server LocalDB ze ścieżką pliku. Jednak narzędzie DatabaseLoader obsługuje wszelkie inne prawidłowe parametry połączenia dla baz danych w środowisku lokalnym i w chmurze.

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

Dane liczbowe, które nie są typu Real , muszą być konwertowane na Real. Typ Real jest reprezentowany jako wartość zmiennoprzecinkowa o pojedynczej precyzji lub Singletyp wejściowy oczekiwany przez algorytmy ML.NET. W tym przykładzie kolumny Size i NumBed są liczbami całkowitymi w bazie danych. Za pomocą wbudowanej CAST funkcji jest ona konwertowana na Real. Price Ponieważ właściwość jest już typu Real, jest ładowana w następujący sposób.

Load Użyj metody , aby załadować dane do obiektu IDataView.

IDataView data = loader.Load(dbSource);

Ładowanie obrazów

Aby załadować dane obrazu z katalogu, najpierw utwórz model zawierający ścieżkę obrazu i etykietę. ImagePath jest ścieżką bezwzględną obrazu w katalogu źródła danych. Label jest klasą lub kategorią rzeczywistego pliku obrazu.

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

Następnie załaduj obraz:

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

Aby załadować nieprzetworzone obrazy w pamięci z katalogu, utwórz model do przechowywania tablicy bajtów i etykiet nieprzetworzonych obrazów:

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

    }
}

Ładowanie danych z innych źródeł

Oprócz ładowania danych przechowywanych w plikach ML.NET obsługuje ładowanie danych ze źródeł, które obejmują:

  • Kolekcje w pamięci
  • JSON/XML

Podczas pracy ze źródłami przesyłania strumieniowego ML.NET oczekuje, że dane wejściowe będą w postaci kolekcji w pamięci. W związku z tym podczas pracy ze źródłami, takimi jak JSON/XML, pamiętaj, aby sformatować dane w kolekcji w pamięci.

Biorąc pod uwagę następującą kolekcję w pamięci:

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

Załaduj kolekcję w pamięci do elementu IDataView za pomocą LoadFromEnumerable metody :

Ważne

LoadFromEnumerable zakłada, że IEnumerable obciążenie z niego jest bezpieczne wątkowo.

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

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

Następne kroki