7.2. Наборы данных реального мира

scikit-learn предоставляет инструменты для загрузки больших наборов данных, при необходимости загружая их.

Их можно загрузить с помощью следующих функций:

fetch_olivetti_faces(*[, data_home, …])Загрузите набор данных лиц Olivetti от AT&T (классификация).
fetch_20newsgroups(*[, data_home, subset, …])Загрузите имена файлов и данные из набора данных 20 групп новостей (классификация).
fetch_20newsgroups_vectorized(*[, subset, …])Загрузите и векторизуйте набор данных 20 групп новостей (классификация).
fetch_lfw_people(*[, data_home, funneled, …])Загрузите набор данных (классификация) людей с помеченными лицами в дикой природе (LFW).
fetch_lfw_pairs(*[, subset, data_home, …])Загрузите набор данных (классификация) помеченных лиц в дикой природе (LFW).
fetch_covtype(*[, data_home, …])Загрузите набор данных типа обложки (классификация).
fetch_rcv1(*[, data_home, subset, …])Загрузите набор данных с несколькими метками RCV1 (классификация).
fetch_kddcup99(*[, subset, data_home, …])Загрузите набор данных kddcup99 (классификация).
fetch_california_housing(*[, data_home, …])Загрузите набор данных о жилье Калифорнии (регрессия).

7.2.1. Набор данных лица Olivetti

Этот набор данных содержит набор изображений лиц, снятых в период с апреля 1992 г. по апрель 1994 г. в AT&T Laboratories Cambridge. sklearn.datasets.fetch_olivetti_faces Функция выборки / кэширования функцию , которая загружает архив данных от AT & T данные.

Как описано на исходном веб-сайте:

Есть десять различных изображений каждого из 40 различных предметов. Для некоторых объектов изображения были сделаны в разное время, варьируя освещение, выражение лица (открытые / закрытые глаза, улыбающийся / не улыбающийся) и детали лица (очки / без очков). Все изображения были сделаны на темном однородном фоне, когда испытуемые находились в вертикальном фронтальном положении (с допуском на некоторое боковое движение).

Характеристики набора данных:

Классы40
Всего образцов400
Размерность4096
Функцииреальный, от 0 до 1

Изображение квантуется до 256 уровней серого и сохраняется в виде 8-битных целых чисел без знака; загрузчик преобразует их в значения с плавающей запятой на интервале [0, 1], с которыми легче работать для многих алгоритмов.

«Цель» для этой базы данных — это целое число от 0 до 39, указывающее личность изображенного человека; однако, имея всего 10 примеров на класс, этот относительно небольшой набор данных более интересен с точки зрения неконтролируемого или полууправляемого обучения.

Исходный набор данных состоял из 92 x 112, в то время как версия, доступная здесь, состоит из изображений 64×64.

При использовании этих изображений, пожалуйста, отдайте должное AT&T Laboratories Cambridge.

7.2.2. Набор текстовых данных 20 групп новостей

Набор данных 20 групп новостей включает около 18000 сообщений групп новостей по 20 темам, разделенных на два подмножества: один для обучения (или разработки), а другой для тестирования (или для оценки производительности). Разделение между поездом и набором тестов основано на сообщениях, отправленных до и после определенной даты.

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

Характеристики набора данных:

Классы20
Всего образцов18846
Размерность1
Функциитекст

7.2.2.1. Использование

Эта sklearn.datasets.fetch_20newsgroups функция представляет собой функцию выборки / кэширования данных, которая загружает архив данных с оригинального веб-сайта 20 групп новостей , извлекает содержимое архива в ~/scikit_learn_data/20news_home папку и вызывает sklearn.datasets.load_files либо папку обучающего, либо тестового набора, либо оба из них:

>>> from sklearn.datasets import fetch_20newsgroups
>>> newsgroups_train = fetch_20newsgroups(subset='train')

>>> from pprint import pprint
>>> pprint(list(newsgroups_train.target_names))
['alt.atheism',
 'comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x',
 'misc.forsale',
 'rec.autos',
 'rec.motorcycles',
 'rec.sport.baseball',
 'rec.sport.hockey',
 'sci.crypt',
 'sci.electronics',
 'sci.med',
 'sci.space',
 'soc.religion.christian',
 'talk.politics.guns',
 'talk.politics.mideast',
 'talk.politics.misc',
 'talk.religion.misc']

