Créer des jeux de données Azure Machine Learning

S’APPLIQUE À :Kit de développement logiciel (SDK) Python azureml v1

Dans cet article, vous découvrez comment créer des jeux de données Azure Machine Learning pour accéder aux données de vos expériences locales ou à distance avec le kit de développement logiciel (SDK) Python Azure Machine Learning. Pour obtenir plus d’informations sur la façon dont les jeux de données s’intègrent dans un flux de travail global d’accès aux données d’Azure Machine Learning, consultez l’article Sécuriser l’accès aux données.

Lorsque vous créez un jeu de données, vous créez une référence vers l’emplacement de la source de données, ainsi qu’une copie de ses métadonnées. Étant donné que les données restent dans leur emplacement existant, vous ne vous exposez à aucun coût de stockage supplémentaire et vous ne faites courir aucun risque à l’intégrité de vos sources de données. Les jeux de données sont en outre évalués tardivement, ce qui contribue à l’amélioration des vitesses de performances des flux de travail. Vous pouvez créer des jeux de données à partir de magasins de données, d’URL publiques et de Azure Open Datasets. Pour obtenir des informations sur une expérience avec peu de code, visitez Créez des jeux de données Azure Machine Learning avec Azure Machine Learning studio.

Avec les jeux de données Azure Machine Learning, vous pouvez :

  • Conserver une seule copie des données dans votre stockage, référencée par des jeux de données

  • Accéder simplement aux données lors de l’entraînement du modèle sans vous soucier des chaînes de connexion ou des chemins des données. Pour obtenir plus d’informations sur l’apprentissage d’un jeu de données, visiter En savoir plus sur l’apprentissage avec des jeux de données

  • Partager des données et collaborer avec d’autres utilisateurs

Important

Les éléments marqués « préversion » dans cet article sont actuellement en préversion publique. La préversion est fournie sans contrat de niveau de service et n’est pas recommandée pour les charges de travail en production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’Utilisation Supplémentaires relatives aux Évaluations Microsoft Azure.

Prérequis

Pour créer et utiliser des jeux de données, vous avez besoin des éléments suivants :

Remarque

Certaines classes de jeu de données ont des dépendances avec le package azureml-dataprep, qui n’est compatible qu’avec Python 64 bits. Si vous développez sous Linux, ces classes reposent sur .NET Core 2.1 et ne sont prises en charge que par certaines distributions. Pour obtenir plus d’informations sur les distributions prises en charge, consultez la colonne .NET Core 2.1 dans l’article Installer .NET sur Linux.

Important

Bien que le package puisse fonctionner sur les anciennes versions des distributions Linux, nous vous déconseillons d’utiliser un distribution dont le support standard n’est pas assuré. Les distributions qui ne bénéficient pas du support standard peuvent présenter des vulnérabilités de sécurité, car elles ne reçoivent pas les dernières mises à jour. Nous vous recommandons d’utiliser la version prise en charge la plus récente avec laquelle votre distribution est compatible.

Conseils liés à la taille de calcul

Quand vous créez un jeu de données, passez en revue la puissance de traitement du calcul et la taille de vos données en mémoire. La taille de vos données dans le stockage n’est pas la même que la taille des données dans un dataframe. Par exemple, le volume de données des fichiers CSV peuvent décupler dans un DataFrame. Un fichier CSV de 1 Go peut donc occuper 10 Go dans un DataFrame.

Les données compressées peuvent se développer. Vingt Go de données stockées de manière relativement éparse au format de compression Parquet peuvent se développer jusqu’à environ 800 Go en mémoire. Étant donné que les fichiers Parquet stockent les données dans un format en colonnes, si vous avez uniquement besoin de la moitié des colonnes, il vous suffit de charger environ 400 Go en mémoire.

Si vous souhaitez obtenir plus d’informations, visitez Apprenez-en davantage sur l’optimisation du traitement des données dans Azure Machine Learning.

Types de jeux de données

Il existe deux types de jeux de données, selon la façon dont les utilisateurs les consomment lors de l’apprentissage : FileDatasets et TabularDatasets. Les flux de données d’apprentissage Azure Machine Learning qui impliquent des estimateurs, AutoML, hyperDrive et des pipelines peuvent utiliser les deux types.

FileDataset

