Создание наборов данных Машинного обучения Azure

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python для ML Azure версии 1

Из этой статьи вы узнаете, как создавать наборы данных для службы Машинное обучение Azure, чтобы получать доступ к данным для локальных и удаленных экспериментов с помощью Машинного обучения Azure для Python с пакетом SDK. Сведения о работе с наборами данных в общем рабочем процессе доступа к данным в Машинном обучении Azure см. в статье Безопасный доступ к данным.

Создавая набор данных, вы создаете ссылку на расположение источника данных, а также копию его метаданных. Поскольку данные остаются в своем расположении, не возникает дополнительных затрат на хранение, и целостность источников данных не подвергается риску. Кроме того, наборы данных оцениваются неактивно, что повышает скорость рабочего процесса. Наборы данных можно создавать на основе хранилищ данных, общедоступных URL-адресов, а также Открытых наборов данных Azure.

Для интерфейса с минимальным написанием кода создавайте наборы данных с помощью Студии машинного обучения Azure.

Наборы данных для Машинного обучения Azure позволяют выполнять действия, описанные ниже.

  • Сохранение одной копии данных в хранилище, на которое ссылаются наборы данных.

  • Беспрепятственный доступ к данным в процессе обучения модели без проблем со строками подключения или путями к данным. Узнайте больше об обучении с наборами данных.

  • Совместное использование данных и сотрудничество с другими пользователями.

Важно!

Элементы в этой статье, помеченные как "предварительная версия", в настоящее время находятся в общедоступной предварительной версии. Предварительная версия предоставляется без соглашения об уровне обслуживания и не рекомендована для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования предварительных выпусков Microsoft Azure.

Предварительные требования

Для создания наборов данных и работы с ними требуются компоненты, указанные ниже.

Примечание

Некоторые классы наборов данных имеют зависимости от пакета azureml-dataprep, совместимого только с 64-разрядным Python. При разработке в Linux эти классы используют .NET Core 2.1 и поддерживаются только на некоторых дистрибутивах. Дополнительные сведения о поддерживаемых дистрибутивах см. в столбце .NET Core 2.1 в статье Установка .NET в Linux.

Важно!

Несмотря на то что пакет может работать в старых версиях дистрибутивов Linux, не рекомендуется использовать дистрибутив, для которого основная фаза поддержки окончена. Дистрибутивы, для которых основная фаза поддержки окончена, могут иметь уязвимости, так как не получают последние обновления. Мы рекомендуем использовать последнюю поддерживаемую версию дистрибутива, совместимую с .

Руководство по объему вычислительных ресурсов

При создании набора данных следует проверить вычислительную мощность и размер данных в памяти. Размер данных в хранилище не совпадает с размером данных в кадре данных. Например, данные в CSV-файлах могут до 10 раз увеличиваться в кадре данных, поэтому CSV-файл размером 1 ГБ может увеличиться до 10 ГБ в кадре данных.

Если данные сжаты, они могут расширяться и позже. 20 ГБ относительно разреженных данных, хранящихся в формате parquet, могут увеличиться до примерно 800 ГБ в памяти. Поскольку Parquet-файлы сохраняют данные в формате столбцов, если требуется только половина столбцов, в память надо загрузить только примерно 400 ГБ.

Дополнительные сведения об оптимизации обработки данных в службе Машинное обучение Azure.

Типы наборов данных

Предлагаются два типа наборов в зависимости от их использования в обучении — FileDatasets и TabularDatasets. Оба типа данных можно использовать в рабочих процессах Машинного обучения Azure, в которые включены оценщики, AutoML, hyperDrive и конвейеры.

FileDataset

FileDataset ссылается на один или несколько файлов, размещенных в хранилищах данных или доступных по общедоступным URL-адресам. Если данные уже очищены и готовы к использованию в обучающих экспериментах, файлы можно загрузить или подключить в вычислительный процесс, как объект FileDataset.

Рекомендуем использовать объекты FileDataset для рабочих процессов машинного обучения, поскольку исходные файлы могут иметь любой формат, что позволяет использовать более широкий спектр сценариев машинного обучения, включая глубокое обучение.

