Compartir vía


Creación de conjuntos de datos de Azure Machine Learning

SE APLICA A: SDK de Python azureml v1

En este artículo aprenderá a crear conjuntos de datos de Azure Machine Learning para acceder a los datos de los experimentos locales o remotos con el SDK de Python de Azure Machine Learning. Para obtener más información sobre cómo encajan los conjuntos de datos en el flujo de trabajo general de acceso a datos de Azure Machine Learning, visite el artículo Datos de acceso seguro.

Cuando se crea un conjunto de datos, se crea una referencia a la ubicación del origen de datos, junto con una copia de sus metadatos. Dado que los datos permanecen en su ubicación existente, no incurre en ningún costo de almacenamiento adicional ni arriesga la integridad de los orígenes de datos. Además, los conjuntos de datos se evalúan de forma diferida, lo que ayuda a mejorar las velocidades de rendimiento del flujo de trabajo. Puede crear conjuntos de datos a partir de almacenes de datos, direcciones URL públicas y Azure Open Datasets. Para obtener información sobre una experiencia de programación con poco código, visite Creación de conjuntos de datos de Azure Machine Learning con Estudio de Azure Machine Learning.

Con los conjuntos de datos de Azure Machine Learning, puede:

  • Mantener una sola copia de los datos en el almacenamiento, a la que hacen referencia los conjuntos de datos.

  • Acceder sin problemas a los datos durante el entrenamiento de un modelo, sin preocuparse por la ruta de acceso a los datos ni por las cadenas de conexión. Para más información sobre el entrenamiento de conjuntos de datos, consulte Más información sobre cómo entrenar con conjuntos de datos.

  • Compartir datos y colaborar con otros usuarios

Importante

Los elementos en este artículo marcados como "versión preliminar" se encuentran actualmente en una versión preliminar pública. Se ofrece la versión preliminar sin Acuerdo de Nivel de Servicio y no se recomienda para cargas de trabajo de producción. Es posible que algunas características no sean compatibles o que tengan sus funcionalidades limitadas. Para más información, consulte Términos de uso complementarios de las Versiones Preliminares de Microsoft Azure.

Requisitos previos

Para crear y trabajar con conjuntos de datos, necesita:

Nota:

Algunas clases de conjunto de tipos tienen dependencias en el paquete azureml-dataprep, que solo es compatible con Python de 64 bits. Si desarrolla en Linux, estas clases se basan en .NET Core 2.1 y solo las distribuciones específicas las admiten. Para obtener más información sobre las distribuciones admitidas, consulte la columna sobre .NET Core 2.1 en el artículo Instalación de .NET en Linux.

Importante

Aunque el paquete puede funcionar en versiones anteriores de distribuciones de Linux, no se recomienda usar una distribución fuera del soporte estándar. Las distribuciones que están fuera del soporte estándar pueden tener vulnerabilidades de seguridad porque no reciben las actualizaciones más recientes. Se recomienda usar la versión admitida más reciente de la distribución que sea compatible con .

Orientación sobre el tamaño de proceso

Cuando cree un conjunto de datos, revise su capacidad de procesamiento y el tamaño de los datos en memoria. El tamaño de los datos en el almacenamiento no es el mismo que en una trama de datos. Por ejemplo, los datos de los archivos CSV se pueden expandir hasta 10 veces en un dataframe, por lo que un archivo CSV de 1 GB puede convertirse en 10 GB en un dataframe.

Los datos comprimidos se pueden expandir aún más. Veinte GB de datos relativamente dispersos almacenados en un formato Parquet comprimido pueden expandirse hasta usar aproximadamente 800 GB en memoria. Dado que los archivos Parquet almacenan los datos en un formato de columnas, si solo necesita la mitad de las columnas, solo tiene que cargar aproximadamente 400 GB en la memoria.

Para obtener más información, consulte Más información sobre cómo optimizar el procesamiento de datos en Azure Machine Learning.

Tipos de conjuntos de datos

Existen dos tipos de conjuntos de datos según el modo en que los usuarios los consumen en el entrenamiento: FileDatasets y TabularDatasets. Los flujos de trabajo de entrenamiento de Azure Machine Learning que implican estimadores, AutoML, HyperDrive y canalizaciones pueden usar ambos tipos.

FileDataset