Un FileDataset fait référence à des fichiers uniques ou multiples dans vos magasins de données ou vos URL publiques. Si vos données sont déjà nettoyées et prêtes à l’emploi dans des expériences d’apprentissage, vous pouvez télécharger ou monter les fichiers dans votre calcul en tant qu’objet FileDataset.

Nous vous recommandons FileDatasets pour vos flux de travail Machine Learning car les fichiers sources peuvent avoir n’importe quel format. Ils permettent un éventail plus large de scénarios Machine Learning, notamment le Deep Learning.

Créez un FileDataset avec le Kit de développement logiciel (SDK) Python ou Azure Machine Learning studio.

TabularDataset

Un TabularDataset analyse le fichier ou la liste de fichiers fournis pour représenter des données dans un format tabulaire. Vous pouvez ensuite matérialiser les données dans un Pandas ou DataFrame Spark afin de travailler avec des bibliothèques d’apprentissage et de préparation des données familières tout en restant dans votre notebook. Vous pouvez créer un objet TabularDataset à partir de .csv, .tsv, .parquet et de fichiers de ligne .json et à partir de résultats de requête SQL.

Avec TabularDatasets, vous pouvez spécifier un horodatage à partir d’une colonne dans les données ou à partir de l’emplacement où les données du modèle de chemin sont stockées pour activer une caractéristique de série chronologique. Cette spécification active un filtrage chronologique facile et efficace. Pour un exemple, consultez Démonstration de l’API pour une série chronologique tabulaire avec des données météo NOAA.

Créez un TabularDataset avec le Kit de développement logiciel (SDK) Python ou Azure Machine Learning Studio.

Notes

Les workflows Machine Learning automatisé générés par le biais d’Azure Machine Learning studio prennent uniquement en charge TabularDatasets pour le moment.

De plus, pour les TabularDatasets générés à partir de résultats de requête SQL, T-SQL (par exemple la sous-requête « WITH ») ou les noms de colonnes dupliqués ne sont pas pris en charge. Les requêtes complexes T-SQL peuvent entraîner des problèmes de performances. Les noms de colonnes en double dans un jeu de données peuvent entraîner des problèmes d’ambiguïté.

Accéder à des jeux de données dans un réseau virtuel

Si votre espace de travail se trouve dans un réseau virtuel, vous devez configurer le jeu de données pour ignorer la validation. Pour obtenir plus d’informations sur l’utilisation de magasins de données et de jeux de données dans un réseau virtuel, visitez Sécuriser un espace de travail et les ressources associées.

Créer des jeux de données à partir de magasins de données

Pour que les données soient accessibles par Azure Machine Learning, vous devez créer des jeux de données à partir de chemins dans des URL web ou des magasins de données Azure Machine Learning.

Conseil

Vous pouvez créer des jeux de données directement à partir d’URL de stockage avec l’accès aux données basé sur l’identité. Si vous souhaitez obtenir plus d’informations, visitez Se connecter au stockage avec l’accès aux données basé sur l’identité.

Pour créer des jeux de données à partir d’un magasin de données avec le kit SDK Python :

  1. Vérifiez que vous disposez de l’accès contributor ou owner au service de stockage sous-jacent de votre magasin de données Azure Machine Learning enregistré. Vérifiez les autorisations de votre compte de stockage dans le portail Azure.

  2. Créez le jeu de données en référençant des chemins d’accès dans le magasin de données. Vous pouvez créer un jeu de données à partir de plusieurs chemins d’accès dans plusieurs magasins de données. Il n’existe aucune limite inconditionnelle quant au nombre de fichiers ou à la taille de données à partir desquels vous pouvez créer un jeu de données.

Remarque

Pour chaque chemin d’accès aux données, quelques requêtes sont envoyées au service de stockage pour vérifier s’il pointe vers un fichier ou un dossier. Cette surcharge peut entraîner une dégradation des performances ou une défaillance. Un jeu de données référençant un dossier contenant 1 000 fichiers est considéré comme référençant un chemin d’accès de données. Nous vous recommandons de créer des jeux de données référençant moins de 100 chemins d’accès dans des magasins de données pour obtenir des performances optimales.

Créer un FileDataset

Utilisez la méthode from_files() sur la classe FileDatasetFactory pour charger des fichiers de n’importe quel format et créer un FileDataset non inscrit.

