7.4. Загрузка других наборов данных¶
7.4.1. Образцы изображений¶
Scikit-learn также включает в себя несколько примеров изображений JPEG, опубликованных под лицензией Creative Commons их авторами. Эти изображения могут быть полезны для тестирования алгоритмов и конвейеров на 2D-данных.
Load sample images for image manipulation. |
|
|
Load the numpy array of a single sample image. |
Предупреждение
По умолчанию изображения кодируются с использованием dtype uint8
для
экономии памяти. Часто алгоритмы машинного обучения работают лучше, если
входные данные сначала преобразуются в представление с плавающей точкой.
Также, если вы планируете использовать matplotlib.pyplpt.imshow
, не забудьте масштабировать
в диапазоне 0 - 1, как это сделано в следующем примере.
7.4.2. Наборы данных в формате svmlight / libsvm¶
scikit-learn включает утилиты для загрузки наборов данных в формате
svmlight / libsvm. В этом формате каждая строка имеет
вид <label> <feature-id>:<feature-value>
<feature-id>:<feature-value> ...
. Этот формат особенно подходит для разреженных наборов данных.
В этом модуле для X
используются разреженные матрицы scipy CSR, а для y
- массивы numpy.
Вы можете загрузить набор данных следующим образом:
>>> 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])
...
7.4.3. Загрузка наборов данных из репозитория openml.org¶
openml.org - это публичный репозиторий для данных и экспериментов в области машинного обучения, который позволяет всем желающим загружать открытые наборы данных.
Пакет 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'}
DESCR
содержит свободно-текстовое описание данных, а details
содержит
словарь мета-данных, хранящихся в openml, например, id набора
данных. Для получения более подробной информации см. документацию
OpenML <https://docs.openml.org/#data>`_ data_id
набора данных о белках мышей
- 40966, и вы можете использовать его (или
название) для получения дополнительной информации о наборе данных на сайте openml:
>>> mice.url
'https://www.openml.org/d/40966'
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'}
7.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'
7.4.3.2. Парсер ARFF¶
Начиная с версии 1.2, scikit-learn предоставляет новый аргумент
ключевого слова parser
, который предоставляет несколько опций для
разбора ARFF-файлов, предоставляемых OpenML. Унаследованный парсер (т.е. parser="liac-arff"
)
основан на проекте LIAC-ARFF. Однако этот парсер
работает медленно и потребляет больше памяти, чем требуется.
Новый парсер, основанный на pandas (т.е. parser="pandas"
), работает
быстрее и занимает больше памяти. Однако этот парсер
не поддерживает разреженные данные. Поэтому мы рекомендуем использовать
parser="auto"
, который будет использовать лучший парсер, доступный для запрашиваемого набора данных.
Парсеры "pandas"
и "liac-arff"
могут приводить к различным типам
данных в выходных данных. Заметные различия заключаются в следующем:
Парсер
"liac-arff"
всегда кодирует категориальные признаки как объектыstr
. Парсер"pandas"
, наоборот, определяет тип при чтении, и числовые категории по возможности преобразуются в целые числа.Парсер
"liac-arff"
использует float64 для кодирования числовых характеристик, помеченных в метаданных как ‘REAL’ и ‘NUMERICAL’. Парсер"pandas"
вместо этого определяет, соответствуют ли эти числовые характеристики целым числам, и использует dtype расширения panda’s Integer.В частности, наборы данных классификации с целочисленными категориями обычно загружаются в виде
(0, 1, ...)
с помощью парсера"pandas"
, в то время как"liac-arff"
заставит использовать метки классов в строковой кодировке, такие как"0"
,"1"
и так далее.Парсер
"pandas"
не будет удалять одинарные кавычки - т.е.'
- из строковых столбцов. Например, строка'my string'
будет сохранена как есть, в то время как парсер'liac-arff'
будет удалять одинарные кавычки. Для категориальных столбцов одинарные кавычки удаляются из значений.
Кроме того, при использовании as_frame=False
парсер "liac-arff"
возвращает ординарно закодированные данные, где категории представлены
в атрибуте categories
экземпляра Bunch
. Вместо этого
"pandas"
возвращает массив NumPy, содержащий категории. После
этого пользователь может сам разработать конвейер обработки
признаков с помощью экземпляра OneHotEncoder
или OrdinalEncoder
,
обычно обернутого в ColumnTransformer
для явной предварительной обработки категориальных столбцов. См. например: Column Transformer with Mixed Types.
7.4.4. Загрузка из внешних наборов данных¶
scikit-learn работает с любыми числовыми данными, хранящимися в виде массивов numpy или разреженных матриц scipy. Другие типы, конвертируемые в числовые массивы, такие как pandas DataFrame, также приемлемы.
Вот несколько рекомендуемых способов загрузки стандартных столбцовых данных в формат, пригодный для использования scikit-learn:
pandas.io предоставляет инструменты для чтения данных из распространенных форматов, включая CSV, Excel, JSON и SQL. DataFrames также могут быть построены из списков кортежей или dicts. Pandas легко справляется с разнородными данными и предоставляет инструменты для манипулирования и преобразования в числовой массив, подходящий для scikit-learn.
scipy.io специализируется на бинарных форматах, часто используемых в контексте научных вычислений, таких как .mat и .arff
numpy/routines.io для стандартной загрузки столбцовых данных в массивы numpy
scikit-learn’s
load_svmlight_file
для формата svmlight или libSVM sparsescikit-learn’s
load_files
для каталогов текстовых файлов, где имя каждого каталога - это имя каждой категории, а каждый файл внутри каждого каталога соответствует одной выборке из этой категории.
Для некоторых разнородных данных, таких как изображения, видео и аудио, вы можете воспользоваться функцией:
skimage.io or Imageio для загрузки изображений и видео в массивы numpy
scipy.io.wavfile.read для чтения WAV-файлов в массив numpy
Категориальные (или номинальные) признаки, хранящиеся в виде строк
(обычные для pandas DataFrames), необходимо преобразовать в числовые
признаки с помощью OneHotEncoder
или OrdinalEncoder
или аналогичных.
See Предварительная обработка данных.
Примечание: если вы работаете с собственными числовыми данными, рекомендуется использовать оптимизированный формат файлов, например HDF5, чтобы сократить время загрузки данных. Различные библиотеки, такие как H5Py, PyTables и pandas, предоставляют Python-интерфейс для чтения и записи данных в этом формате.