Создайте объект FileDataset с помощью пакета SDK для Python или Студии машинного обучения Azure.

Табличный набор данных

TabularDataset представляет данные в табличном формате путем синтаксического анализа предоставленного файла или списка файлов. Это позволяет материализовать данные в кадр данных Pandas или Spark, чтобы работать с привычными библиотеками подготовки данных и обучения, не покидая записной книжки. Объект TabularDataset можно создать из файлов .csv, .tsv, .parquet, .jsonl и из результатов SQL-запроса.

С помощью TabularDatasets можно указать отметку времени из столбца в данных или из того места, где хранятся данные шаблона пути, чтобы включить признак временного ряда. Эта спецификация обеспечивает простую и эффективную фильтрацию по времени. Пример см. в статье Демо-версия API, относящегося к табличным временным рядам с данными о погоде NOAA.

Создайте объект TabularDataset с помощью пакета SDK для Python или Студии машинного обучения Azure.

Примечание

Рабочие процессы автоматизированного машинного обучения, созданные с помощью Студии машинного обучения Azure, в настоящее время поддерживают только TabularDatasets.

Примечание

Для табличных наборов данных, создаваемых из результатов SQL-запроса, T-SQL (например, вложенный запрос WITH) или повторяющееся имя столбца не поддерживается. Сложные запросы, такие как T-SQL, могут вызвать проблемы с производительностью. Повторяющиеся имена столбцов в наборе данных могут вызвать проблемы из-за неоднозначности.

Доступ к наборам данных в виртуальной сети

Если рабочая область находится в виртуальной сети, необходимо настроить набор данных, чтобы пропустить проверку. Дополнительные сведения об использовании хранилищ и наборов данных в виртуальной сети см. в статье Защита рабочей области и связанных ресурсов.

Создание наборов данных из хранилищ данных

Чтобы обеспечить доступность данных для Машинного обучения Azure, необходимо создать наборы данных на основе путей в хранилищах данных Машинного обучения Azure или общедоступных URL-адресов в Интернете.

Совет

Наборы данных можно создавать непосредственно из URL-адресов хранилища с доступом к данным на основе удостоверений. Дополнительные сведения см. в статье Подключение к хранилищу с доступом к данным на основе удостоверений.

Чтобы создать наборы данных из хранилища данных с помощью пакета SDK для Python, выполните действия, описанные ниже.

  1. Убедитесь, что у вас установлен уровень доступа contributor или owner к базовой службе хранилища вашего зарегистрированного хранилища данных Машинное обучение Azure. Проверьте разрешения учетной записи хранения на портале Azure.

  2. Создайте набор данных, указав пути в хранилище данных. Набор данных можно создать на основе нескольких путей в нескольких хранилищах. Не установлено строгое ограничение на количество файлов или объем данных, из которых можно создать набор данных.

Примечание

В службу хранилища будут отправлены несколько запросов по каждому пути данных, чтобы проверить, указывает он на файл или на папку. Эта дополнительная нагрузка может привести к снижению производительности или сбою. Считается, что набор данных, ссылающийся на одну папку, содержащую 1000 файлов, ссылается на один путь к данным. Чтобы обеспечить оптимальную производительность, рекомендуется создавать наборы данных, ссылающиеся не более чем на 100 путей в хранилищах данных.

Создание FileDataset

Используйте метод from_files() для класса FileDatasetFactory, чтобы загрузить файлы любого формата и создать незарегистрированный объект FileDataset.

Если хранилище находится за границей виртуальной сети или брандмауэра, задайте параметр validate=False в рамках метода from_files(). Это позволяет обойти этап начальной проверки и гарантирует, что вы сможете создать свой набор данных из этих защищенных файлов. Ознакомьтесь с подробными сведениями об использовании хранилищ и наборов данных в виртуальной сети.

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)

Если требуется отправить все файлы из локального каталога, создайте FileDataset в одном методе с помощью upload_directory(). При использовании этого метода данные передаются в базовое хранилище, вследствие чего возникают затраты на хранение.

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)