FileDataset hace referencia a uno o varios archivos de los almacenes de datos o direcciones URL públicas. Si los datos ya están limpios y listos para usar en experimentos de entrenamiento, puede descargar o montar los archivos en el proceso como un objeto FileDataset.

Se recomienda FileDatasets para los flujos de trabajo de aprendizaje automático, ya que los archivos de origen pueden tener cualquier formato. Esto permite una gama mayor de escenarios de aprendizaje automático, lo que incluye el aprendizaje profundo.

Cree un objeto FileDataset con el SDK de Python o Estudio de Azure Machine Learning.

TabularDataset

TabularDataset analiza el archivo o la lista de archivos proporcionados para representar los datos en un formato tabular. A continuación, puede materializar los datos en un dataframe de Pandas o Spark para que pueda trabajar con bibliotecas conocidas de entrenamiento y preparación de datos sin tener que salir del cuaderno. Puede crear un objeto TabularDataset a partir de archivos .csv, .tsv, .parquet, archivos de líneas .json, así como de los resultados de una consulta SQL.

Con los objetos TabularDataset, puede especificar una marca de tiempo desde una columna de los datos o desde la ubicación en que estén almacenados los datos del patrón de ruta de acceso para habilitar un rasgo de la serie temporal. Esta especificación permite filtrar de forma fácil y eficaz por hora. Para ver un ejemplo, visite Demostración de la API relacionada con una serie temporal tabular con datos meteorológicos de NOAA.

Cree un objeto TabularDataset con el SDK de Python o Azure Machine Learning Studio.

Nota

Los flujos de trabajo de AutoML que se generan mediante Estudio de Azure Machine Learning actualmente solo admiten objetos TabularDataset.

Además, para TabularDatasets generados a partir de los resultados de la consulta SQL, no se admiten los T-SQL (por ejemplo, subconsulta 'WITH') ni los nombres de columna duplicados. Las consultas T-SQL complejas pueden causar problemas de rendimiento. Los nombres de columna duplicados de un conjunto de datos pueden provocar problemas de ambigüedad.

Obtener acceso a los conjuntos de valores de una red virtual

Si el área de trabajo está ubicada en una red virtual, debe configurar el conjunto de datos para omitir la validación. Para obtener más información sobre cómo usar los almacenes de datos y los conjuntos de datos en una red virtual, visite Protección de un área de trabajo y los recursos asociados.

Creación de conjuntos de datos a partir de almacenes de datos

Para que Azure Machine Learning pueda acceder a los datos, debe crear conjuntos de datos a partir de rutas de acceso en direcciones URL web o almacenes de datos de Azure Machine Learning.

Sugerencia

Puede crear conjuntos de datos directamente desde las direcciones URL de almacenamiento con el acceso a datos basado en identidad. Para obtener más información, visite Conexión al almacenamiento con acceso a datos basado en identidades.

Para crear conjuntos de datos a partir de un almacén de datos con el SDK para Python:

  1. Compruebe que tiene acceso de contributor u owner al servicio de almacenamiento subyacente del almacén de datos de Azure Machine Learning registrado. Compruebe los permisos de la cuenta de almacenamiento en Azure Portal.

  2. Cree el conjunto de datos mediante referencias a rutas de acceso en el almacén de datos. Puede crear un conjunto de datos a partir de varias rutas de acceso en varios almacenes de datos. No hay ningún límite estricto en el número de archivos ni el tamaño de los datos a partir de los cuales puede crear un conjunto de datos.

Nota:

Para cada ruta de acceso de datos, se enviarán algunas solicitudes al servicio de almacenamiento para comprobar si dicha ruta dirige a un archivo o a una carpeta. Esta sobrecarga puede provocar una disminución del rendimiento o un error. Un conjunto de datos que hace referencia a una carpeta con 1000 archivos se considera que hace referencia a una ruta de acceso a datos. Para obtener un rendimiento óptimo, se recomienda crear un conjunto de datos que haga referencia a menos de 100 rutas de acceso en almacenes de datos.

Creación de un objeto FileDataset

Use el método from_files() en la clase FileDatasetFactory para cargar archivos en cualquier formato y crear un objeto FileDataset sin registrar.

Si el almacenamiento está detrás de un firewall o una red virtual, establezca el parámetro validate=False en el método from_files(). Esto omite el paso de validación inicial y garantiza que se pueda crear el conjunto de datos a partir de estos archivos seguros. Para obtener más información, visite Uso de almacenes de datos y conjuntos de datos en una red virtual.

