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

Введение

Вы, наверное, знаете, что Стохастический градиентный спуск (SGD) - один из ключевых алгоритмов, используемых при обучении глубоких нейронных сетей. Однако вы, возможно, не так хорошо знакомы с его приложением, как оптимизатор для обучения линейных классификаторов, таких как Машины опорных векторов и Логистическая регрессия, или когда и как его применять.

Из этой статьи вы узнаете, что этот подход может быть эффективно использован для крупномасштабных наборов данных (›10⁵ выборок) или с большим количеством (› 10⁵) функций, где другие методы могут привести к чрезвычайно долгому времени соответствия или быть невозможным для использовать более нескольких тысяч образцов или функций. Кроме того, SGD позволяет онлайн-обучение, позволяя алгоритму быстро подбирать новые данные для существующего классификатора.

Вы узнаете, как использовать API Python из scikit-learn, примера набора данных, который хорошо подходит для этого метода, полученного из образцов радара, результатов тестирования классификатора, оснащенного этими данными с использованием SGD, и некоторых недостатков использование SGD, включая необходимость довольно обширной настройки гиперпараметров.

Вы можете использовать другие оптимизаторы для обучения линейных классификаторов, и, в зависимости от размера вашего набора данных и пространства функций, метод SGD и линейные классификаторы в целом могут быть не лучшим решением. Общее руководство по использованию SVM см. В Практическом руководстве по классификации опорных векторов (Hsu, et al., 2016). Здесь были использованы некоторые методы, описанные в этой прекрасной статье.

Набор данных

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

Набор данных представляет собой Python dict в форме:

{‘samples’: samples, ‘labels’: labels}

samples - это list из N образцов кортежей numpy.array проекций радара в форме:

[(xz_0, yz_0, xy_0), (xz_1, yz_1, xy_1),…,(xz_N, yz_N, xy_N)]

Где проекция радара - это максимальная мощность отраженного сигнала от сканированного целевого объекта в трехмерном пространстве, спроецированная на оси x, y и z. Эти двухмерные изображения обычно разрежены, поскольку проекция занимает небольшую часть отсканированного объема.

labels - это list меток классов N numpy.array, соответствующих каждому образцу проекции радара в форме:

[class_label_0, class_label_1,…,class_label_N]

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

Эти данные были получены в моем доме в различных местах, предназначенных для максимального изменения обнаруживаемых объектов (в настоящее время только людей, собак и кошек), расстояния и угла от датчика радара.

Набор данных содержит известные ошибки маркировки, в основном из-за того, что детектор объектов принимает мою кошку за мою собаку, что происходит (субъективно) с частотой ошибок около 10%. В будущем будет предпринята попытка точной настройки детектора объектов, чтобы уменьшить ошибку. Эта ошибка будет передана классификатору радаров, обученному на основе этого набора данных.

Обучение

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

  1. Масштабируйте функции выборки набора данных до диапазона [0, 1].
  2. Кодируйте метки наборов данных как целые числа.
  3. Разделите образцы и этикетки на наборы для обучения, проверки и тестирования.
  4. Сгенерируйте векторы признаков из проекций радара в каждом наборе выше, объединив все или выбранные проекции. В результате получается большое, но разреженное пространство функций, которое является функцией объема сканирования радара. В этом примере вектор признаков имеет длину 10 010.
  5. Дополните обучающий набор. Это увеличивает точность за счет времени обучения. К счастью, использование SGD в качестве оптимизатора для линейных классификаторов очень хорошо масштабируется на больших наборах данных.
  6. Сбалансируйте тренировочный набор.
  7. Используйте обучающий набор и перекрестную проверку стратифицированных K-складок, чтобы соответствовать линейному классификатору с использованием SGD в качестве метода оптимизации и поиска по сетке, чтобы найти лучшие гиперпараметры.
  8. Откалибруйте лучший классификатор, используя набор для проверки, чтобы получить точную оценку вероятности прогнозов. Этот шаг может не понадобиться для вероятностных классификаторов.

Приведенный ниже фрагмент Python из train.py радара-мл показывает фактическую функцию подбора. При этом используется API sklearn linear_model.SGDClassifier с потерями журнала, что дает логистическую регрессию. Вы можете увидеть аспект онлайн-обучения, который используется для частичного подбора оптимального классификатора с использованием дополненных данных, а также новых наборов данных - очень эффективный с вычислительной точки зрения процесс. Вы также можете видеть, что поиск по сетке пытается соответствовать ряду гиперпараметров, и получение правильных значений является ключом к точному классификатору.

Примечание: API sklearn.svm.LinearSVC может оптимизировать ту же функцию затрат, что и SGDClassifier, путем настройки параметров штрафа и потерь. Однако LinearSVC не позволяет онлайн-обучение. LinearSVC использует библиотеку LIBLINEAR (Fan et al., 2008).

Модуль train.py также будет соответствовать модели, использующей LIBSVM (Chang and Lin, 2011) через API sklearn svm.SVC, вы можете увидеть, что используется в фрагменте Python ниже из train.py radar-ml. . LIBSVM реализует алгоритм последовательной минимальной оптимизации для ядерных машин поддерживающих векторов, который является очень мощным методом, но плохо масштабируется для больших наборов данных или векторов функций с точки зрения подходящего времени.

Оценка

Используя набор тестов, который был отделен от набора данных на шаге выше, оцените производительность окончательного классификатора. Набор тестов не использовался ни для обучения модели, ни для проверки калибровки, поэтому эти образцы являются совершенно новыми для классификатора. Функция оценки показана в фрагменте кода Python ниже, который является частью train.py radar-ml.

Результаты оценки с использованием SGDClassifier показаны ниже.

Результаты оценки с использованием SVC показаны ниже.

Вы можете видеть, что метод SGD дает лучшую общую точность (89% против 84%) на тестовом наборе и, кроме того, завершает обучение примерно за семь минут (включая четыре эпохи увеличения) по сравнению с примерно 75 минутами по сравнению с SVC. Эти результаты не соответствуют соотношению яблок к яблокам, поскольку точность классификатора SGD выигрывает от увеличения объема данных. Использование дополнения с помощью SVC практически невозможно на моем компьютере i5 с частотой 3,4 ГГц, поскольку время обучения является нелинейной функцией обучающего набора и может занять много дней. Обратите внимание, что некоторые неточности, вероятно, связаны с ошибками маркировки, указанными выше.

Получающийся в результате обученный SGD линейный классификатор занимает около 250 КБ дискового пространства, тогда как SVC дает классификатор (ядро RBF) более чем на два порядка больше, около 40 МБ. Это может быть преимуществом, если вы используете классификатор SDG во встроенной системе с ограниченными ресурсами.

Подходящие классификаторы и результаты тренировок можно найти здесь.

Прогноз

Использование классификатора для прогнозирования новых данных несложно, как вы можете видеть из фрагмента кода Python ниже. Это взято из predis.py радара-мл.

Вывод

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

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

Вы найдете прогнозирование с использованием классификатора SGD напрямую через API-интерфейсы sklearn, а его компактный размер способствует встроенным системам с ограниченными ресурсами.