Поделиться через


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

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

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

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

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

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

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

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

Внимание

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

Необходимые компоненты

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

Примечание.

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

Внимание

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

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

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

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

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

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

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

FileDataset

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

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

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

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

TabularDataset анализирует предоставленный файл или список файлов, чтобы представлять данные в табличном формате. Затем можно материализовать данные в pandas или Spark DataFrame, чтобы работать с знакомыми библиотеками подготовки и обучения данных во время пребывания в записной книжке. Объект можно создать TabularDataset из .csv, Tsv, PARQUET, .json строк и результатов SQL-запроса.

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

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

Примечание.

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

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

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

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

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

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

Совет

Наборы данных можно создавать непосредственно из 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 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)

Чтобы передать все файлы из локального каталога, создайте 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 , чтобы создать новый табличный набор данных с именем 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)

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

При создании Табличного набора данных типы данных столбцов автоматически выводятся по умолчанию. Если выводимые типы не соответствуют вашим ожиданиям, можно указать типы столбцов со следующим кодом, чтобы обновить набор данных. Параметр 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 Доживших Pclass Имя. Пол Возраст SibSp Parch Билет Тариф Кабина Отправлено
0 1 False 3 Браунд, г-н Оуэн Харрис Мужской 22,0 1 0 A/5 21171 7,2500 S
1 2 Истина 1 Камингс, миссис Джон Брэдли (Флоренс Бриггс Т... female 38,0 1 0 PC 17599 71,2833 C85 C
2 3 Истина 3 Хейккинен, мисс Лайна female 26,0 0 0 STON/O2. 3101282 7,9250 S

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

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

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

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

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

Внимание

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

Для табличных данных можно хранить или удалять столбцы с помощью методов 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 каждая строка соответствует пути к файлу, поэтому фильтрация по значению столбца не помогает. Однако можно отфильтровать строки по метаданным, например 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, состоящий из файлов изображений. Для этих наборов данных можно фильтровать изображения по метаданным и значениям 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 параметр при создании табличного набора данных или FileDataset.

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

Например, учитывая путь ../Accounts/2019/01/01/data.jsonl, в котором секция имеет имя и время отдела, создает partition_format='/{Department}/{PartitionDate:yyyy/MM/dd}/data.jsonl' строковый столбец "Отдел" со значением Accounts, а столбец datetime "PartitionDate" со значением 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()

Можно также создать новую структуру секций для табличных данных с помощью метода 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']

Изучение данных

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

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

Вы можете найти множество шаблонов в службах 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)

Следующие шаги