8.4. Загрузка других наборов данных#

8.4.1. Примеры изображений#

Scikit-learn также включает несколько образцовых JPEG-изображений, опубликованных под лицензией Creative Commons их авторами. Эти изображения могут быть полезны для тестирования алгоритмов и конвейеров на 2D-данных.

load_sample_images()

Загрузить примеры изображений для манипуляций с изображениями.

load_sample_image(image_name)

Загрузить массив numpy одного примера изображения.

../_images/loading_other_datasets-1.png

Предупреждение

Кодировка изображений по умолчанию основана на uint8 dtype для экономии памяти. Часто алгоритмы машинного обучения работают лучше, если входные данные сначала преобразованы в представление с плавающей точкой. Также, если вы планируете использовать matplotlib.pyplot.imshow, не забудьте масштабировать до диапазона 0-1, как показано в следующем примере.

8.4.2. Наборы данных в формате svmlight / libsvm#

scikit-learn включает служебные функции для загрузки наборов данных в формате svmlight / libsvm. В этом формате каждая строка имеет вид : : .... Этот формат особенно подходит для разреженных наборов данных. В этом модуле scipy разреженные CSR-матрицы используются для X и массивы numpy используются для y.

Вы можете загрузить набор данных следующим образом:

>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...

Вы также можете загрузить два (или более) набора данных одновременно:

>>> X_train, y_train, X_test, y_test = load_svmlight_files(
...     ("/path/to/train_dataset.txt", "/path/to/test_dataset.txt"))
...

В этом случае, X_train и X_test гарантированно имеют одинаковое количество признаков. Другой способ достичь того же результата — зафиксировать количество признаков:

>>> X_test, y_test = load_svmlight_file(
...     "/path/to/test_dataset.txt", n_features=X_train.shape[1])
...

Связанные ссылки

8.4.3. Загрузка наборов данных из репозитория openml.org#

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

The sklearn.datasets пакет может загружать наборы данных из репозитория с помощью функции sklearn.datasets.fetch_openml.

Например, чтобы загрузить набор данных экспрессии генов в мозгах мышей:

>>> from sklearn.datasets import fetch_openml
>>> mice = fetch_openml(name='miceprotein', version=4)

Чтобы полностью определить набор данных, необходимо указать имя и версию, хотя версия является необязательной, см. Версии наборов данных ниже. Набор данных содержит в общей сложности 1080 примеров, принадлежащих к 8 различным классам:

>>> mice.data.shape
(1080, 77)
>>> mice.target.shape
(1080,)
>>> np.unique(mice.target)
array(['c-CS-m', 'c-CS-s', 'c-SC-m', 'c-SC-s', 't-CS-m', 't-CS-s', 't-SC-m', 't-SC-s'], dtype=object)

Вы можете получить больше информации о наборе данных, посмотрев на DESCR и details атрибуты:

>>> print(mice.DESCR)
**Author**: Clara Higuera, Katheleen J. Gardiner, Krzysztof J. Cios
**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Mice+Protein+Expression) - 2015
**Please cite**: Higuera C, Gardiner KJ, Cios KJ (2015) Self-Organizing
Feature Maps Identify Proteins Critical to Learning in a Mouse Model of Down
Syndrome. PLoS ONE 10(6): e0129126...

>>> mice.details
{'id': '40966', 'name': 'MiceProtein', 'version': '4', 'format': 'ARFF',
'upload_date': '2017-11-08T16:00:15', 'licence': 'Public',
'url': 'https://www.openml.org/data/v1/download/17928620/MiceProtein.arff',
'file_id': '17928620', 'default_target_attribute': 'class',
'row_id_attribute': 'MouseID',
'ignore_attribute': ['Genotype', 'Treatment', 'Behavior'],
'tag': ['OpenML-CC18', 'study_135', 'study_98', 'study_99'],
'visibility': 'public', 'status': 'active',
'md5_checksum': '3c479a6885bfa0438971388283a1ce32'}

The DESCR содержит текстовое описание данных, в то время как details содержит словарь метаданных, хранящихся openml, например идентификатор набора данных. Для получения дополнительных сведений см. Документация OpenML The data_id набора данных мышиных белков составляет 40966, и вы можете использовать этот номер (или название) для получения дополнительной информации о наборе данных на сайте openml:

>>> mice.url
'https://www.openml.org/d/40966'

The data_id также однозначно идентифицирует набор данных из OpenML:

>>> mice = fetch_openml(data_id=40966)
>>> mice.details
{'id': '4550', 'name': 'MiceProtein', 'version': '1', 'format': 'ARFF',
'creator': ...,
'upload_date': '2016-02-17T14:32:49', 'licence': 'Public', 'url':
'https://www.openml.org/data/v1/download/1804243/MiceProtein.ARFF', 'file_id':
'1804243', 'default_target_attribute': 'class', 'citation': 'Higuera C,
Gardiner KJ, Cios KJ (2015) Self-Organizing Feature Maps Identify Proteins
Critical to Learning in a Mouse Model of Down Syndrome. PLoS ONE 10(6):
e0129126. [Web Link] journal.pone.0129126', 'tag': ['OpenML100', 'study_14',
'study_34'], 'visibility': 'public', 'status': 'active', 'md5_checksum':
'3c479a6885bfa0438971388283a1ce32'}

8.4.3.1. Версии наборов данных#

Набор данных однозначно определяется своим data_id, но не обязательно по его имени. Может существовать несколько разных «версий» набора данных с одним именем, которые могут содержать совершенно разные наборы данных. Если конкретная версия набора данных содержит значительные проблемы, она может быть деактивирована. Использование имени для указания набора данных даст самую раннюю версию набора данных, которая всё ещё активна. Это означает, что fetch_openml(name="miceprotein") может давать разные результаты в разное время, если более ранние версии становятся неактивными. Вы можете видеть, что набор данных с data_id 40966, который мы получили выше, является первой версией набора данных "miceprotein":