Ложь реальных данных в filenamesи targetатрибутах. Целевой атрибут — это целочисленный индекс категории:

>>> newsgroups_train.filenames.shape
(11314,)
>>> newsgroups_train.target.shape
(11314,)
>>> newsgroups_train.target[:10]
array([ 7,  4,  4,  1, 14, 16, 13,  3,  2,  4])

Можно загрузить только подвыбор категорий, передав список категорий для загрузки в sklearn.datasets.fetch_20newsgroups функцию:

>>> cats = ['alt.atheism', 'sci.space']
>>> newsgroups_train = fetch_20newsgroups(subset='train', categories=cats)

>>> list(newsgroups_train.target_names)
['alt.atheism', 'sci.space']
>>> newsgroups_train.filenames.shape
(1073,)
>>> newsgroups_train.target.shape
(1073,)
>>> newsgroups_train.target[:10]
array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0])

7.2.2.2. Преобразование текста в векторы

Чтобы наполнить прогнозные модели или модели кластеризации текстовыми данными, сначала необходимо преобразовать текст в векторы числовых значений, пригодные для статистического анализа. Это может быть достигнуто с помощью утилит, sklearn.feature_extraction.textкак показано в следующем примере, которые извлекают векторы TF-IDF токенов unigram из подмножества 20news:

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> categories = ['alt.atheism', 'talk.religion.misc',
...               'comp.graphics', 'sci.space']
>>> newsgroups_train = fetch_20newsgroups(subset='train',
...                                       categories=categories)
>>> vectorizer = TfidfVectorizer()
>>> vectors = vectorizer.fit_transform(newsgroups_train.data)
>>> vectors.shape
(2034, 34118)

Извлеченные векторы TF-IDF очень разрежены, в среднем 159 ненулевых компонентов по выборке в более чем 30000-мерном пространстве (менее 0,5% ненулевых функций):

>>> vectors.nnz / float(vectors.shape[0])
159.01327...

sklearn.datasets.fetch_20newsgroups_vectorized — это функция, которая возвращает готовые к использованию функции подсчета токенов вместо имен файлов.

7.2.2.3. Фильтрация текста для более реалистичного обучения

Классификатору легко приспособиться к определенным вещам, которые появляются в данных 20 групп новостей, например, к заголовкам групп новостей. Многие классификаторы достигают очень высоких оценок F, но их результаты не могут быть обобщены на другие документы, выходящие за рамки этого временного окна.

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

>>> from sklearn.naive_bayes import MultinomialNB
>>> from sklearn import metrics
>>> newsgroups_test = fetch_20newsgroups(subset='test',
...                                      categories=categories)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> clf = MultinomialNB(alpha=.01)
>>> clf.fit(vectors, newsgroups_train.target)
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)

>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(newsgroups_test.target, pred, average='macro')
0.88213...

(В примере « Классификация текстовых документов с использованием разреженных функций» происходит перемешивание обучающих и тестовых данных вместо сегментации по времени, и в этом случае полиномиальный Наивный Байес получает гораздо более высокий F-балл 0,88. Вы еще не подозреваете, что происходит внутри этого? классификатор?)

Давайте посмотрим, какие функции наиболее информативны:

>>> import numpy as np
>>> def show_top10(classifier, vectorizer, categories):
...     feature_names = np.asarray(vectorizer.get_feature_names())
...     for i, category in enumerate(categories):
...         top10 = np.argsort(classifier.coef_[i])[-10:]
...         print("%s: %s" % (category, " ".join(feature_names[top10])))
...
>>> show_top10(clf, vectorizer, newsgroups_train.target_names)
alt.atheism: edu it and in you that is of to the
comp.graphics: edu in graphics it is for and of to the
sci.space: edu it that is in and space to of the
talk.religion.misc: not it you in is that and to of the

Теперь вы можете увидеть многие вещи, которым эти функции лучше всего подходят:

  • Практически каждая группа отличается тем, что заголовки, такие как NNTP-Posting-Host: и, Distribution: появляются чаще или реже.
  • Еще одна важная особенность связана с тем, является ли отправитель аффилированным лицом к университету, о чем свидетельствуют заголовки или подпись.
  • Слово «статья» — важная особенность, основанная на том, как часто люди цитируют предыдущие сообщения, например: «В статье [идентификатор статьи], [имя] <[адрес электронной почты]> написал:»
  • Другие функции соответствуют именам и адресам электронной почты конкретных людей, которые публиковали сообщения в то время.

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