from azureml.core import Workspace, Datastore, Dataset

# create a FileDataset recursively pointing to files in 'animals' folder and its subfolder
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)

Para cargar todos los archivos desde un directorio local, cree un objeto FileDataset en un único método con upload_directory(). Este método carga los datos en el almacenamiento subyacente y, como resultado, incurre en costos de almacenamiento.

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 y compartir conjuntos de datos en experimentos en el área de trabajo, registre el conjunto de datos.

Creación de un objeto TabularDataset

Use el método from_delimited_files() en la clase TabularDatasetFactory para leer archivos en los formatos .csv o .tsv, y crear una clase TabularDataset sin registrar. Para leer archivos en formato .parquet, use el método from_parquet_files(). Si se lee de varios archivos, los resultados se agregan en una representación tabular.

Para obtener información sobre los formatos de archivo admitidos, visite la documentación de referencia de TabularDatasetFactory, así como información sobre modelos de diseño y sintaxis, como la compatibilidad con varias líneas.

Si el almacenamiento está detrás de un firewall o una red virtual, establezca el parámetro validate=False en el método from_delimited_files(). Esto omite el paso de validación inicial y garantiza que se pueda crear el conjunto de datos a partir de estos archivos seguros. Para obtener más información sobre los recursos de almacenamiento de datos detrás de una red virtual o un firewall, visite almacenes de datos y conjuntos de datos en una red virtual.

Este código obtiene el área de trabajo existente y el almacén de datos deseado por nombre. A continuación, pasa las ubicaciones del almacén de datos y los archivos al parámetro path para crear un nuevo objeto TabularDataset llamado 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)

Esquema del conjunto de datos

Al crear un objeto TabularDataset, los tipos de datos de las columnas se deducen automáticamente. Si los tipos deducidos no coinciden con los esperados, puede especificar los tipos de columna con el código siguiente para actualizar el conjunto de datos. El parámetro infer_column_type solo es aplicable a los conjuntos de datos creados a partir de archivos delimitados. Para obtener más información, visite Más información sobre los tipos de datos admitidos.

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 Nombre Sex Age SibSp Parch Vale Fare Cabin Embarked
0 1 False 3 Braund, Mr. Owen Harris hombre 22,0 1 0 A/5 21171 7,2500 S
1 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Th... mujer 38,0 1 0 PC 17599 71,2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina mujer 26,0 0 0 STON/O2. 3101282 7,9250 S

Para reutilizar y compartir conjuntos de datos en experimentos en el área de trabajo, registre el conjunto de datos.

Limpieza y transformación de datos

Después de crear y registrar el conjunto de datos, puede cargarlo en el cuaderno para la limpieza y transformación de datos y su exploración antes del entrenamiento del modelo. Es posible que no necesite realizar ninguna limpieza y transformación de datos. En ese caso, para obtener más información sobre cómo consumir conjuntos de datos en los scripts de entrenamiento para envíos de experimentos de ML, visite Entrenamiento con conjuntos de datos.

Filtrado de conjuntos de datos (versión preliminar)

Las funcionalidades de filtrado dependen del tipo de conjunto de datos que tenga.

Importante

El filtrado de conjuntos de datos con el método de versión preliminar filter() es una característica en versión preliminar experimental y puede cambiar en cualquier momento.

En el caso de TabularDatasets, puede conservar o quitar columnas con los métodos keep_columns() y drop_columns().

Para filtrar las filas por un valor de columna específico en TabularDataset, use el método filter() (versión preliminar).

Estos ejemplos devuelven un conjunto de datos no registrado basado en las expresiones 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))

En FileDatasets, cada fila corresponde a una ruta de acceso de un archivo, por lo que el filtrado por el valor de columna no resulta útil. Sin embargo, puede usar el método filter() para filtrar las filas por metadatos (por ejemplo, CreationTime, Size, etc.). Estos ejemplos devuelven un conjunto de datos no registrado basado en las expresiones 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))

Los conjuntos de datos con etiqueta creados a partir de proyectos de etiquetado de imágenes son un caso especial. Estos conjuntos de datos son un tipo de TabularDataset formado por archivos de imagen. Con estos conjuntos de datos, puede usar el método filter() para filtrar imágenes por metadatos y por valores de columna como label y 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))