Для повторного и совместного использования наборов данных в рамках эксперимента в рабочей области зарегистрируйте свой набор данных.

Создание TabularDataset

Используйте метод from_delimited_files() для класса TabularDatasetFactory, чтобы читать файлы в формате .csv или .tsv и создать незарегистрированный объект TabularDataset. Для чтения файлов в формате .parquet используйте метод from_parquet_files(). Если выполняется чтение из нескольких файлов, результаты будут объединены в одно табличное представление.

Сведения о поддерживаемых форматах файлов, а также синтаксис и шаблоны разработки, такие как поддержка нескольких строк, см. в справочной документации по TabularDatasetFactory.

Если хранилище находится за границей виртуальной сети или брандмауэра, задайте параметр validate=False в рамках метода from_delimited_files(). Это позволяет обойти этап начальной проверки и гарантирует, что вы сможете создать свой набор данных из этих защищенных файлов. Ознакомьтесь с подробными сведениями об использовании хранилищ и наборов данных в виртуальной сети.

Приведенный ниже код позволяет получить сведения о существующей рабочей области и требуемом хранилище данных по имени. Затем это сведения о хранилище и расположениях файлов передаются в параметр path для создания нового объекта 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)

Определение схемы данных

По умолчанию при создании TabularDataset типы данных столбца выводятся автоматически. Если выводимые типы не соответствуют ожиданиям, можно обновить схему набора данных, указав типы столбцов с помощью следующего кода. Параметр infer_column_type применим только для наборов данных, созданных из файлов с разделителями. Подробнее о поддерживаемых типах данных.

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()
(Индекс) PassengerId Survived Pclass Имя Пол возраст; SibSp Parch Билет Плата Кабина Отправлено
0 1 False 3 Браунд, г-н Оуэн Харрис Мужской 22,0 1 0 A/5 21171 7,2500 S
1 2 True 1 Камингс, миссис Джон Брэдли (Флоренс Бриггс Т... Женский 38,0 1 0 PC 17599 71,2833 C85 C
2 3 True 3 Хейккинен, мисс Лайна Женский 26,0 0 0 STON/O2. 3101282 7,9250 S

Для повторного и совместного использования наборов данных в рамках экспериментов в рабочей области зарегистрируйте свой набор данных.

Первичная обработка данных

После создания и регистрации набора данных его можно загрузить в записную книжку для первичной обработки и анализа данных перед обучением модели.

Если первичная обработка данных или их анализ не требуются, см. статью Обучение с помощью наборов данных, чтобы узнать, как использовать наборы данных в сценариях обучения для передачи в эксперименты машинного обучения.

Фильтрация наборов данных (предварительная версия)

Возможности фильтрации зависят от типа имеющегося набора данных.

Важно!

Фильтрация наборов данных с помощью метода в предварительной версии, filter(), является экспериментальной функцией в предварительной версии, которая может быть изменена в любое время.

Для TabularDatasets можно сохранять или удалять столбцы с помощью методов keep_columns() и drop_columns().

Чтобы отфильтровать строки по определенному значению столбца в TabularDataset, используйте метод filter() (предварительная версия).

В следующих примерах возвращается незарегистрированный набор данных на основе указанных выражений.

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

В FileDatasets каждая строка соответствует пути к файлу, поэтому фильтрация по значению столбца бесполезна. Однако можно применить метод filter(), чтобы отфильтровать строки по метаданным, например CreationTime, Size и т. д.

В следующих примерах возвращается незарегистрированный набор данных на основе указанных выражений.

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

Наборы данных с метками, созданные на основе проектов маркировки изображений, представляют собой особый случай. Эти наборы данных представляют собой объект типа TabularDataset, состоящий из файлов изображений. К наборам данных этих типов можно применять метод filter(), чтобы фильтровать изображения по метаданным, а также по значениям столбцов, таким как label и 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))

Секционирование данных

Чтобы секционировать набор данных, можно включить параметр partitions_format при создании TabularDataset или FileDataset.