По этой причине функции, загружающие данные 20 групп новостей, предоставляют параметр с именем remove , сообщающий ему, какие виды информации нужно удалить из каждого файла. remove должен быть кортежем, содержащим любое подмножество из (‘headers’, ‘footers’, ‘quotes’), с указанием удалить заголовки, блоки подписи и блоки цитат соответственно.

>>> newsgroups_test = fetch_20newsgroups(subset='test',
...                                      remove=('headers', 'footers', 'quotes'),
...                                      categories=categories)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(pred, newsgroups_test.target, average='macro')
0.77310...

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

>>> newsgroups_train = fetch_20newsgroups(subset='train',
...                                       remove=('headers', 'footers', 'quotes'),
...                                       categories=categories)
>>> vectors = vectorizer.fit_transform(newsgroups_train.data)
>>> clf = MultinomialNB(alpha=.01)
>>> clf.fit(vectors, newsgroups_train.target)
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(newsgroups_test.target, pred, average='macro')
0.76995...

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

Рекомендация

При оценке текстовых классификаторов для данных 20 групп новостей следует удалить метаданные, относящиеся к группам новостей. В scikit-learn вы можете сделать это, установив remove=(‘headers’, ‘footers’, ‘quotes’). Оценка F будет ниже, потому что это более реалистично.

7.2.3. Помеченные лица в наборе данных по распознаванию лиц Wild

Этот набор данных представляет собой коллекцию изображений известных людей в формате JPEG, собранных через Интернет, все подробности доступны на официальном сайте:

http://vis-www.cs.umass.edu/lfw/

Каждое изображение сосредоточено на одном лице. Типичная задача называется Face Verification: для пары двух изображений двоичный классификатор должен предсказать, принадлежат ли эти два изображения одному и тому же человеку.

Альтернативная задача, «Распознавание лиц» или «Идентификация лиц»: по изображению лица неизвестного человека определить имя человека, обратившись к галерее ранее увиденных изображений идентифицированных лиц.

И проверка лиц, и распознавание лиц — это задачи, которые обычно выполняются на выходе модели, обученной выполнять обнаружение лиц. Самая популярная модель для распознавания лиц называется Виола-Джонса и реализована в библиотеке OpenCV. Лица LFW были извлечены этим детектором лиц с различных онлайн-сайтов.

Характеристики набора данных:

Классы5749
Всего образцов13233
Размерность5828
Функцииреальный, от 0 до 255

7.2.3.1. Использование

scikit-learn предоставляет два загрузчика, которые автоматически загружают, кэшируют, анализируют файлы метаданных, декодируют jpeg и преобразуют интересные фрагменты в запомненные массивы numpy. Размер этого набора данных превышает 200 МБ. Первая загрузка обычно занимает более пары минут, чтобы полностью декодировать соответствующую часть файлов JPEG в несколько массивов. Если набор данных был загружен один раз, в следующие разы время загрузки составляет менее 200 мс с использованием запомненной версии, запомненной на диске в ~/scikit_learn_data/lfw_home/ папке с использованием joblib.

Первый загрузчик используется для задачи идентификации лиц: задачи классификации нескольких классов (следовательно, контролируемое обучение):

>>> from sklearn.datasets import fetch_lfw_people
>>> lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

>>> for name in lfw_people.target_names:
...     print(name)
...
Ariel Sharon
Colin Powell
Donald Rumsfeld
George W Bush
Gerhard Schroeder
Hugo Chavez
Tony Blair

Срез по умолчанию представляет собой прямоугольную форму вокруг лица, удаляя большую часть фона:

>>> lfw_people.data.dtype
dtype('float32')

>>> lfw_people.data.shape
(1288, 1850)

>>> lfw_people.images.shape
(1288, 50, 37)

Каждому из 1140 лиц назначается отдельный идентификатор человека в target массиве:

>>> lfw_people.target.shape
(1288,)

>>> list(lfw_people.target[:10])
[5, 6, 3, 1, 0, 1, 3, 4, 3, 0]

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

>>> from sklearn.datasets import fetch_lfw_pairs
>>> lfw_pairs_train = fetch_lfw_pairs(subset='train')

