Partilhar via


Carregar dados de arquivos e outras fontes

Saiba como carregar dados no ML.NET para processamento e treinamento, usando a API. Os dados são originalmente armazenados em arquivos ou outras fontes de dados, como bancos de dados, JSON, XML ou coleções na memória.

Se você estiver usando o Construtor de Modelos, consulte Carregar dados de treinamento no Construtor de Modelos.

Criar o modelo de dados

ML.NET permite definir modelos de dados por meio de classes. Por exemplo, tendo em conta os seguintes dados de entrada:

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

Crie um modelo de dados que represente o seguinte trecho:

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

Anotar o modelo de dados com atributos de coluna

Os atributos fornecem ML.NET mais informações sobre o modelo de dados e a fonte de dados.

O LoadColumn atributo especifica os índices de coluna das suas propriedades.

Importante

LoadColumn só é necessário ao carregar dados de um ficheiro.

Carregue colunas como:

  • Colunas individuais, como Size e CurrentPrices na HousingData classe.
  • Várias colunas ao mesmo tempo na forma de um vetor, como HistoricalPrices na HousingData classe.

Se você tiver uma propriedade de vetor, aplique o VectorType atributo à propriedade em seu modelo de dados. Todos os elementos no vetor devem ser do mesmo tipo. Manter as colunas separadas permite facilidade e flexibilidade na engenharia de recursos, mas para um grande número de colunas, operar nas colunas individuais causa um impacto na velocidade de treinamento.

ML.NET opera através de nomes de colunas. Se você quiser alterar o nome de uma coluna para algo diferente do nome da propriedade, use o ColumnName atributo. Ao criar objetos na memória, você ainda cria objetos usando o nome da propriedade. No entanto, para processamento de dados e criação de modelos de aprendizado de máquina, ML.NET substitui e faz referência à propriedade com o valor fornecido no ColumnName atributo.

Carregar dados de um único arquivo

Para carregar dados de um arquivo, use o LoadFromTextFile método com o modelo de dados para os dados a serem carregados. Como separatorChar o parâmetro é delimitado por tabulação por padrão, altere-o para seu arquivo de dados conforme necessário. Se o arquivo tiver um cabeçalho, defina o hasHeader parâmetro para true ignorar a primeira linha do arquivo e comece a carregar dados da segunda linha.

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

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

Carregar dados de vários arquivos

No caso de seus dados serem armazenados em vários arquivos, desde que o esquema de dados seja o mesmo, ML.NET permite que você carregue dados de vários arquivos que estão no mesmo diretório ou em vários diretórios.

Carregar a partir de ficheiros num único diretório

Quando todos os seus arquivos de dados estiverem no mesmo diretório, use curingas no LoadFromTextFile método.

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

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

Carregar a partir de arquivos em vários diretórios

Para carregar dados de vários diretórios, use o CreateTextLoader método para criar um TextLoaderarquivo . Em seguida, use o TextLoader.Load método e especifique os caminhos de arquivo individuais (curingas não podem ser usados).

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

Carregar dados de um banco de dados relacional

ML.NET suporta o carregamento de dados de uma variedade de bancos de dados relacionais suportados por System.Data isso, incluindo SQL Server, Banco de Dados SQL do Azure, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 e muito mais.

Nota

Para usar DatabaseLoadero , consulte o pacote NuGet System.Data.SqlClient .

Dado um banco de dados com uma tabela nomeada House e o seguinte esquema:

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

Os dados podem ser modelados por uma classe como HouseData:

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

Em seguida, dentro do seu aplicativo, crie um DatabaseLoaderarquivo .

MLContext mlContext = new MLContext();

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

Defina sua cadeia de conexão, bem como o comando SQL a ser executado no banco de dados e crie uma DatabaseSource instância. Este exemplo usa um banco de dados LocalDB SQL Server com um caminho de arquivo. No entanto, DatabaseLoader suporta qualquer outra cadeia de conexão válida para bancos de dados locais e na nuvem.

Importante

A Microsoft recomenda que você use o fluxo de autenticação mais seguro disponível. Se você estiver se conectando ao SQL do Azure, as Identidades Gerenciadas para recursos do Azure serão o método de autenticação recomendado.

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

Os dados numéricos que não são do tipo Real devem ser convertidos em Real. O Real tipo é representado como um valor de ponto flutuante de precisão única ou Single, o tipo de entrada esperado por ML.NET algoritmos. Neste exemplo, as Size colunas e NumBed são inteiros no banco de dados. Usando a CAST função integrada, ele é convertido em Real. Como a Price propriedade já é do tipo Real, ela é carregada como está.

Use o Load método para carregar os dados em um IDataViewarquivo .

IDataView data = loader.Load(dbSource);

Carregar imagens

Para carregar dados de imagem de um diretório, primeiro crie um modelo que inclua o caminho da imagem e um rótulo. ImagePath é o caminho absoluto da imagem no diretório da fonte de dados. Label é a classe ou categoria do arquivo de imagem real.

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

Em seguida, carregue a imagem:

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

Para carregar imagens brutas na memória do diretório, crie um modelo para armazenar a matriz de bytes de imagem bruta e o rótulo:

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

    }
}

Carregar dados de outras fontes

Além de carregar dados armazenados em arquivos, ML.NET suporta o carregamento de dados de fontes que incluem:

  • Coleções na memória
  • JSON/XML

Ao trabalhar com fontes de streaming, ML.NET espera que a entrada seja na forma de uma coleção na memória. Portanto, ao trabalhar com fontes como JSON/XML, certifique-se de formatar os dados em uma coleção na memória.

Dada a seguinte coleção na memória:

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

Carregue a coleção na memória em um IDataView com o LoadFromEnumerable método:

Importante

LoadFromEnumerable assume que o IEnumerable it carrega a partir é thread-safe.

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

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

Próximos passos