9.1. Стратегии масштабирования вычислений: большие данные#
Для некоторых приложений количество примеров, признаков (или обоих) и/или скорость, с которой их нужно обрабатывать, являются сложными для традиционных подходов. В этих случаях scikit-learn имеет ряд опций, которые вы можете рассмотреть, чтобы масштабировать вашу систему.
9.1.1. Масштабирование с экземплярами с использованием обучения вне ядра#
Обучение вне ядра (или "внешней памяти") — это техника, используемая для обучения на данных, которые не помещаются в основную память компьютера (RAM).
Вот схема системы, предназначенной для достижения этой цели:
способ потоковой передачи экземпляров
способ извлечения признаков из экземпляров
инкрементальный алгоритм
9.1.1.1. Потоковые экземпляры#
По сути, 1. может быть читателем, который выдает экземпляры из файлов на жестком диске, базы данных, сетевого потока и т.д. Однако, подробности о том, как этого достичь, выходят за рамки данной документации.
9.1.1.2. Извлечение признаков#
array_api_dispatch извлечение признаков методы, поддерживаемые scikit-learn. Однако при работе с данными, которые требуют векторизации, и когда набор признаков или значений заранее неизвестен, следует проявлять особую осторожность. Хороший пример — классификация текста, где во время обучения могут встретиться неизвестные термины. Можно использовать stateful векторизатор, если выполнение нескольких проходов по данным разумно с точки зрения приложения. В противном случае можно увеличить сложность, используя stateless извлечение признаков. В настоящее время предпочтительный способ сделать это — использовать так называемый хэширование как реализовано в
sklearn.feature_extraction.FeatureHasher для наборов данных с категориальными
переменными, представленными в виде списка словарей Python или
sklearn.feature_extraction.text.HashingVectorizer для текстовых документов.
9.1.1.3. Инкрементальное обучение#
Наконец, для пункта 3 у нас есть несколько вариантов внутри scikit-learn. Хотя не
все алгоритмы могут обучаться инкрементально (т.е. без просмотра всех экземпляров
одновременно), все оценщики, реализующие partial_fit API являются кандидатами.
Фактически, способность обучаться инкрементально на мини-пакете экземпляров (иногда называемая "онлайн-обучением") является ключевой для обучения вне ядра, поскольку гарантирует, что в любой момент времени в основной памяти будет находиться лишь небольшое количество экземпляров. Выбор хорошего размера мини-пакета, который балансирует релевантность и объем памяти, может потребовать некоторой настройки. [1].
Вот список инкрементальных оценщиков для различных задач:
- Кластеризация
Для классификации важно отметить, что хотя
процедура извлечения признаков без состояния может справиться с новыми/невиданными
атрибутами, инкрементальный обучающий алгоритм сам может не справиться с
новыми/невиданными целевыми классами. В этом случае необходимо передать все возможные
классы первому partial_fit вызов с использованием classes= параметр.
Другой аспект, который следует учитывать при выборе подходящего алгоритма, заключается в том, что не все из них придают одинаковую важность каждому примеру с течением времени. А именно,
Perceptron остается чувствительным к плохо размеченным примерам даже после многих примеров, тогда как SGD* семейство более
устойчиво к такого рода артефактам. И наоборот, последние также склонны придавать меньше
значения заметно отличающимся, но правильно размеченным примерам, когда они
появляются позже в потоке, так как их скорость обучения уменьшается со временем.
9.1.1.4. Примеры#
Наконец, у нас есть полноценный пример Классификация текстовых документов вне памяти. Он направлен на предоставление отправной точки для людей, желающих создавать системы обучения вне ядра, и демонстрирует большинство концепций, обсуждаемых выше.
Кроме того, также показана эволюция производительности различных алгоритмов с количеством обработанных примеров.
Теперь, глядя на время вычисления различных частей, мы видим, что
векторизация значительно дороже, чем само обучение. Среди различных
алгоритмов, MultinomialNB является самым дорогим, но его накладные расходы могут быть
снижены за счет увеличения размера мини-пакетов (упражнение: измените
minibatch_size до 100 и 10000 в программе и сравните).