Si votre stockage se trouve derrière un réseau virtuel ou un pare-feu, définissez le paramètre validate=False dans la méthode from_files(). Cela permet de contourner l’étape de validation initiale et vous permet de créer votre jeu de données à partir de ces fichiers sécurisés. Pour obtenir plus d’informations, visitez utilisation de magasins de données et de jeux de données dans un réseau virtuel.

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)

Pour charger l’ensemble des fichiers d’un répertoire local, créez un FileDataset dans une méthode unique avec upload_directory(). Cette méthode charge des données dans votre stockage sous-jacent, ce qui vous occasionne des coûts de stockage.

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)

Pour réutiliser et partager des jeux de données dans des expériences de votre espace de travail, inscrivez votre jeu de données.

Créer un TabularDataset

Utilisez la méthode from_delimited_files() sur la classe TabularDatasetFactory pour lire des fichiers au format .csv ou .tsv, puis créez un TabularDataset non inscrit. Pour lire les fichiers au format .parquet, utilisez la méthode from_parquet_files(). Si vous lisez à partir de plusieurs fichiers, les résultats sont agrégés dans une représentation tabulaire.

Pour obtenir des informations sur les formats de fichier pris en charge, visitez la documentation de référence de TabularDatasetFactory et les informations sur la syntaxe et les modèles de conception comme la prise en charge de plusieurs lignes.

Si votre stockage se trouve derrière un réseau virtuel ou un pare-feu, définissez le paramètre validate=False dans votre méthode from_delimited_files(). Cela permet de contourner l’étape de validation initiale et vous permet de créer votre jeu de données à partir de ces fichiers sécurisés. Si vous souhaitez obtenir plus d’informations sur les ressources de stockage de données derrière un réseau virtuel ou un pare-feu, visitez magasins de données et jeux de données dans un réseau virtuel.

Ce code obtient l’espace de travail existant et le magasin de données souhaité par nom. Il transmet ensuite les emplacements du magasin de données et des fichiers au paramètre path pour créer un nouveau TabularDataset nommé 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)

Définir le schéma de données

Quand vous créez un TabularDataset, les types de données des colonnes sont par défaut inférés automatiquement. Si les types inférés ne correspondent pas à vos attentes, vous pouvez spécifier les types des colonnes avec le code suivant pour mettre à jour votre jeu de données. Le paramètre infer_column_type s’applique uniquement aux jeux de données créés à partir de fichiers délimités. Pour obtenir plus d’informations, visitez Apprenez-en davantage sur les types de données pris en charge.

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()
(Index) PassengerId Survived Pclass Nom Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 False 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 S
1 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina female 26,0 0 0 STON/O2. 3101282 7.9250 S

Pour réutiliser et partager des jeux de données dans des expériences de votre espace de travail, inscrivez votre jeu de données.

Data wrangling

Une fois que vous avez créé et inscrit votre jeu de données, vous pouvez le charger dans votre notebook pour le data wrangling et l’exploration des données avant d’effectuer l’apprentissage du modèle. Il est possible que vous n’ayez pas besoin d’effectuer un data wrangling ou une exploration. Dans ce cas, si vous souhaitez obtenir plus d’informations sur la façon de consommer des jeux de données dans vos scripts d’apprentissage pour des soumissions d’expérience ML, visitez Effectuer l’apprentissage avec des jeux de données.

Filtrer les jeux de données (préversion)

Les capacités de filtrage dépendent du type de jeu de données dont vous disposez.

Important

Le filtrage de jeux de données à l’aide de la méthode de la préversion, filter(), est une fonctionnalité d’évaluation expérimentale et peut changer à tout moment.

Pour les TabularDatasets, vous pouvez conserver ou supprimer des colonnes avec les méthodes keep_columns() et drop_columns().

Pour filtrer les lignes en utilisant une valeur de colonne spécifique dans un TabularDataset, utilisez la méthode filter() (préversion).

Ces exemples retournent un jeu de données non inscrit en fonction des expressions spécifiées :

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

Dans les FileDatasets, chaque ligne correspond à un chemin d’accès à un fichier, de sorte que le filtrage par valeur de colonne n’est pas utile. Toutefois, vous pouvez utiliser filter() pour filtrer des lignes par métadonnées, par exemple CreationTime, Size, etc. Ces exemples retournent un jeu de données non inscrit en fonction des expressions spécifiées :

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

Les jeux de données étiquetés créés à partir de projets d’étiquetage d’images sont un cas particulier. Ces jeux de données sont un type de TabularDataset constitué de fichiers image. Pour ces jeux de données, vous pouvez utiliser filter() pour filtrer les images par métadonnées et par valeurs de colonne label et 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))

