Известные наборы данных — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
 
(не показано 65 промежуточных версий 11 участников)
Строка 1: Строка 1:
Известные наборы данных
+
==Обзор==
  
==MNIST==
+
Для многих алгоритмов машинного обучения требуется большое количество данных. Кроме того, что моделям нужны данные для обучения, нужно сравнивать эффективность разных моделей. Поскольку поиск хороших наборов данных и их разметка {{---}} трудная задача, на помощь приходят уже собранные и размеченные наборы данных, для которых зачастую уже опубликованы результаты каких-то алгоритмов, и можно оценить, насколько хорошо работает исследуемая модель.
===Описание===
 
  
[[Файл:MnistExamples.png|мини]]
+
В этой статье рассмотрены с примерами несколько популярных наборов данных. Другие классические наборы можно посмотреть, например, на википедии<ref>https://en.wikipedia.org/wiki/List_of_datasets_for_machine-learning_research[https://en.wikipedia.org/wiki/List_of_datasets_for_machine-learning_research]</ref>.
  
Датасет MNIST {{---}} большой (порядка 60 000 тренировочных и 10 000 проверочных объектов) набор картинок с рукописными цифрами, часто используемый для тестирования различных алгоритмов распознавания образов. Он содержит черно-белые картинки размера 28x28 пикселей, исходно взятые из набора образков из бюро переписи населения США, к которым были добавлены тестовые образцы, написанные студентами американских университетов.
 
  
===Результаты===
+
{| class="wikitable"
 +
|-
 +
! Набор данных
 +
! Какие объекты
 +
! Число объектов
 +
! Число классов
 +
! Доля ошибок лучшего опубликованного алгоритма
 +
|-
 +
| Iris
 +
| Данные измерений четырех параметров цветков ириса
 +
| 150
 +
| 3
 +
| N/A, малый размер набора данных
 +
|-
 +
| MNIST
 +
| Рукописные цифры, черно-белые изображения 32х32 пикселя
 +
| 70 000
 +
| 10
 +
| 0.18% <ref>https://arxiv.org/pdf/1805.01890.pdf[https://arxiv.org/pdf/1805.01890.pdf]</ref>
 +
|-
 +
| CIFAR-10
 +
| Фотографии объектов разных классов, цветные изображения 32х32 пикселя
 +
| 60 000
 +
| 10
 +
| 1.23% <ref>https://arxiv.org/pdf/1805.09501.pdf[https://arxiv.org/pdf/1805.09501.pdf]</ref>
 +
|-
 +
| ImageNet
 +
| Фотографии с указанием классов объектов на изображении и их позиций
 +
| Больше 14 миллионов
 +
| Больше 21 тысячи
 +
| Большое количество различных метрик, см. ImageNet Competition. 1-5% на классификацию
 +
|-
 +
| Coco
 +
| Фотографии сложных повседневных сцен, содержащих объекты в их естественном окружении.
 +
| 328 000 изображений (более 2.5 миллионов вхождений объектов)
 +
| 91
 +
| Много метрик. Зависит, в частности, от площади, занимаемой объектом на изображении. <ref>http://cocodataset.org/#detection-leaderboard[http://cocodataset.org/#detection-leaderboard]</ref>
 +
|-
 +
| Fashion-MNIST
 +
| Черно-белые фотографии различных видов одежды, 28x28 пикселей.
 +
| 60000 изображений + 10000 тестовых изображений
 +
| 10
 +
| 3.3% (WRN40-4 8.9M params) <ref>https://github.com/zalandoresearch/fashion-mnist[https://github.com/zalandoresearch/fashion-mnist]</ref>
 +
|-
 +
|-
 +
| Boston housing
 +
| Данные о недвижимости в районах Бостона.
 +
| 506
 +
| 13
 +
| RMSE-1.33055
 +
|-
  
На сайте<ref>[http://yann.lecun.com/exdb/mnist/]</ref> датасета можно найти список лучших результатов, достигнутых алгоритмами на это наборе данных. Так, худший из записанных результатов достигнут простым линейным классификатором (12% ошибок), а подавляющее большинство лучших результатов получены алгоритмами на основе нейронных сетей. Так, ансамбль из 35 сверточных нейронных сетей в 2012 году сумел получить всего 0.23% ошибок на датасете, что является очень хорошим результатом, вполне сравнимым с человеком.
+
|}
 
 
===Код===
 
[[Файл:Mnist-predict.png|мини]]
 
  from sklearn.datasets import fetch_mldata
 
  import random
 
  from sklearn.utils import shuffle
 
  from numpy import arange
 
  mnist = fetch_mldata('MNIST original')
 
  indices = arange(len(mnist.data))
 
  randidx = random.sample(list(indices), 500)
 
  mnist.data = mnist.data[randidx]
 
  mnist.target = mnist.target[randidx]
 
  X = mnist.data
 
  Y = mnist.target
 
  train = len(X)//2
 
  clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 
  clf.fit(X[:train], Y[:train])
 
  expected = Y[train:]
 
  predicted = clf.predict(X[train:])
 
  print("Classification report for classifier %s:\n%s\n"
 
        % (clf, metrics.classification_report(expected, predicted)))
 
 
 
    digit    precision    recall  f1-score  support
 
        0        0.68      0.58      0.62        26
 
        1        0.71      0.87      0.78        23
 
        2        0.29      0.24      0.26        25
 
        3        0.64      0.28      0.39        25
 
        4        0.50      0.54      0.52        28
 
        5        0.46      0.46      0.46        24
 
        6        0.47      0.62      0.54        24
 
        7        0.66      0.78      0.71        27
 
        8        0.32      0.60      0.42        15
 
        9        0.59      0.39      0.47        33
 
  avg/total      0.54      0.53      0.52      250
 
 
 
==CIFAR-10==
 
  
 
==Iris==
 
==Iris==
Строка 87: Строка 99:
  
 
===Код===
 
===Код===
 
 
   from sklearn.datasets import load_iris
 
   from sklearn.datasets import load_iris
  from sklearn import svm, metrics
 
  from sklearn.utils import shuffle
 
 
   from sklearn.ensemble import RandomForestClassifier
 
   from sklearn.ensemble import RandomForestClassifier
  import numpy
+
 
 
   iris=load_iris()
 
   iris=load_iris()
 
   X = iris.data
 
   X = iris.data
Строка 104: Строка 113:
 
   predicted = clf.predict(X[train:])
 
   predicted = clf.predict(X[train:])
 
   print("Classification report for classifier %s:\n%s\n"
 
   print("Classification report for classifier %s:\n%s\n"
      % (clf, metrics.classification_report(expected, predicted)))
+
  % (clf, metrics.classification_report(expected, predicted)))
  
 
       type  precision    recall  f1-score  support
 
       type  precision    recall  f1-score  support
Строка 111: Строка 120:
 
           2      0.88      0.96      0.92        23
 
           2      0.88      0.96      0.92        23
 
   avg / total    0.95      0.95      0.95        75
 
   avg / total    0.95      0.95      0.95        75
 +
 +
 +
==MNIST==
 +
===Описание===
 +
 +
[[Файл:MnistExamples.png|мини|[https://en.wikipedia.org/wiki/MNIST_database#/media/File:MnistExamples.png Оригинал]]]
 +
 +
Набор данных MNIST {{---}} большой (порядка 60 000 тренировочных и 10 000 проверочных объектов, помеченных на принадлежность одному из десяти классов {{---}} какая цифра изображена на картинке) набор картинок с рукописными цифрами, часто используемый для тестирования различных алгоритмов распознавания образов. Он содержит черно-белые картинки размера 28x28 пикселей, исходно взятые из набора образцов из бюро переписи населения США, к которым были добавлены тестовые образцы, написанные студентами американских университетов.
 +
 +
===Результаты===
 +
 +
На сайте<ref>http://yann.lecun.com/exdb/mnist/[http://yann.lecun.com/exdb/mnist/]</ref> MNIST можно найти список лучших результатов, достигнутых алгоритмами на это наборе данных. Так, худший из записанных результатов достигнут простым линейным классификатором (12% ошибок), а подавляющее большинство лучших результатов получены алгоритмами на основе нейронных сетей. Так, ансамбль из 35 сверточных нейронных сетей в 2012 году сумел получить всего 0.23% ошибок на наборе данных, что является очень хорошим результатом, вполне сравнимым с человеком.
 +
 +
===Код===
 +
Простой пример, скачивающий набор данных и запускающий на нем один из классификаторов. Даже с уменьшением набора данных в сто раз и не самым подходящим классификатором точность выше половины угаданных цифр {{---}} заметно лучше, чем случайная разметка.
 +
 +
 +
  from sklearn.datasets import fetch_mldata
 +
  from numpy import arange
 +
  import random
 +
  from sklearn.tree import DecisionTreeClassifier
 +
  from sklearn import datasets, svm, metrics
 +
 +
[[Файл:Mnist-predict.png|мини]]
 +
 +
  mnist = fetch_mldata('MNIST original')
 +
  indices = arange(len(mnist.data))
 +
  randidx = random.sample(list(indices), 500)
 +
  mnist.data = mnist.data[randidx]
 +
  mnist.target = mnist.target[randidx]
 +
  X = mnist.data
 +
  Y = mnist.target
 +
  train = len(X)//2
 +
  clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 +
  clf.fit(X[:train], Y[:train])
 +
  expected = Y[train:]
 +
  predicted = clf.predict(X[train:])
 +
  print("Classification report for classifier %s:\n%s\n"
 +
    % (clf, metrics.classification_report(expected, predicted)))
 +
 +
    digit    precision    recall  f1-score  support
 +
        0        0.68      0.58      0.62        26
 +
        1        0.71      0.87      0.78        23
 +
        2        0.29      0.24      0.26        25
 +
        3        0.64      0.28      0.39        25
 +
        4        0.50      0.54      0.52        28
 +
        5        0.46      0.46      0.46        24
 +
        6        0.47      0.62      0.54        24
 +
        7        0.66      0.78      0.71        27
 +
        8        0.32      0.60      0.42        15
 +
        9        0.59      0.39      0.47        33
 +
  avg/total      0.54      0.53      0.52      250
 +
 +
==CIFAR-10==
 +
 +
===Описание===
 +
[[Файл:Cifar-10.png|мини|[https://medium.com/@jannik.zuern/training-a-cifar-10-classifier-in-the-cloud-using-tensorflow-and-google-colab-f3a5fbdfe24d Источник]]]
 +
CIFAR-10 (Canadian Institute For Advanced Research) {{---}} еще один большой набор изображений, который обычно используется для тестирования алгоритмов машинного обучения. Он содержит 60 000 цветных картинок размером 32х32 пикселя, размеченных в один из десяти классов: самолеты, автомобили, коты, олени, собаки, лягушки, лошади, корабли и грузовики. В наборе данных по 6000 картинок каждого класса. CIFAR-10 является размеченным подмножеством заметно большего набора данных, состоящего примерно из восьмидесяти миллионов изображений.
 +
 +
===Результаты===
 +
 +
С момента публикации CIFAR-10 вышло много статей, авторы которых пытаются добиться максимальной точности на этом наборе данных. В среднем более хорошие результаты показывают различные сверточные нейронные сети с различными вариантами настройки и дополнительной предобработки данных.
 +
 +
На википедии<ref>https://en.wikipedia.org/wiki/CIFAR-10#Research_Papers_Claiming_State-of-the-Art_Results_on_CIFAR-10[https://en.wikipedia.org/wiki/CIFAR-10#Research_Papers_Claiming_State-of-the-Art_Results_on_CIFAR-10]</ref>  можно найти таблицу лучших публикаций с процентами ошибки на этом наборе данных. Так, лучший на сегодняшний момент алгоритм, опубликованный в мае 2018 года, допускает ошибку всего порядка 1.48%.
 +
 +
 +
===Код===
 +
Простой код, скачивающий CIFAR-10 из интернета и запускающий на нем стандартный классификатор.
 +
 +
  from keras.datasets import cifar10
 +
  from sklearn.utils import shuffle   
 +
 +
  (x_train, y_train), (x_test, y_test) = cifar10.load_data()
 +
  X, Y = shuffle(x_train, y_train)
 +
  n = 1000
 +
  X, Y = X[:n], Y[:n]
 +
  X, Y = X.reshape((n, -1)), Y.reshape((n,))
 +
  train = n // 2
 +
  clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 +
  clf.fit(X[:train], Y[:train])
 +
  expected = Y[train:]
 +
  predicted = clf.predict(X[train:])
 +
  print("Classification report for classifier %s:\n%s\n"
 +
  % (clf, metrics.classification_report(expected, predicted)))
  
  
 
==ImageNet==
 
==ImageNet==
 +
 +
===Описание===
 +
[[Файл:Imagenet.png|мини|[http://www.image-net.org/challenges/LSVRC/2014/ Источник]]]
 +
 +
База данных Imagenet {{---}} проект по созданию и сопровождению массивной базы данных аннотированных изображений. Аннотация изображений происходит путем краудсорсинга сообществом. Из-за этого достигается большое количество размеченных данных.
 +
 +
Особенность данного набора данных {{---}} про каждую картинку известно несколько фактов вида "в этом прямоугольнике есть автомобиль", что в совокупности с индексом по типам объектов, которые есть на изображениях, позволяет обучить алгоритм для распознавания объектов какой-то конкретной категории. На август 2017 года в ImageNet 14 197 122 изображения, разбитых на 21 841 категорию.
 +
 +
===Imagenet Challenge===
 +
 +
[[Файл:Imagenet-contest.png|мини|[https://en.wikipedia.org/wiki/File:ImageNet_error_rate_history_(just_systems).svg Оригинал]]]
 +
 +
Вместе с публикацией набора данных стартовал конкурс ImageNet Large Scale Visual Recognition Challenge (ILSVRC<ref>http://www.image-net.org/challenges/LSVRC/[http://www.image-net.org/challenges/LSVRC/]</ref>). В его рамках участникам предлагается достигнуть наибольшей точности при классификации набора изображений. Организаторы использовали около тысячи различных категорий объектов, которые нужно классифицировать. На примере этого конкурса хорошо видно, как в 2010-е годы люди научились заметно лучше распознавать образы на изображениях, уже в 2017 году большинство участвующих команд преодолели порог в 95% правильных ответов. Эта задача, проблема компьютерного зрения, имеет огромное практическое значение во многих прикладных областях.
 +
 +
 +
==COCO==
 +
 +
===Описание===
 +
 +
[[Файл:Coco-examples.jpg|мини|Пример изображений из MS Coco [http://cocodataset.org/images/coco-examples.jpg Оригинал]]]
 +
 +
MS COCO (англ. ''Common Objects in Context'') {{---}} большой набор изображений. Состоит из более чем 330000 изображений (220000  {{---}} размеченных), с более чем 1.5 милионов объектов на них. Все объекты находятся в их естественном окружении (контексте). Изображения, как правило, содержат объекты разных классов (только 10% имеют единственный класс). Все изображения сопровождаются аннотациями, хранящихся в json формате. Подробнее о структуре аннотаций можно прочитать [http://cocodataset.org/#format-data здесь].
 +
 +
COCO имеет пять типов аннотаций для разных задач:
 +
* [[Задача нахождения объектов на изображении]]<tex>^\star</tex>
 +
* Обнаружение ключевых точек. Обнаружение объектов и локализация их ключевых точек.
 +
* Сегментация окружения (англ. ''Stuff Segmentation''). В отличии от задачи обнаружения объектов (человек, кот, машина), здесь внимание фокусируется на том, что его окружает (трава, стена, небо). Метки классов организованы в иерархическом порядке (напр., ''stuff → outdoor-stuff → sky → clouds''). Чтобы добиться совместимости с задачей обнаружения объектов, используются следующие идентификаторы категорий:
 +
 +
{| class="wikitable"
 +
|-
 +
! Идентификатор
 +
! Соответствие
 +
|-
 +
|1-91 || категории объектов (не используются в сегментации окружения)
 +
|-
 +
|92-182 || категории окружения
 +
|-
 +
|183 || категория "другое" (выбирается для "объектов")
 +
|}
 +
* Паноптическая сегментация (англ. ''Panoptic Segmentation'') {{---}} обединение задач семантической сегментации ([[Сегментация изображений]]) и обнаружения объектов. Задача состоит в том, чтобы классифицировать все пиксели изображения на принадлежность к некоторому классу, а также определить, к какому из экземпляров данного класса они относятся.
 +
* Аннотирование изображения (англ. ''Caption Evaluation''). Генерация сопроводительной подписи к изображению.
 +
 +
===Результаты===
 +
Результат задачи зависит от многих факторов. Например, для задачи обнаружения объекта, наилучшие результаты алгоритмы показывают на крупных объектах.
 +
Более подробно с метриками можно ознакомиться [http://cocodataset.org/#detection-leaderboard здесь].
 +
Приведем лишь результаты детектора [https://arxiv.org/abs/1512.03385 ResNet] (bbox) - победителя 2015 Detection Challenge.
 +
Графики представляют из себя семейство кривых Pressision Recall для различных метрик.
 +
 +
{|align="center"
 +
|-valign="top"
 +
|[[Файл:Detection-analysis-person.jpg|мини|PR кривые для класса "Person" [http://cocodataset.org/images/detection-analysis-person.jpg оригинал]]]
 +
|[[Файл:Detection-analysis-all.jpg|мини|Усредненные значения для всех классов [http://cocodataset.org/images/detection-analysis-all.jpg оригинал]]]
 +
|}
 +
 +
<br>
 +
 +
===Код===
 +
 +
Пример использования [https://github.com/cocodataset COCO API] на python:
 +
 +
  %matplotlib inline
 +
  from pycocotools.coco import COCO
 +
  import numpy as np
 +
  import skimage.io as io
 +
  import matplotlib.pyplot as plt
 +
  import pylab
 +
  pylab.rcParams['figure.figsize'] = (8.0, 10.0)
 +
 
 +
 
 +
  dataDir='..'
 +
  dataType='val2017'
 +
  annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)
 +
 
 +
  coco=COCO(annFile)
 +
 
 +
  cats = coco.loadCats(coco.getCatIds())
 +
  nms=[cat['name'] for cat in cats]
 +
  print('COCO categories: \n{}\n'.format(' '.join(nms)))
 +
 
 +
  nms = set([cat['supercategory'] for cat in cats])
 +
  print('COCO supercategories: \n{}'.format(' '.join(nms)))
 +
 
 +
  # get all images containing given categories, select one at random
 +
  catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
 +
  imgIds = coco.getImgIds(catIds=catIds );
 +
  imgIds = coco.getImgIds(imgIds = [324158])
 +
  img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
 +
 
 +
  # load and display image
 +
  # I = io.imread('%s/images/%s/%s'%(dataDir,dataType,img['file_name']))
 +
  # use url to load image
 +
  I = io.imread(img['coco_url'])
 +
  plt.axis('off')
 +
  plt.imshow(I)
 +
  plt.show()
 +
 +
[[Файл:Coco-1.png |мини| center| [https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocoDemo.ipynb оригинал]]]
 +
 +
  # load and display instance annotations
 +
  plt.imshow(I); plt.axis('off')
 +
  annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
 +
  anns = coco.loadAnns(annIds)
 +
  coco.showAnns(anns)
 +
 +
[[Файл:Coco-2.png|мини|center| [https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocoDemo.ipynb оригинал]]]
 +
 +
==Fashion-MNIST==
 +
 +
===Описание===
 +
[[Файл:FMNIST.png|мини|Пример изображений из Fashion-MNIST]]
 +
Fashion-MNIST {{---}} это набор изображений, взятых из статей [https://jobs.zalando.com/en/tech/?gh_src=nevh2y1 Zalando], состоящий из обучающего набора из 60000 примеров и тестового набора из 10000 примеров. Каждый пример представляет собой черно-белое изображение 28x28, связанное с меткой из 10 классов. Создатели Fashion-MNIST предложили его в качестве прямой замены исходного набора данных MNIST, состоящего из рукописных цифр, для сравнительного анализа алгоритмов машинного обучения. Он имеет одинаковый размер изображения и структуру разделений для обучения и тестирования. Аргументировали необходимость такой замены тем, что исходный набор данных MNIST действительно хорошо отражает возможность алгоритма хоть что-то классифицировать, но если алгоритм работает на стандартном MNIST, он все равно может не сработать на других примерах данных. Также на наборе данных MNIST научились достигать слишком высоких результатов точности (97% для классических алгоритмов машинного обучения и 99.7% для сверточных нейронных сетей), в то время как MNIST не отражает современных сложных проблем компьютерного зрения. Это позволило сделать предположение о том, что набор данных MNIST слишком простой по современным меркам и его требуется заменить.
 +
 +
===Результаты===
 +
 +
На сайте<ref>https://github.com/zalandoresearch/fashion-mnist</ref> набора данных можно найти список лучших результатов, достигнутых алгоритмами на этом наборе данных. Так как задача классификации набора данных Fashion-MNIST сложнее, чем в случае стандартного набора MNIST, в таблице представлены только алгоритмы глубокого обучения, т.к. только для них эта задача имеет смысл. Так, худший из записанных результатов достигнут сверточной нейронной сетью с 3 сверточными слоями и одним слоем пулинга (12.4% ошибок), а подавляющее большинство лучших результатов получены боле сложными архитектурами. Лучший результат был достигнут WRN сетью и составляет всего 3.3% ошибки.
 +
 +
===Код===
 +
 +
Простой код, скачивающий Fashion-MNIST с использованием NumPy и запускающий на нем стандартный классификатор.
 +
 +
  import mnist_reader
 +
  from sklearn.datasets import load_iris
 +
  from sklearn.ensemble import RandomForestClassifier
 +
  from sklearn.utils import shuffle
 +
  x_train, y_train = mnist_reader.load_mnist('data/fashion', kind='train')
 +
  x_test, y_test = mnist_reader.load_mnist('data/fashion', kind='t10k')
 +
  X, Y = shuffle(x_train, y_train)
 +
  n = 1000
 +
  X, Y = X[:n], Y[:n]
 +
  X, Y = X.reshape((n, -1)), Y.reshape((n,))
 +
  train = n // 2
 +
  clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 +
  clf.fit(X[:train], Y[:train])
 +
  expected = Y[train:]
 +
  predicted = clf.predict(X[train:])
 +
  print("Classification report for classifier %s:\n%s\n"
 +
  % (clf, metrics.classification_report(expected, predicted)))
 +
 +
==Boston Housing==
 +
 +
===Описание===
 +
 +
Boston Housing содержит данные, собранные Службой переписи населения США (англ. ''U.S Census Service''), касающиеся недвижимости в районах Бостона. Набор данных состоит из 13 признаков и 506 строк и также предоставляет такую информацию, как уровень преступности (CRIM), ставка налога на недвижимость (TAX), возраст людей, которым принадлежит дом (AGE), соотношение числа учащихся и преподавателей в районе (PTRATIO) и другие. Данный набор данных используется для предсказания следующих целевых переменных: средняя стоимость дома (MEDV) и уровень закиси азота (NOX).
 +
 +
===Результаты===
 +
 +
Для решения задачи предсказания средней стоимости дома используется множественная линейная регрессия. Метрикой качества модели выступает корень из среднеквадратичной ошибки ([[Оценка качества в задачах классификации и регрессии|англ. ''root-mean-square error, RMSE'' ]]). В среднем, значение RMSE на данном наборе данных находится в районе 3,5-5 в зависимости от выбранной модели. Однако на соревновании на сайте [https://www.kaggle.com/sagarnildass/predicting-boston-house-prices Kaggle] пользователь [https://www.kaggle.com/c/boston-housing/leaderboard MayankSatnalika] получил результат 1.33055.
 +
 +
===Код===
 +
 +
Простой код, загружающий набор данных из библиотеки sklearn с использованием NumPy и Pandas и запускающий на нем алгоритм линейной регрессии.
 +
  import pandas as pd
 +
  import numpy as np
 +
  from sklearn.datasets import load_boston
 +
  from sklearn.model_selection import train_test_split
 +
  from sklearn.linear_model import LinearRegression
 +
  from sklearn.metrics import mean_squared_error
 +
  boston_dataset = load_boston()
 +
  boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
 +
  boston['MEDV'] = boston_dataset.target
 +
  X = pd.DataFrame(np.c_[boston['LSTAT'], boston['RM']], columns=['LSTAT', 'RM'])
 +
  Y = boston['MEDV']
 +
  X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=5)
 +
  lin_model = LinearRegression()
 +
  lin_model.fit(X_train, Y_train)
 +
  y_train_predict = lin_model.predict(X_train)
 +
  rmse = (np.sqrt(mean_squared_error(Y_train, y_train_predict)))# 5.6371293350711955
 +
  y_test_predict = lin_model.predict(X_test)
 +
  rmse = (np.sqrt(mean_squared_error(Y_test, y_test_predict)))# 5.13740078470291
 +
 +
 +
 +
==См.также==
 +
* [[Общие понятия]]
 +
* [[Сегментация изображений]]
 +
* [[Задача нахождения объектов на изображении]]
 +
* [[Оценка качества в задачах классификации и регрессии]]
 +
 +
==Примечания==
 +
[[Категория: Машинное обучение]]
 +
[[Категория: Компьютерное зрение]]
 +
[[Категория: Классификация и регрессия]]

Текущая версия на 20:40, 13 февраля 2020

Обзор[править]

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

В этой статье рассмотрены с примерами несколько популярных наборов данных. Другие классические наборы можно посмотреть, например, на википедии[1].


Набор данных Какие объекты Число объектов Число классов Доля ошибок лучшего опубликованного алгоритма
Iris Данные измерений четырех параметров цветков ириса 150 3 N/A, малый размер набора данных
MNIST Рукописные цифры, черно-белые изображения 32х32 пикселя 70 000 10 0.18% [2]
CIFAR-10 Фотографии объектов разных классов, цветные изображения 32х32 пикселя 60 000 10 1.23% [3]
ImageNet Фотографии с указанием классов объектов на изображении и их позиций Больше 14 миллионов Больше 21 тысячи Большое количество различных метрик, см. ImageNet Competition. 1-5% на классификацию
Coco Фотографии сложных повседневных сцен, содержащих объекты в их естественном окружении. 328 000 изображений (более 2.5 миллионов вхождений объектов) 91 Много метрик. Зависит, в частности, от площади, занимаемой объектом на изображении. [4]
Fashion-MNIST Черно-белые фотографии различных видов одежды, 28x28 пикселей. 60000 изображений + 10000 тестовых изображений 10 3.3% (WRN40-4 8.9M params) [5]
Boston housing Данные о недвижимости в районах Бостона. 506 13 RMSE-1.33055

Iris[править]

Описание[править]

Iris — небольшой набор данных для задачи классификации, опубликованный еще в 1936 году Робертом Фишером, используя данные биолога Эдгара Андерсона. В этом наборе данных представлены по 50 описаний цветков одного из трех типов — Ирис щетинистый (Iris setosa), Ирис виргинский (Iris virginica) и Ирис разноцветный (Iris versicolor).

Для каждого цветка измерены четыре величины — длина чашелистника (англ. sepal length), ширина чашелистника (sepal width), длина лепестка (англ. petal length), ширина лепестка (англ. petal width). Все цветки промаркированы одним из трех типов, что позволяет тестировать на нем алгоритмы классификации. Интересное наблюдение — один из классов цветков линейно отделим от двух других.

Пример[править]

Длина чашелистника Ширина чашелистника Длина лепестка Ширина лепестка Класс
5.1 3.5 1.4 0.2 setosa
7.0 3.2 4.7 1.4 versicolor
6.3 3.3 6.0 2.5 virginica

Код[править]

 from sklearn.datasets import load_iris
 from sklearn.ensemble import RandomForestClassifier
 iris=load_iris()
 X = iris.data
 Y = iris.target
 X, Y = shuffle(X, Y)
 n = len(iris.data)
 train = n // 2
 clf = RandomForestClassifier(n_estimators=100, max_depth=2, random_state=0)
 clf.fit(X[:train], Y[:train])
 expected = Y[train:]
 predicted = clf.predict(X[train:])
 print("Classification report for classifier %s:\n%s\n"
  % (clf, metrics.classification_report(expected, predicted)))
      type  precision    recall  f1-score   support
         0       1.00      1.00      1.00        28
         1       0.95      0.88      0.91        24
         2       0.88      0.96      0.92        23
 avg / total     0.95      0.95      0.95        75


MNIST[править]

Описание[править]

Набор данных MNIST — большой (порядка 60 000 тренировочных и 10 000 проверочных объектов, помеченных на принадлежность одному из десяти классов — какая цифра изображена на картинке) набор картинок с рукописными цифрами, часто используемый для тестирования различных алгоритмов распознавания образов. Он содержит черно-белые картинки размера 28x28 пикселей, исходно взятые из набора образцов из бюро переписи населения США, к которым были добавлены тестовые образцы, написанные студентами американских университетов.

Результаты[править]

На сайте[6] MNIST можно найти список лучших результатов, достигнутых алгоритмами на это наборе данных. Так, худший из записанных результатов достигнут простым линейным классификатором (12% ошибок), а подавляющее большинство лучших результатов получены алгоритмами на основе нейронных сетей. Так, ансамбль из 35 сверточных нейронных сетей в 2012 году сумел получить всего 0.23% ошибок на наборе данных, что является очень хорошим результатом, вполне сравнимым с человеком.

Код[править]

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


 from sklearn.datasets import fetch_mldata
 from numpy import arange
 import random
 from sklearn.tree import DecisionTreeClassifier
 from sklearn import datasets, svm, metrics
Mnist-predict.png
 mnist = fetch_mldata('MNIST original')
 indices = arange(len(mnist.data))
 randidx = random.sample(list(indices), 500)
 mnist.data = mnist.data[randidx]
 mnist.target = mnist.target[randidx]
 X = mnist.data
 Y = mnist.target
 train = len(X)//2
 clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 clf.fit(X[:train], Y[:train])
 expected = Y[train:]
 predicted = clf.predict(X[train:])
 print("Classification report for classifier %s:\n%s\n"
    % (clf, metrics.classification_report(expected, predicted)))
   digit    precision    recall  f1-score   support
       0         0.68      0.58      0.62        26
       1         0.71      0.87      0.78        23
       2         0.29      0.24      0.26        25
       3         0.64      0.28      0.39        25
       4         0.50      0.54      0.52        28
       5         0.46      0.46      0.46        24
       6         0.47      0.62      0.54        24
       7         0.66      0.78      0.71        27
       8         0.32      0.60      0.42        15
       9         0.59      0.39      0.47        33
 avg/total       0.54      0.53      0.52       250

CIFAR-10[править]

Описание[править]

CIFAR-10 (Canadian Institute For Advanced Research) — еще один большой набор изображений, который обычно используется для тестирования алгоритмов машинного обучения. Он содержит 60 000 цветных картинок размером 32х32 пикселя, размеченных в один из десяти классов: самолеты, автомобили, коты, олени, собаки, лягушки, лошади, корабли и грузовики. В наборе данных по 6000 картинок каждого класса. CIFAR-10 является размеченным подмножеством заметно большего набора данных, состоящего примерно из восьмидесяти миллионов изображений.

Результаты[править]

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

На википедии[7] можно найти таблицу лучших публикаций с процентами ошибки на этом наборе данных. Так, лучший на сегодняшний момент алгоритм, опубликованный в мае 2018 года, допускает ошибку всего порядка 1.48%.


Код[править]

Простой код, скачивающий CIFAR-10 из интернета и запускающий на нем стандартный классификатор.

 from keras.datasets import cifar10
 from sklearn.utils import shuffle    
 (x_train, y_train), (x_test, y_test) = cifar10.load_data()
 X, Y = shuffle(x_train, y_train)
 n = 1000
 X, Y = X[:n], Y[:n]
 X, Y = X.reshape((n, -1)), Y.reshape((n,))
 train = n // 2
 clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 clf.fit(X[:train], Y[:train])
 expected = Y[train:]
 predicted = clf.predict(X[train:])
 print("Classification report for classifier %s:\n%s\n"
  % (clf, metrics.classification_report(expected, predicted)))


ImageNet[править]

Описание[править]

База данных Imagenet — проект по созданию и сопровождению массивной базы данных аннотированных изображений. Аннотация изображений происходит путем краудсорсинга сообществом. Из-за этого достигается большое количество размеченных данных.

Особенность данного набора данных — про каждую картинку известно несколько фактов вида "в этом прямоугольнике есть автомобиль", что в совокупности с индексом по типам объектов, которые есть на изображениях, позволяет обучить алгоритм для распознавания объектов какой-то конкретной категории. На август 2017 года в ImageNet 14 197 122 изображения, разбитых на 21 841 категорию.

Imagenet Challenge[править]

Вместе с публикацией набора данных стартовал конкурс ImageNet Large Scale Visual Recognition Challenge (ILSVRC[8]). В его рамках участникам предлагается достигнуть наибольшей точности при классификации набора изображений. Организаторы использовали около тысячи различных категорий объектов, которые нужно классифицировать. На примере этого конкурса хорошо видно, как в 2010-е годы люди научились заметно лучше распознавать образы на изображениях, уже в 2017 году большинство участвующих команд преодолели порог в 95% правильных ответов. Эта задача, проблема компьютерного зрения, имеет огромное практическое значение во многих прикладных областях.


COCO[править]

Описание[править]

Пример изображений из MS Coco Оригинал

MS COCO (англ. Common Objects in Context) — большой набор изображений. Состоит из более чем 330000 изображений (220000 — размеченных), с более чем 1.5 милионов объектов на них. Все объекты находятся в их естественном окружении (контексте). Изображения, как правило, содержат объекты разных классов (только 10% имеют единственный класс). Все изображения сопровождаются аннотациями, хранящихся в json формате. Подробнее о структуре аннотаций можно прочитать здесь.

COCO имеет пять типов аннотаций для разных задач:

  • Задача нахождения объектов на изображении[math]^\star[/math]
  • Обнаружение ключевых точек. Обнаружение объектов и локализация их ключевых точек.
  • Сегментация окружения (англ. Stuff Segmentation). В отличии от задачи обнаружения объектов (человек, кот, машина), здесь внимание фокусируется на том, что его окружает (трава, стена, небо). Метки классов организованы в иерархическом порядке (напр., stuff → outdoor-stuff → sky → clouds). Чтобы добиться совместимости с задачей обнаружения объектов, используются следующие идентификаторы категорий:
Идентификатор Соответствие
1-91 категории объектов (не используются в сегментации окружения)
92-182 категории окружения
183 категория "другое" (выбирается для "объектов")
  • Паноптическая сегментация (англ. Panoptic Segmentation) — обединение задач семантической сегментации (Сегментация изображений) и обнаружения объектов. Задача состоит в том, чтобы классифицировать все пиксели изображения на принадлежность к некоторому классу, а также определить, к какому из экземпляров данного класса они относятся.
  • Аннотирование изображения (англ. Caption Evaluation). Генерация сопроводительной подписи к изображению.

Результаты[править]

Результат задачи зависит от многих факторов. Например, для задачи обнаружения объекта, наилучшие результаты алгоритмы показывают на крупных объектах. Более подробно с метриками можно ознакомиться здесь. Приведем лишь результаты детектора ResNet (bbox) - победителя 2015 Detection Challenge. Графики представляют из себя семейство кривых Pressision Recall для различных метрик.

PR кривые для класса "Person" оригинал
Усредненные значения для всех классов оригинал


Код[править]

Пример использования COCO API на python:

 %matplotlib inline
 from pycocotools.coco import COCO
 import numpy as np
 import skimage.io as io
 import matplotlib.pyplot as plt
 import pylab
 pylab.rcParams['figure.figsize'] = (8.0, 10.0)
 
 
 dataDir='..'
 dataType='val2017'
 annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)
 
 coco=COCO(annFile)
 
 cats = coco.loadCats(coco.getCatIds())
 nms=[cat['name'] for cat in cats]
 print('COCO categories: \n{}\n'.format(' '.join(nms)))
 
 nms = set([cat['supercategory'] for cat in cats])
 print('COCO supercategories: \n{}'.format(' '.join(nms)))
 
 # get all images containing given categories, select one at random
 catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
 imgIds = coco.getImgIds(catIds=catIds );
 imgIds = coco.getImgIds(imgIds = [324158])
 img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
 
 # load and display image
 # I = io.imread('%s/images/%s/%s'%(dataDir,dataType,img['file_name']))
 # use url to load image
 I = io.imread(img['coco_url'])
 plt.axis('off')
 plt.imshow(I)
 plt.show()
 # load and display instance annotations
 plt.imshow(I); plt.axis('off')
 annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
 anns = coco.loadAnns(annIds)
 coco.showAnns(anns)

Fashion-MNIST[править]

Описание[править]

Пример изображений из Fashion-MNIST

Fashion-MNIST — это набор изображений, взятых из статей Zalando, состоящий из обучающего набора из 60000 примеров и тестового набора из 10000 примеров. Каждый пример представляет собой черно-белое изображение 28x28, связанное с меткой из 10 классов. Создатели Fashion-MNIST предложили его в качестве прямой замены исходного набора данных MNIST, состоящего из рукописных цифр, для сравнительного анализа алгоритмов машинного обучения. Он имеет одинаковый размер изображения и структуру разделений для обучения и тестирования. Аргументировали необходимость такой замены тем, что исходный набор данных MNIST действительно хорошо отражает возможность алгоритма хоть что-то классифицировать, но если алгоритм работает на стандартном MNIST, он все равно может не сработать на других примерах данных. Также на наборе данных MNIST научились достигать слишком высоких результатов точности (97% для классических алгоритмов машинного обучения и 99.7% для сверточных нейронных сетей), в то время как MNIST не отражает современных сложных проблем компьютерного зрения. Это позволило сделать предположение о том, что набор данных MNIST слишком простой по современным меркам и его требуется заменить.

Результаты[править]

На сайте[9] набора данных можно найти список лучших результатов, достигнутых алгоритмами на этом наборе данных. Так как задача классификации набора данных Fashion-MNIST сложнее, чем в случае стандартного набора MNIST, в таблице представлены только алгоритмы глубокого обучения, т.к. только для них эта задача имеет смысл. Так, худший из записанных результатов достигнут сверточной нейронной сетью с 3 сверточными слоями и одним слоем пулинга (12.4% ошибок), а подавляющее большинство лучших результатов получены боле сложными архитектурами. Лучший результат был достигнут WRN сетью и составляет всего 3.3% ошибки.

Код[править]

Простой код, скачивающий Fashion-MNIST с использованием NumPy и запускающий на нем стандартный классификатор.

 import mnist_reader
 from sklearn.datasets import load_iris
 from sklearn.ensemble import RandomForestClassifier
 from sklearn.utils import shuffle
 x_train, y_train = mnist_reader.load_mnist('data/fashion', kind='train')
 x_test, y_test = mnist_reader.load_mnist('data/fashion', kind='t10k')
 X, Y = shuffle(x_train, y_train)
 n = 1000
 X, Y = X[:n], Y[:n]
 X, Y = X.reshape((n, -1)), Y.reshape((n,))
 train = n // 2
 clf = DecisionTreeClassifier(criterion="entropy", max_depth=5)
 clf.fit(X[:train], Y[:train])
 expected = Y[train:]
 predicted = clf.predict(X[train:])
 print("Classification report for classifier %s:\n%s\n"
  % (clf, metrics.classification_report(expected, predicted)))

Boston Housing[править]

Описание[править]

Boston Housing содержит данные, собранные Службой переписи населения США (англ. U.S Census Service), касающиеся недвижимости в районах Бостона. Набор данных состоит из 13 признаков и 506 строк и также предоставляет такую информацию, как уровень преступности (CRIM), ставка налога на недвижимость (TAX), возраст людей, которым принадлежит дом (AGE), соотношение числа учащихся и преподавателей в районе (PTRATIO) и другие. Данный набор данных используется для предсказания следующих целевых переменных: средняя стоимость дома (MEDV) и уровень закиси азота (NOX).

Результаты[править]

Для решения задачи предсказания средней стоимости дома используется множественная линейная регрессия. Метрикой качества модели выступает корень из среднеквадратичной ошибки (англ. root-mean-square error, RMSE ). В среднем, значение RMSE на данном наборе данных находится в районе 3,5-5 в зависимости от выбранной модели. Однако на соревновании на сайте Kaggle пользователь MayankSatnalika получил результат 1.33055.

Код[править]

Простой код, загружающий набор данных из библиотеки sklearn с использованием NumPy и Pandas и запускающий на нем алгоритм линейной регрессии.

 import pandas as pd
 import numpy as np
 from sklearn.datasets import load_boston
 from sklearn.model_selection import train_test_split
 from sklearn.linear_model import LinearRegression
 from sklearn.metrics import mean_squared_error
 boston_dataset = load_boston()
 boston = pd.DataFrame(boston_dataset.data, columns=boston_dataset.feature_names)
 boston['MEDV'] = boston_dataset.target
 X = pd.DataFrame(np.c_[boston['LSTAT'], boston['RM']], columns=['LSTAT', 'RM'])
 Y = boston['MEDV']
 X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=5)
 lin_model = LinearRegression()
 lin_model.fit(X_train, Y_train)
 y_train_predict = lin_model.predict(X_train)
 rmse = (np.sqrt(mean_squared_error(Y_train, y_train_predict)))# 5.6371293350711955
 y_test_predict = lin_model.predict(X_test)
 rmse = (np.sqrt(mean_squared_error(Y_test, y_test_predict)))# 5.13740078470291


См.также[править]

Примечания[править]