Partición de datos

Para crear particiones de un conjunto de datos, incluya el parámetro partitions_format al crear un objeto TabularDataset o FileDataset.

Al particionar un conjunto de datos, la información de partición de cada ruta de acceso de archivo se extrae en columnas según el formato especificado. El formato debe empezar en la posición de la primera clave de partición hasta el final de la ruta de acceso del archivo.

Por ejemplo, dada la ruta de acceso ../Accounts/2019/01/01/data.jsonl, en la que la partición es por nombre de departamento y hora, partition_format='/{Department}/{PartitionDate:yyyy/MM/dd}/data.jsonl' crea una columna de cadena "Department" con el valor "Accounts" y una columna de fecha y hora "PartitionDate" con el valor 2019-01-01.

Si ya existen particiones de los datos y quiere conservar ese formato, incluya el parámetro partitioned_format en el método from_files() para crear un objeto FileDataset.

Para crear un objeto TabularDataset que conserve las particiones existentes, incluya el parámetro partitioned_format en el método from_parquet_files() o from_delimited_files().

Este ejemplo

  • Crea un objeto FileDataset a partir de archivos con particiones.
  • Se obtienen las claves de particiones.
  • Crea un nuevo objeto FileDataset indexado.

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

También puede crear una nueva estructura de particiones para objetos TabularDataset con el 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']

Exploración de datos

Después de haber realizado la limpieza y transformación de datos, puede registrar el conjunto de datos y, luego, cargarlo en el cuaderno para explorar los datos antes del entrenamiento del modelo.

En el caso de FileDatasets, puede montar o descargar su conjunto de datos y aplicar las bibliotecas de Python que usaría normalmente para la exploración de datos. Para obtener más información, visite Más información sobre montaje frente a descarga.

# 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()

En el caso de TabularDatasets, use el método to_pandas_dataframe() para ver los datos en un dataframe.

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(Índice) PassengerId Survived Pclass Nombre Sex Age SibSp Parch Vale Fare Cabin Embarked
0 1 False 3 Braund, Mr. Owen Harris hombre 22,0 1 0 A/5 21171 7,2500 S
1 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Th... mujer 38,0 1 0 PC 17599 71,2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina mujer 26,0 0 0 STON/O2. 3101282 7,9250 S

Creación de un conjunto de datos a partir de un dataframe de Pandas

Para crear un objeto TabularDataset a partir de un dataframe de Pandas en memoria, use el método register_pandas_dataframe(). Este método registra un objeto TabularDataset en el área de trabajo y carga datos en el almacenamiento subyacente. Este proceso conlleva costos de almacenamiento.

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)

Sugerencia

Cree y registre un objeto TabularDataset a partir de un dataframe de Spark o Dask en memoria con los métodos de versión preliminar pública register_spark_dataframe() y register_dask_dataframe(). Estos métodos son características en versión preliminar experimental y pueden cambiar en cualquier momento.

Estos métodos cargan los datos en el almacenamiento subyacente y, como resultado, incurren en costos de almacenamiento.

Registro de conjuntos de datos

Para completar el proceso de creación, registre los conjuntos de datos con un área de trabajo. Use el método register() para registrar conjuntos de datos con el área de trabajo con el fin de compartirlos con otros usuarios y reutilizarlos en varios experimentos en el área de trabajo:

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

Creación de conjuntos de datos mediante Azure Resource Manager

Puede encontrar muchas plantillas en microsoft.machinelearningservices que se pueden usar para crear conjuntos de datos.

Para obtener información sobre estas plantillas, visite Uso de una plantilla de Azure Resource Manager para crear un área de trabajo para Azure Machine Learning.

Entrenamiento con conjuntos de datos

Use sus conjuntos de datos en los experimentos de aprendizaje automático para entrenar modelos de aprendizaje automático. Obtenga más información sobre cómo entrenar con conjuntos de datos.

Conjuntos de datos de versión

Puede registrar un nuevo conjunto de datos con el mismo nombre mediante la creación de una nueva versión. Una versión del conjunto de datos es una manera de marcar el estado de los datos, con lo que puede aplicar una versión específica del conjunto de datos para experimentación o reproducción futura. Para obtener más información, visite las versiones del conjunto de datos.

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

Pasos siguientes