Données de partition

Pour partitionner un jeu de données, incluez le paramètre partitions_format lorsque vous créez un TabularDataset ou un FileDataset.

Lorsque vous partitionnez un jeu de données, les informations de partition de chaque chemin d’accès de fichier sont extraites dans des colonnes en fonction du format spécifié. Le format doit commencer à partir de la position de la première clé de partition et se poursuivre jusqu’à la fin du chemin d’accès au fichier.

Par exemple, compte tenu du chemin d’accès ../Accounts/2019/01/01/data.jsonl, où la partition se fait par nom de service et par heure, partition_format='/{Department}/{PartitionDate:yyyy/MM/dd}/data.jsonl' crée une colonne de chaîne « Department » avec la valeur « Accounts » et une colonne DateHeure « PartitionDate » avec la valeur 2019-01-01.

Si vos données comportent déjà des partitions existantes et que vous souhaitez conserver ce format, incluez le paramètre partitioned_format dans votre méthode from_files() pour créer un FileDataset.

Pour créer un TabularDataset qui conserve les partitions existantes, incluez le paramètre partitioned_format dans from_parquet_files() ou la méthode from_delimited_files().

Cet exemple

  • Crée un FileDataset à partir de fichiers partitionnés
  • Obtient les clés de partition
  • Crée un FileDataset indexé

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

Vous pouvez également créer une nouvelle structure de partitions pour TabularDatasets avec la méthode partition_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']

Explorer des données

Une fois votre data wrangling terminé, vous pouvez inscrire votre jeu de données, puis le charger dans votre notebook pour l’exploration des données avant l’apprentissage du modèle.

Pour les FileDataset, vous pouvez monter ou télécharger votre jeu de données et appliquer les bibliothèques Python que vous utiliseriez normalement pour l’exploration des données. Pour obtenir plus d’informations, visitez En savoir plus sur le montage et le téléchargement.

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

Pour les TabularDataset, utilisez la méthode to_pandas_dataframe() pour afficher vos données dans un dataframe.

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(Index) PassengerId Survived Pclass Nom Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 False 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 S
1 2 True 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 True 3 Heikkinen, Miss. Laina female 26,0 0 0 STON/O2. 3101282 7.9250 S

Créer un jeu de données à partir d’une tramedonnées pandas

Pour créer un TabularDataset à partir d’un DataFrame Pandas en mémoire, utilisez la méthode register_pandas_dataframe(). Cette méthode inscrit le TabularDataset dans l’espace de travail et charge les données dans votre stockage sous-jacent. Ce processus occasionne des coûts de stockage.

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)

Conseil

Créez et inscrivez un TabularDataset à partir d’un dataframe Spark en mémoire ou d’un dataframe Dask avec les méthodes de préversion publique register_spark_dataframe() et register_dask_dataframe(). Ces méthodes sont des fonctionnalités d’évaluation expérimentales susceptibles d’évoluer à tout moment.

Elles chargent les données dans votre stockage sous-jacent et entraînent la facturation de coûts de stockage.

Inscrire des jeux de données

Pour terminer le processus de création, inscrivez vos jeux de données dans un espace de travail. Utilisez la méthode register() pour inscrire des jeux de données auprès de votre espace de travail afin de pouvoir les partager avec d’autres personnes et les réutiliser dans des expériences de votre espace de travail :

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

Créer des jeux de données à l'aide d'Azure Resource Manager

Vous trouverez de nombreux modèles sur microsoft.machinelearningservices que vous pouvez utiliser pour créer des jeux de données.

Pour obtenir plus d'informations sur ces modèles, visiter Utiliser un modèle Azure Resource Manager afin de créer un espace de travail pour Azure Machine Learning.

Entraîner avec des jeux de données

Utilisez vos jeux de données dans vos expériences d’apprentissage automatique pour la formation de modèles ML. Découvrez-en plus sur l’entraînement avec des jeux de données.

Jeux de données avec version

Vous pouvez inscrire un nouveau jeu de données sous le même nom en créant une nouvelle version. Une version de jeu de données peut marquer l’état de vos données afin d’appliquer une version spécifique du jeu de données pour l’expérimentation ou une reproduction future. Pour obtenir plus d’informations, consultez les versions de jeux de données.

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

Étapes suivantes