При секционировании набора данных сведения о секционировании для каждого пути к файлу извлекаются в столбцы в соответствии с указанным форматом. Формат должен начинаться с расположения первого ключа секции до конца пути к файлу.

Например, возьмем путь ../Accounts/2019/01/01/data.jsonl, где секция определяется именем отдела и временем. partition_format='/{Department}/{PartitionDate:yyyy/MM/dd}/data.jsonl' создает строковый столбец Department со значением Accounts и столбец даты и времени PartitionDateme со значением 2019-01-01.

Если в данных уже есть секции и вы хотите сохранить этот формат, включите параметр partitioned_format в метод from_files() для создания FileDataset.

Чтобы создать TabularDataset, сохраняющий существующие секции, включите параметр partitioned_format в метод from_parquet_files() или from_delimited_files().

В следующем примере показано:

  • создание FileDataset из секционированных файлов;
  • получение ключей секций;
  • создание нового индексированного FileDataset.

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

С помощью метода partitions_by() можно создать новую структуру секций для TabularDataset.


 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']

Анализ данных

После первичной обработки данных можно зарегистрировать набор данных и загрузить его в записную книжку для анализа данных перед обучением модели.

Для FileDatasets можно подключить или загрузить набор данных, а также применить библиотеки Python, которые обычно используются для анализа данных. Подробнее о подключении и загрузке.

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

Для TabularDatasets используйте метод to_pandas_dataframe(), чтобы просмотреть данные в кадре данных.

# preview the first 3 rows of titanic_ds
titanic_ds.take(3).to_pandas_dataframe()
(Индекс) PassengerId Survived Pclass Имя Пол возраст; SibSp Parch Билет Плата Кабина Отправлено
0 1 False 3 Браунд, г-н Оуэн Харрис Мужской 22,0 1 0 A/5 21171 7,2500 S
1 2 True 1 Камингс, миссис Джон Брэдли (Флоренс Бриггс Т... Женский 38,0 1 0 PC 17599 71,2833 C85 C
2 3 True 3 Хейккинен, мисс Лайна Женский 26,0 0 0 STON/O2. 3101282 7,9250 S

Создание набора данных на основе кадра данных Pandas

Чтобы создать TabularDataset из кадра данных Pandas в памяти, используйте метод register_pandas_dataframe(). Он регистрирует TabularDataset в рабочей области и отправляет данные в базовое хранилище. Это повлечет затраты на хранение.

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)

Совет

Создайте и зарегистрируйте объект TabularDataset в кадре данных Pandas или Dask в памяти с помощью общедоступных методов в предварительной версии, register_spark_dataframe() и register_dask_dataframe(). Эти методы представляют собой экспериментальные функции в предварительной версии, которые могут быть изменены в любое время.

С помощью этих методов данные передаются в базовое хранилище, вследствие чего возникают затраты на хранение.

Регистрация наборов данных

Чтобы завершить процесс создания, зарегистрируйте наборы данных в рабочей области. Используйте метод register() для регистрации наборов данных в рабочей области, чтобы поделиться ими с другими пользователями и повторно использовать их в разных экспериментах в рабочей области:

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

Создание наборов данных с помощью Azure Resource Manager

По адресу https://github.com/Azure/azure-quickstart-templates/tree/master//quickstarts/microsoft.machinelearningservices имеется множество шаблонов, которые можно использовать для создания наборов данных.

Сведения об использовании этих шаблонов см. в разделе Использование шаблона Azure Resource Manager для создания рабочей области для Машинного обучения Azure.

Обучение с наборами данных

Используйте наборы данных в экспериментах машинного обучения для обучения моделей машинного обучения. Узнайте больше об обучении с наборами данных.

Управление версиями наборов данных

Новый набор данных можно зарегистрировать с тем же именем, создав новую версию. Версия набора данных — это способ добавления состояния данных в закладки, чтобы можно было применять определенную версию набора данных для эксперимента или будущего воспроизведения. Дополнительные сведения о версиях наборов данных.

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

Дальнейшие действия