Criar conjuntos de dados no Azure Machine Learning

APLICA-SE ASDK do Python azureml v1

Neste artigo, você aprenderá a criar conjuntos de dados do Azure Machine Learning a fim de acessar dados para realizar experimentos locais ou remotos com o SDK Python do Azure Machine Learning. Para entender a função dos conjuntos de dados no fluxo de trabalho geral de acesso a dados do Azure Machine Learning, consulte o artigoAcessar dados de maneira segura.

Ao criar um conjunto de dados, você cria uma referência para o local da fonte de dados com uma cópia de seus metadados. Como os dados permanecem no local existente, você não tem nenhum custo de armazenamento adicional e não arrisca a integridade de suas fontes de dados. Além disso, os conjuntos de itens são avaliados lentamente, o que auxilia nas velocidades de desempenho do fluxo de trabalho. É possível criar conjuntos de dados por meio de armazenamentos de dados, de URLs públicas e do Azure Open Datasets.

Para ter uma experiência com pouca codificação, consulte Criar conjuntos de dados do Azure Machine Learning com o Estúdio do Azure Machine Learning.

Com os conjuntos de dados do Azure Machine Learning, é possível:

  • Manter uma única cópia dos dados em seu armazenamento, referenciada pelos conjuntos de dados.

  • Acessar dados diretamente durante o treinamento do modelo sem se preocupar com cadeias de conexão ou caminhos de dados. Saiba mais sobre como treinar com conjuntos de dados.

  • Compartilhar dados e colaborar com outros usuários.

Pré-requisitos

Para criar e trabalhar com conjuntos de dados, você precisa do seguinte:

Observação

Algumas classes de conjunto de dados têm dependências no pacote azureml-dataprep, que só é compatível com Python de 64 bits. Se você estiver desenvolvendo no Linux, essas classes dependerão do .NET Core 2.1. Elas só têm suporte em distribuições específicas. Para obter mais informações sobre as distribuições com suporte, consulte a coluna .NET Core 2.1 no artigo Instalar o .NET no Linux.

Importante

Embora o pacote possa funcionar em versões mais antigas de distribuições do Linux, não é recomendável usar uma distribuição que esteja fora do suporte base. As distribuições fora do suporte base podem ter vulnerabilidades de segurança, pois não recebem as atualizações mais recentes. É recomendável usar a versão mais recente com suporte da sua distribuição que seja compatível.

Diretrizes de tamanho de computação

Ao criar um conjunto de dados, revise sua capacidade de processamento de computação e o tamanho dos seus dados na memória. O tamanho dos dados no armazenamento não é igual ao tamanho dos dados em um dataframe. Por exemplo, os dados em arquivos CSV podem ser expandidos até 10 vezes em um dataframe, de modo que um arquivo CSV de 1 GB pode chegar a 10 GB em um dataframe.

Se os dados estiverem compactados, eles poderão ser expandidos, pois 20 GB de dados relativamente esparsos armazenados no formato Parquet compactado podem ser expandidos para aproximadamente 800 GB de memória. Como os arquivos Parquet armazenam dados em um formato de coluna, se você precisar só de metade das colunas, será necessário carregar aproximadamente 400 GB de memória.

Saiba mais sobre como otimizar o processamento de dados no Azure Machine Learning.

Tipos de conjunto de dados

Há dois tipos de conjuntos de dados, com base em como os usuários os consomem no treinamento: FileDataSets e TabularDatasets. Os dois tipos podem ser usados nos fluxos de trabalho de treinamento do Azure Machine Learning, como estimadores, AutoML, hyperDrive e pipelines.

FileDataset

Um FileDataset faz referência a um ou a vários arquivos em seus armazenamentos de dados ou URLs públicas. Se seus dados já estiverem limpos e prontos para uso em experimentos de treinamento, você poderá baixar ou montar os arquivos em sua computação como um objeto FileDataset.

O FileDatasets é recomendado para seus fluxos de trabalho de machine learning, pois os arquivos de origem podem estar em qualquer formato, o que permite uma ampla variedade de cenários de machine learning, incluindo aprendizado profundo.

Crie um FileDataset com o SDK Python ou o Estúdio do Azure Machine Learning.

TabularDataset