>>> mice.details['version']
'1'

Фактически, этот набор данных имеет только одну версию. Набор данных ирисов, с другой стороны, имеет несколько версий:

>>> iris = fetch_openml(name="iris")
>>> iris.details['version']
'1'
>>> iris.details['id']
'61'

>>> iris_61 = fetch_openml(data_id=61)
>>> iris_61.details['version']
'1'
>>> iris_61.details['id']
'61'

>>> iris_969 = fetch_openml(data_id=969)
>>> iris_969.details['version']
'3'
>>> iris_969.details['id']
'969'

Указание набора данных по имени "iris" дает самую раннюю версию, версию 1, с data_id 61. Чтобы всегда получать именно этот набор данных, наиболее безопасно указать его по идентификатору набора данных data_id. Другой набор данных, с data_id 969, это версия 3 (версия 2 стала неактивной) и содержит бинаризованную версию данных:

>>> np.unique(iris_969.target)
array(['N', 'P'], dtype=object)

Вы также можете указать как имя, так и версию, что также однозначно идентифицирует набор данных:

>>> iris_version_3 = fetch_openml(name="iris", version=3)
>>> iris_version_3.details['version']
'3'
>>> iris_version_3.details['id']
'969'

Ссылки

8.4.3.2. парсер ARFF#

Начиная с версии 1.2, scikit-learn предоставляет новый аргумент ключевого слова parser которая предоставляет несколько опций для разбора файлов ARFF, предоставляемых OpenML. Устаревший парсер (т.е. parser="liac-arff") основан на проекте LIAC-ARFF. Однако этот парсер медленный и потребляет больше памяти, чем требуется. Новый парсер на основе pandas (т.е. parser="pandas") работает быстрее и эффективнее использует память. Однако этот парсер не поддерживает разреженные данные. Поэтому мы рекомендуем использовать parser="auto" который будет использовать лучший доступный парсер для запрашиваемого набора данных.

The "pandas" и "liac-arff" парсеры могут приводить к разным типам данных в выводе. Основные различия следующие:

  • The "liac-arff" парсер всегда кодирует категориальные признаки как str объектов. Напротив, "pandas" парсер вместо этого выводит тип во время чтения, и числовые категории будут приведены к целым числам, когда это возможно.

  • The "liac-arff" парсер использует float64 для кодирования числовых признаков, помеченных как 'REAL' и 'NUMERICAL' в метаданных. The "pandas" Вместо этого парсер определяет, соответствуют ли эти числовые признаки целым числам, и использует расширенный тип данных Integer из pandas.

  • В частности, классификационные наборы данных с целочисленными категориями обычно загружаются как таковые (0, 1, ...) с "pandas" парсер, пока "liac-arff" принудительно использует строковые метки классов, такие как "0", "1" и так далее.

  • The "pandas" парсер не будет удалять одинарные кавычки - т.е. ' - из строковых столбцов. Например, строка 'my string' будет сохранен как есть, в то время как "liac-arff" парсер удалит одинарные кавычки. Для категориальных столбцов одинарные кавычки удаляются из значений.

Кроме того, когда as_frame=False используется, "liac-arff" парсер возвращает ординально закодированные данные, где категории предоставляются в атрибуте categories из Bunch экземпляр. Вместо этого, "pandas" возвращает массив NumPy где категории. Затем пользователь должен разработать конвейер инженерии признаков с экземпляром OneHotEncoder или OrdinalEncoder обычно обернуты в ColumnTransformer для явной предобработки категориальных столбцов. Смотрите, например: Трансформер столбцов со смешанными типами.

8.4.4. Загрузка из внешних наборов данных#

scikit-learn работает с любыми числовыми данными, хранящимися в виде numpy arrays или scipy sparse matrices. Другие типы, которые можно преобразовать в числовые массивы, такие как pandas DataFrame, также допустимы.

Вот некоторые рекомендуемые способы загрузки стандартных табличных данных в формат, пригодный для использования в scikit-learn:

  • pandas.io предоставляет инструменты для чтения данных из распространенных форматов, включая CSV, Excel, JSON и SQL. DataFrames также могут быть созданы из списков кортежей или словарей. Pandas плавно обрабатывает гетерогенные данные и предоставляет инструменты для манипуляции и преобразования в числовой массив, подходящий для scikit-learn.

  • scipy.io специализируется на двоичных форматах, часто используемых в научных вычислениях, таких как .mat и .arff

  • numpy/routines.io для стандартной загрузки столбцовых данных в массивы numpy

  • scikit-learn load_svmlight_file для разреженного формата svmlight или libSVM

  • scikit-learn load_files для каталогов текстовых файлов, где имя каждого каталога — это имя каждой категории, а каждый файл внутри каждого каталога соответствует одному образцу из этой категории

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

  • skimage.io или Imageio для загрузки изображений и видео в массивы numpy

  • scipy.io.wavfile.read для чтения WAV-файлов в массив numpy

Категориальные (или номинальные) признаки, хранящиеся как строки (часто в pandas DataFrames), потребуют преобразования в числовые признаки с помощью OneHotEncoder или OrdinalEncoder или аналогичный. См. Предобработка данных.

Примечание: если вы управляете собственными числовыми данными, рекомендуется использовать оптимизированный формат файлов, такой как HDF5, чтобы сократить время загрузки данных. Различные библиотеки, такие как H5Py, PyTables и pandas, предоставляют интерфейс Python для чтения и записи данных в этом формате.