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
eCurrentPrices
naHousingData
classe. - Várias colunas ao mesmo tempo na forma de um vetor, como
HistoricalPrices
naHousingData
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 TextLoader
arquivo . 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 DatabaseLoader
o , 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 DatabaseLoader
arquivo .
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 IDataView
arquivo .
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
- Para limpar ou processar dados, consulte Preparar dados para criar um modelo.
- Quando estiver pronto para criar um modelo, consulte Treinar e avaliar um modelo.