Um TabularDataset representa dados em um formato de tabela, com base na análise dos arquivos fornecidos. Com isso, é possível materializar os dados em um Pandas ou no Dataframe do Spark para trabalhar com bibliotecas de treinamento e preparação de dados conhecidas sem precisar sair do notebook. Você pode criar um objeto TabularDataset com arquivos .csv, .tsv, .parquet, .jsonl e com os resultados da consulta SQL.

Com TabularDatasets, é possível especificar um carimbo de data/hora de uma coluna nos dados ou de onde quer que os dados de padrão de caminho estejam armazenados para habilitar uma característica de série temporal. Essa especificação permite uma filtragem fácil e eficiente ao longo do tempo. Para obter um exemplo, consulte Demonstração de API relacionada à série temporal tabular com dados meteorológicos da NOAA.

Crie um TabularDataset com o SDK Python ou o Estúdio do Azure Machine Learning.

Observação

Os fluxos de trabalho de ML automatizado gerados por meio do Estúdio do Azure Machine Learning atualmente só dão suporte a TabularDatasets.

Observação

Para TabularDatasets que geram a partir dos resultados da consulta SQL, não há suporte para T-SQL (por exemplo, subconsulta 'WITH') ou nome de coluna duplicada. Consultas complexas como o T-SQL podem causar problemas de desempenho. Nomes de coluna duplicados em um conjunto de dados podem causar problemas de ambiguidade.

Acessar conjuntos de dados em uma rede virtual

Para espaços de trabalho em redes virtuais, configure o conjunto de dados para ignorar a validação. Para obter mais informações sobre como usar armazenamentos de dados e conjuntos de dados em uma rede virtual, consulte Proteger um espaço de trabalho e os recursos associados.

Criar conjuntos de dados por meio do armazenamento de dados

Para que os dados sejam acessíveis ao Azure Machine Learning, os conjuntos de dados devem ser criados com base em caminhos nos armazenamentos de dados do Azure Machine Learning ou em URLs da web.

Dica

É possível criar conjuntos de dados diretamente a partir de URLs de armazenamento com acesso a data baseado em identidade. Saiba mais em Conectar-se ao armazenamento com o acesso a dados baseado em identidade.

Para criar conjuntos de itens por meio de um armazenamento de dados com o SDK Python:

  1. Verifique se você tem acesso contributor ou owner ao serviço de armazenamento subjacente do seu armazenamento de dados registrado do Azure Machine Learning. Verifique as permissões de sua conta de armazenamento no portal do Azure.

  2. Crie o conjunto de dados referenciando caminhos no armazenamento de dados. É possível criar um conjunto de dados a partir de diversos caminhos em diversos armazenamentos de dados. Não há nenhum limite rígido para o número de arquivos ou o tamanho dos dados a partir dos quais é possível criar um conjunto de dados.

Observação

Algumas solicitações serão enviadas ao serviço de armazenamento para verificar se cada caminho de dados aponta para um arquivo ou uma pasta. Essa sobrecarga pode levar à degradação do desempenho ou à falha. Um conjunto de dados que faz referência a uma pasta com 1000 arquivos também faz referência a um caminho de dados. Recomenda-se criar um conjunto de dados que faça referência a menos de 100 caminhos no armazenamento de dados para obter um desempenho ideal.

Criar um FileDataset

Use o método from_files() na classe FileDatasetFactory para carregar arquivos em qualquer formato e criar um FileDataset não registrado.

Se o armazenamento estiver protegido por uma rede virtual ou um firewall, defina o parâmetro validate=False em seu método from_files(). Isso ignora a etapa de validação inicial e garante que você possa criar seu conjunto de dados a partir de seus arquivos seguros. Saiba mais sobre como usar armazenamentos de dados e conjuntos de dados em uma rede virtual.

from azureml.core import Workspace, Datastore, Dataset

# create a FileDataset pointing to files in 'animals' folder and its subfolders recursively
datastore_paths = [(datastore, 'animals')]
animal_ds = Dataset.File.from_files(path=datastore_paths)

# create a FileDataset from image and label files behind public web urls
web_paths = ['https://azureopendatastorage.blob.core.windows.net/mnist/train-images-idx3-ubyte.gz',
             'https://azureopendatastorage.blob.core.windows.net/mnist/train-labels-idx1-ubyte.gz']
