8.1. Стратегии вычислительного масштабирования: большие данные¶
Для некоторых приложений объем примеров, признаков (или и того, и другого) и/или скорость, с которой их нужно обрабатывать, являются сложными для традиционных подходов. В таких случаях scikit-learn предлагает несколько вариантов, которые можно рассмотреть для масштабирования системы.
8.1.1. Масштабирование с помощью внеядерного обучения¶
Обучение вне ядра (или «внешняя память») - это техника, используемая для обучения на данных, которые не помещаются в основной памяти компьютера (RAM).
Вот набросок системы, разработанной для достижения этой цели:
способ потоковой обработки экземпляров
способ извлечения признаков из экземпляров
инкрементный алгоритм
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. Он призван стать отправной точкой для людей, желающих построить системы внеядерного обучения, и демонстрирует большинство понятий, рассмотренных выше.
Более того, он также показывает эволюцию производительности различных алгоритмов в зависимости от количества обработанных примеров.
Теперь, взглянув на время вычислений различных частей, мы видим, что векторизация гораздо дороже, чем само обучение. Из всех алгоритмов наиболее затратным является MultinomialNB
, но его накладные расходы можно уменьшить, увеличив размер мини-пакетов (упражнение: измените minibatch_size
на 100 и 10000 в программе и сравните).