>>> list(lfw_pairs_train.target_names)
['Different persons', 'Same person']

>>> lfw_pairs_train.pairs.shape
(2200, 2, 62, 47)

>>> lfw_pairs_train.data.shape
(2200, 5828)

>>> lfw_pairs_train.target.shape
(2200,)

Как для функции, так sklearn.datasets.fetch_lfw_people и для sklearn.datasets.fetch_lfw_pairs функции можно получить дополнительное измерение с цветовыми каналами RGB, передавая color=True, в этом случае форма будет иметь вид .(2200, 2, 62, 47, 3)

Эти sklearn.datasets.fetch_lfw_pairs наборы данные подразделяются на 3 подмножество: разработка train набор, разработка test набор и оценка 10_folds набор предназначен для вычисления метрик производительности с использованием 10-складывает перекрестную схему проверки.

Рекомендации

7.2.3.2. Примеры

Пример распознавания лиц с использованием собственных лиц и SVM

7.2.4. Виды лесного покрова

Образцы в этом наборе данных соответствуют участкам леса 30 × 30 м в США, собранным для задачи прогнозирования типа покрытия каждого участка, то есть доминирующих видов деревьев. Существует семь типов обложек, что делает эту задачу мультиклассовой классификацией. Каждый образец имеет 54 функции, описанные на домашней странице набора данных . Некоторые из функций являются логическими индикаторами, а другие — дискретными или непрерывными измерениями.

Характеристики набора данных:

Классы7
Всего образцов581012
Размерность54
Функцииint

sklearn.datasets.fetch_covtype загрузит набор данных covertype; он возвращает подобный словарю объект Bunch с матрицей признаков в data члене и целевыми значениями в target. Если необязательный аргумент «as_frame» установлен в «True», он возвращает data и target в панд кадра данных, и будет являться дополнительным членом , frame а также. При необходимости набор данных будет загружен из Интернета.

7.2.5. Набор данных RCV1

Reuters Corpus Volume I (RCV1) — это архив из более чем 800 000 вручную категоризированных новостных лент, предоставленных Reuters, Ltd. для исследовательских целей. Набор данных подробно описан в 1 .

Характеристики набора данных:

Классы103
Всего образцов804414
Размерность47236
Функцииреальный, от 0 до 1

sklearn.datasets.fetch_rcv1 загрузит следующую версию: RCV1-v2, векторы, полные наборы, темы с несколькими ярлыками:

>>> from sklearn.datasets import fetch_rcv1
>>> rcv1 = fetch_rcv1()

Он возвращает объект, подобный словарю, со следующими атрибутами:

data: Матрица функций — это scipy разреженная матрица CSR с 804414 образцами и 47236 функциями. Ненулевые значения содержат нормализованные по косинусу логарифмические векторы TF-IDF. Предлагается почти хронологическое разделение на 1 : первые 23149 выборок являются обучающей выборкой. Последние 781265 образцов — это набор для тестирования. Это следует за официальным хронологическим разделением LYRL2004. В массиве 0,16% ненулевых значений:

>>> rcv1.data.shape
(804414, 47236)

target: Целевые значения хранятся в scipy разреженной матрице CSR с 804414 выборками и 103 категориями. Каждый образец имеет значение 1 в своих категориях и 0 в других. В массиве 3,15% ненулевых значений:

>>> rcv1.target.shape
(804414, 103)

sample_id: Каждый образец можно идентифицировать по его идентификатору в диапазоне (с пробелами) от 2286 до 810596:

>>> rcv1.sample_id[:3]
array([2286, 2287, 2288], dtype=uint32)

target_names: Целевые значения — это темы каждого образца. Каждый образец относится как минимум к одной теме, но не более чем к 17 темам. Всего 103 темы, каждая из которых представлена ​​строкой. Частота их корпуса составляет пять порядков, от 5 для GMIL до 381327 для CCAT:

>>> rcv1.target_names[:3].tolist()  
['E11', 'ECAT', 'M11']

При необходимости набор данных будет загружен с домашней страницы rcv1. Сжатый размер составляет около 656 МБ.

Рекомендации

1  Льюис, Д.Д., Янг, Ю., Роуз, Т.Г., и Ли, Ф. (2004). RCV1: новая коллекция тестов для исследования категоризации текста. Журнал исследований в области машинного обучения, 5, 361-397.