mnist_ds = Dataset.File.from_files(path=web_paths)

Se você quiser carregar todos os arquivos de um diretório local, crie um FileDataset em um único método com o upload_directory(). Ele carrega dados para o armazenamento subjacente, o que resulta em custos de armazenamento.

from azureml.core import Workspace, Datastore, Dataset
from azureml.data.datapath import DataPath

ws = Workspace.from_config()
datastore = Datastore.get(ws, '<name of your datastore>')
ds = Dataset.File.upload_directory(src_dir='<path to you data>',
           target=DataPath(datastore,  '<path on the datastore>'),
           show_progress=True)

Para reutilizar e compartilhar conjuntos de dados no experimento de seu espaço de trabalho, registre-os.

Criar um TabularDataset

Use o método from_delimited_files() na classe TabularDatasetFactory para ler os arquivos no formato .csv ou .tsv e criar um TabularDataset não registrado. Para ler arquivos do formato .parquet, use o método from_parquet_files(). No caso da leitura de muitos arquivos, os resultados são agregados em uma representação tabular.

Confira a documentação de referência do TabularDatasetFactory para obter informações sobre formatos de arquivo com suporte, bem como padrões de sintaxe e de design tais como o suporte multilinha.

Se o armazenamento estiver protegido por uma rede virtual ou um firewall, defina o parâmetro validate=False em seu método from_delimited_files(). Isso ignora a etapa de validação inicial e garante que você possa criar seu conjunto de dados a partir de seus arquivos seguros. Saiba mais sobre como usar armazenamentos de dados e conjuntos de dados em uma rede virtual.

O código a seguir obtém o espaço de trabalho existente e o armazenamento de dados desejado pelo nome. Em seguida, ele transfere o armazenamento de dados e os locais de arquivos para o parâmetro path a fim de criar um novo TabularDataset, weather_ds.

from azureml.core import Workspace, Datastore, Dataset

datastore_name = 'your datastore name'

# get existing workspace
workspace = Workspace.from_config()
    
# retrieve an existing datastore in the workspace by name
datastore = Datastore.get(workspace, datastore_name)

# create a TabularDataset from 3 file paths in datastore
datastore_paths = [(datastore, 'weather/2018/11.csv'),
                   (datastore, 'weather/2018/12.csv'),
                   (datastore, 'weather/2019/*.csv')]

weather_ds = Dataset.Tabular.from_delimited_files(path=datastore_paths)

Configurar o esquema de dados

Por padrão, ao criar um TabularDataset, os tipos de dados de coluna são inferidos automaticamente. Se os tipos inferidos não corresponderem às suas expectativas, atualize o esquema do conjunto de dados especificando os tipos de coluna com o código a seguir. O parâmetro infer_column_type só é aplicável a conjuntos de dados criados a partir de arquivos delimitados. Saiba mais sobre os tipos de dados suportados.

from azureml.core import Dataset
from azureml.data.dataset_factory import DataType

