8.1. Стратегии вычислительного масштабирования: большие данные

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

8.1.1. Масштабирование с инстансами с использованием внепрограммного обучения

Обучение вне ядра (или «внешней памяти») — это метод, используемый для обучения на основе данных, которые не помещаются в основную память (ОЗУ) компьютера.

Вот набросок системы, разработанной для достижения этой цели:

  1. способ потоковой передачи экземпляров
  2. способ извлечения функций из экземпляров
  3. инкрементный алгоритм

8.1.1.1. Потоковые экземпляры

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

8.1.1.2. Извлечение функций

2. может быть любым подходящим способом извлечения функций среди различных методов извлечения функций, поддерживаемых scikit-learn. Однако при работе с данными, которые нуждаются в векторизации и где набор функций или значений заранее не известен, следует проявлять особую осторожность. Хорошим примером является классификация текстов, при которой во время обучения часто встречаются неизвестные термины. Можно использовать векторизатор с отслеживанием состояния, если выполнение нескольких проходов по данным целесообразно с точки зрения приложения. В противном случае можно увеличить сложность, используя средство извлечения функций без сохранения состояния. В настоящее время предпочтительный способ сделать это — использовать так называемый трюк хеширования, реализованный sklearn.feature_extraction.FeatureHasher для наборов данных с категориальными переменными, представленными в виде списка слов Python или sklearn.feature_extraction.text.HashingVectorizer для текстовых документов.

8.1.1.3. Пошаговое обучение

Наконец, для 3. у нас есть несколько вариантов внутри scikit-learn. Хотя не все алгоритмы могут обучаться постепенно (т. Е. Без просмотра всех экземпляров сразу), partial_fit кандидатами являются все оценщики, реализующие API. Фактически, способность учиться постепенно из мини-группы экземпляров (иногда называемая «онлайн-обучение») является ключом к внешнему обучению, поскольку она гарантирует, что в любой момент времени будет только небольшое количество экземпляров в основная память. Выбор подходящего размера для мини-пакета, который уравновешивает релевантность и объем памяти, может потребовать некоторой настройки 1.

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

Для классификации важно отметить, что, хотя процедура извлечения признаков без сохранения состояния может справляться с новыми/невидимыми атрибутами, инкрементный обучающийся сам может быть не в состоянии справиться с новыми/невидимыми целевыми классами. В этом случае вы должны передать все возможные классы первому partial_fit вызову с помощью classes= параметра.

Еще один аспект, который следует учитывать при выборе правильного алгоритма, заключается в том, что не все из них придают одинаковое значение каждому примеру с течением времени. А именно, Perceptronпо — прежнему чувствителен к плохо меченых примеров даже после многих примеров , тогда как SGD*и PassiveAggressive*семьи являются более устойчивыми к такого рода артефактов. И наоборот, последние также склонны придавать меньшее значение заметно разным, но должным образом помеченным примерам, когда они появляются поздно в потоке, поскольку их скорость обучения снижается со временем.

8.1.1.4. Примеры

Наконец-то у нас есть полноценный пример Out-of-core классификации текстовых документов . Он нацелен на то, чтобы предоставить отправную точку для людей, желающих создавать системы обучения вне ядра, и демонстрирует большинство понятий, обсужденных выше.

Кроме того, он также показывает эволюцию производительности различных алгоритмов в зависимости от количества обработанных примеров.

Теперь, глядя на время вычисления различных частей, мы видим, что векторизация намного дороже, чем само обучение. Из разных алгоритмов MultinomialNB это самый дорогой, но его накладные расходы можно уменьшить, увеличив размер мини-пакетов (упражнение: измените в программе minibatch_size на 100 и 10000 и сравните).

8.1.1.5. Примечания

В зависимости от алгоритма размер мини-партии может влиять на результаты или нет. SGD *, PassiveAggressive * и дискретный NaiveBayes действительно подключены к сети и не зависят от размера пакета. И наоборот, скорость сходимости MiniBatchKMeans зависит от размера пакета. Кроме того, объем используемой памяти может сильно зависеть от размера пакета.