7.2.6. Набор данных Kddcup 99

Набор данных KDD Cup ’99 был создан путем обработки частей tcpdump из набора данных DARPA Intrusion Detection System (IDS) 1998 года, созданного MIT Lincoln Lab 2 . Искусственные данные (описанные на домашней странице набора данных ) были сгенерированы с использованием закрытой сети и вручную введенных атак, чтобы произвести большое количество различных типов атак с нормальной активностью в фоновом режиме. Поскольку первоначальная цель состояла в том, чтобы создать большой обучающий набор для алгоритмов контролируемого обучения, существует большая часть (80,1%) аномальных данных, которые нереальны в реальном мире и не подходят для неконтролируемого обнаружения аномалий, направленного на обнаружение «аномальных» данных. то есть:

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

Таким образом, мы преобразуем набор данных KDD в два разных набора данных: SA и SF.

  • SA получается простым выбором всех нормальных данных, а небольшая часть аномальных данных дает долю аномалий в 1%.
  • SF получается, как в пункте 3, путем простого сбора данных, атрибут logged_in положительный, таким образом сосредоточиваясь на атаке вторжения, что дает долю атаки 0,3%.
  • http и smtp — это два подмножества SF, соответствующие третьей функции, равной http (соответственно, smtp).

Общая структура KDD:

сего образцов4898431
Размерность41 год
Функциидискретный (int) или непрерывный (float)
Целиstr, «нормальный». или название типа аномалии

Структура SA:

Всего образцов976158
Размерность41 год
Функциидискретный (int) или непрерывный (float)
Целиstr, «нормальный». или название типа аномалии

Состав SF:

Всего образцов699691
Размерность4
Функциидискретный (int) или непрерывный (float)
Целиstr, «нормальный». или название типа аномалии

структура http:

Всего образцов619052
Размерность3
Функциидискретный (int) или непрерывный (float)
Целиstr, «нормальный». или название типа аномалии

структура smtp:

Всего образцов95373
Размерность3
Функциидискретный (int) или непрерывный (float)
Целиstr, «нормальный». или название типа аномалии

sklearn.datasets.fetch_kddcup99 загрузит набор данных kddcup99; он возвращает объект, подобный словарю, с матрицей признаков в data члене и целевыми значениями в target. Необязательный аргумент «as_frame» преобразует data в pandas DataFrame и target в pandas Series. При необходимости набор данных будет загружен из Интернета.

Рекомендации

  1. Анализ и результаты оценки обнаружения вторжений в автономном режиме DARPA 1999 г., Ричард Липпманн, Джошуа В. Хейнс, Дэвид Дж. Фрид, Джонатан Корба, Кумар Дас.
  2. К. Яманиши, Ж.-И. Такеучи, Дж. Уильямс и П. Милн. Онлайн-обнаружение неконтролируемых выбросов с использованием конечных смесей с дисконтирующими алгоритмами обучения. В материалах шестой международной конференции ACM SIGKDD по обнаружению знаний и интеллектуальному анализу данных, страницы 320-324. ACM Press, 2000.

7.2.7. Набор данных California Housing

Характеристики набора данных:

Количество экземпляров  20640

Количество атрибутов  8 числовых, прогнозных атрибутов и цель

Информация об атрибутах:

  • Медианный доход MedInc в блоке
  • HouseAge средний возраст дома в блоке
  • Среднее количество комнат в AveRooms
  • Среднее количество спален AveBedrms
  • Население блока населения
  • Средняя заполняемость дома AveOccup
  • Широта дома блок широта
  • Долгота долгота блока дома

Отсутствующие значения атрибутов Нет

Этот набор данных был получен из репозитория StatLib. http://lib.stat.cmu.edu/datasets/

Целевая переменная — это средняя стоимость дома для округов Калифорнии.

Этот набор данных был получен из переписи населения США 1990 года с использованием одной строки на каждую блочную группу переписи. Блочная группа — это наименьшая географическая единица, для которой Бюро переписи США публикует выборочные данные (блочная группа обычно насчитывает от 600 до 3000 человек).

Его можно скачать / загрузить с помощью sklearn.datasets.fetch_california_housing функции.

Рекомендации

  • Пейс, Р. Келли и Рональд Барри, Разреженные пространственные авторегрессии, статистика и вероятностные письма, 33 (1997) 291-297.