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

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

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

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

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

  1. способ потоковой обработки экземпляров

  2. способ извлечения признаков из экземпляров

  3. инкрементный алгоритм

8.1.1.1. Потоковая передача экземпляров

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

8.1.1.2. Извлечение характеристик

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

8.1.1.3. Инкрементальное обучение

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

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

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

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

8.1.1.4. Примеры

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

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

accuracy_over_time

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

computation_time

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