# create a TabularDataset from a delimited file behind a public web url and convert column "Survived" to boolean
web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path, set_column_types={'Survived': DataType.to_bool()})

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(Índice) PassengerId Survived Pclass Nome Gênero Idade SibSp Parch Tíquete Tarifa Cabine Embarcou
0 1 Falso 3 Braund, Sr. Owen Harris masculino 22,0 1 0 A/5 21171 7.2500 S
1 2 True 1 Cumings, Sra. John Bradley (Florence Briggs Th... feminino 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina feminino 26,0 0 0 STON/O2. 3101282 7.9250 S

Para reutilizar e compartilhar conjuntos de dados no experimento de seu espaço de trabalho, registre-os.

Preparação de dados

Depois de criar e registrar seu conjunto de dados, você pode carregá-lo no notebook para a preparação e a exploração de dados antes do treinamento do modelo.

Se você não precisar fazer a preparação ou a exploração de dados, consulte como consumir conjuntos de dados em seus scripts de treinamento para enviar experimentos de ML em Treinar com conjuntos de dados.

Filtrar conjuntos de dados (visualização)

Os recursos de filtragem dependem do tipo do conjunto de dados.

Importante

A filtragem de conjuntos de dados com o método de versão preliminar filter() é uma versão prévia do recurso experimental que pode ser alterado a qualquer momento.

Para TabularDatasets, você pode manter ou remover colunas com os métodos keep_columns() e drop_columns().

Para filtrar as linhas por um valor de coluna específico em um TabularDataset, use o método filter() (visualização).

Os exemplos a seguir retornam um conjunto de dados não registrado com base nas expressões especificadas.

# TabularDataset that only contains records where the age column value is greater than 15
tabular_dataset = tabular_dataset.filter(tabular_dataset['age'] > 15)

# TabularDataset that contains records where the name column value contains 'Bri' and the age column value is greater than 15
tabular_dataset = tabular_dataset.filter((tabular_dataset['name'].contains('Bri')) & (tabular_dataset['age'] > 15))

Em FileDatasets, cada linha corresponde a um caminho de arquivo, portanto, a filtragem por valor de coluna não é útil. No entanto, é possível usar filter() nas linhas para filtrar por metadados como a hora de criação, o tamanho etc.

Os exemplos a seguir retornam um conjunto de dados não registrado com base nas expressões especificadas.

# FileDataset that only contains files where Size is less than 100000
file_dataset = file_dataset.filter(file_dataset.file_metadata['Size'] < 100000)

# FileDataset that only contains files that were either created prior to Jan 1, 2020 or where 
file_dataset = file_dataset.filter((file_dataset.file_metadata['CreatedTime'] < datetime(2020,1,1)) | (file_dataset.file_metadata['CanSeek'] == False))

Os conjuntos de dados rotulados criados por meio dos projetos de rotulagem de dados são um caso particular. Eles são um tipo de TabularDataset composto por arquivos de imagem. Para esses tipos de conjuntos de dados, você pode usar filter() nas imagens para filtrar por metadados e por valores de coluna como label e image_details.

# Dataset that only contains records where the label column value is dog
labeled_dataset = labeled_dataset.filter(labeled_dataset['label'] == 'dog')

# Dataset that only contains records where the label and isCrowd columns are True and where the file size is larger than 100000
labeled_dataset = labeled_dataset.filter((labeled_dataset['label']['isCrowd'] == True) & (labeled_dataset.file_metadata['Size'] > 100000))

Dados de partição

Você pode particionar um conjunto de dados incluindo o parâmetro partitions_format ao criar um TabularDataset ou FileDataset.

Quando você particiona um conjunto de dados, as informações de partição de cada caminho de arquivo são extraídas em colunas com base no formato especificado. O formato deve começar da posição da primeira chave de partição até o final do caminho do arquivo.

Por exemplo, dado o caminho ../Accounts/2019/01/01/data.jsonl em que a partição é por nome de departamento e hora, o partition_format='/{Department}/{PartitionDate:yyyy/MM/dd}/data.jsonl' cria uma coluna de cadeia de caracteres "Department" com o valor "Accounts" e uma coluna datetime "PartitionDate" com o valor 2019-01-01.

Se os dados já tiverem partições existentes e você quiser preservar esse formato, inclua o parâmetro partitioned_format em seu método from_files() para criar um FileDataset.

Para criar um TabularDataset que preserva as partições existentes, inclua o parâmetro partitioned_format no método from_parquet_files() ou from_delimited_files().

O exemplo a seguir,

  • Cria um FileDataset com arquivos particionados.
  • Obtém as chaves de partição
  • Cria um novo FileDataset indexado usando

file_dataset = Dataset.File.from_files(data_paths, partition_format = '{userid}/*.wav')
ds.register(name='speech_dataset')

# access partition_keys
indexes = file_dataset.partition_keys # ['userid']

# get all partition key value pairs should return [{'userid': 'user1'}, {'userid': 'user2'}]
partitions = file_dataset.get_partition_key_values()


partitions = file_dataset.get_partition_key_values(['userid'])
# return [{'userid': 'user1'}, {'userid': 'user2'}]

# filter API, this will only download data from user1/ folder
new_file_dataset = file_dataset.filter(ds['userid'] == 'user1').download()

Você também pode criar uma nova estrutura de partições para TabularDatasets com o método partitions_by().


 dataset = Dataset.get_by_name('test') # indexed by country, state, partition_date

# call partition_by locally
new_dataset = ds.partition_by(name="repartitioned_ds", partition_keys=['country'], target=DataPath(datastore, "repartition"))
partition_keys = new_dataset.partition_keys # ['country']

Explorar dados

Depois de concluir a preparação de dados, você pode registrar seu conjunto de dados e carregá-lo em seu notebook para a exploração dos dados antes do treinamento do modelo.

Para FileDatasets, você pode montar ou baixar seu conjunto de dados, além de aplicar as bibliotecas Python que normalmente seriam usadas para a exploração de dados. Saiba mais sobre montagem vs download.

# download the dataset 
dataset.download(target_path='.', overwrite=False) 

# mount dataset to the temp directory at `mounted_path`

import tempfile
mounted_path = tempfile.mkdtemp()
mount_context = dataset.mount(mounted_path)

mount_context.start()

Para TabularDatasets, use o método to_pandas_dataframe() a fim de exibir seus dados em um dataframe.

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(Índice) PassengerId Survived Pclass Nome Gênero Idade SibSp Parch Tíquete Tarifa Cabine Embarcou
0 1 Falso 3 Braund, Sr. Owen Harris masculino 22,0 1 0 A/5 21171 7.2500 S
1 2 True 1 Cumings, Sra. John Bradley (Florence Briggs Th... feminino 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina feminino 26,0 0 0 STON/O2. 3101282 7.9250 S

Criar um conjunto de dados a partir de um dataframe do Pandas

Para criar um TabularDataset de um dataframe pandas na memória, use o método register_pandas_dataframe(). Esse método registra o TabularDataset no workspace e carrega dados no armazenamento subjacente, o que incorre em custos de armazenamento.

from azureml.core import Workspace, Datastore, Dataset
import pandas as pd

pandas_df = pd.read_csv('<path to your csv file>')
ws = Workspace.from_config()
datastore = Datastore.get(ws, '<name of your datastore>')
dataset = Dataset.Tabular.register_pandas_dataframe(pandas_df, datastore, "dataset_from_pandas_df", show_progress=True)

Dica

Crie e registre um TabularDataset de um dataframe do Spark ou do Dask na memória com métodos de visualização pública register_spark_dataframe() e register_dask_dataframe(). Esses métodos são uma versão prévia experimental do recurso, e podem ser alterados a qualquer momento.

Eles carregam dados para o armazenamento subjacente, o que resulta em custos de armazenamento.

Registrar conjuntos de dados

Para concluir o processo de criação, registre seus conjuntos de dados com um espaço de trabalho. Use o método register() para registrar conjuntos de dados em seu espaço de trabalho a fim de compartilhá-los com outras pessoas e reutilizá-los em experimentos no espaço de trabalho:

titanic_ds = titanic_ds.register(workspace=workspace,
                                 name='titanic_ds',
                                 description='titanic training data')

Criar conjuntos de dados com o Azure Resource Manager

Há muitos modelos em https://github.com/Azure/azure-quickstart-templates/tree/master//quickstarts/microsoft.machinelearningservices que podem ser usados para criar conjuntos de dados.

Para saber mais sobre como usar esses modelos, consulte Usar um modelo do Azure Resource Manager para criar um espaço de trabalho para o Azure Machine Learning.

Treinar com conjuntos de dados

Use seus conjuntos de dados em experimentos de machine learning para o treinamento de modelos de ML. Saiba mais sobre como treinar com conjuntos de dados.

Versões de conjunto de dados

Você pode registrar um novo conjunto de dados com o mesmo nome criando uma nova versão. O controle de versão de conjunto de dados é uma maneira de indicar o estado de seus dados de forma que você possa aplicar uma versão específica do conjunto de dados para experimentos ou reproduções futuras. Saiba mais sobre as versões de conjunto de dados.

# create a TabularDataset from Titanic training data
web_paths = ['https://dprepdata.blob.core.windows.net/demo/Titanic.csv',
             'https://dprepdata.blob.core.windows.net/demo/Titanic2.csv']
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_paths)

# create a new version of titanic_ds
titanic_ds = titanic_ds.register(workspace = workspace,
                                 name = 'titanic_ds',
                                 description = 'new titanic training data',
                                 create_new_version = True)

Próximas etapas