Многопроцессорный scikit-learn

У меня есть linearsvc, работающий с набором тренировок и набором тестов с использованием метода load_file, который я пытаюсь заставить его работать над многопроцессорной системой.

Как я могу получить многопроцессорную работу на LinearSVC().fit() LinearSVC().predict()? Я еще не знаком с типами данных scikit-learn.

Я также думаю о разделении выборок на несколько массивов, но я не знаком с массивами numpy и структурами данных scikit-learn.

Выполнение этого будет проще вставить в multiprocessing.pool(), с этим, разбить образцы на куски, обучить их и объединить подготовленный набор позже, будет ли это работать?

EDIT: Вот мой сценарий:

скажем, у нас есть 1 миллион файлов в наборе учебных образцов, когда мы хотим распространять обработку Tfidfvectorizer на нескольких процессорах, мы должны разбить эти образцы (для моего случая у него будет только две категории, поэтому давайте скажем 500000 каждый выборки тренировать). Мой сервер имеет 24 ядра с 48 ГБ, поэтому я хочу разделить каждую тему на количество блоков 1000000/24 ​​и обработать Tfidfvectorizer на них. Как и то, что я сделал бы для тестирования набора образцов, а также SVC.fit() и solve(). Имеет ли это смысл?

Спасибо.

PS: Пожалуйста, не закрывайте это.

Ответ 1

Я думаю, что использование SGDClassifier вместо LinearSVC для такого рода данных было бы хорошей идеей, так как это намного быстрее. Для векторизации я предлагаю вам изучить хэш-трансформатор PR.

Для многопроцессорности: вы можете распространять наборы данных по ядрам, делать partial_fit, получать весовые векторы, усреднять их, распределять их по методам оценки, делать частичную подгонку снова.

Выполнение параллельного градиентного спуска - область активных исследований, поэтому там нет готового решения.

Сколько классов имеют ваши данные? Для каждого класса отдельный будет проходить обучение (автоматически). Если у вас почти столько же классов, сколько ядер, лучше всего и просто сделать один класс на ядро, указав n_jobs в SGDClassifier.

Ответ 2

Для линейных моделей (LinearSVC, SGDClassifier, Perceptron...) вы можете разбить свои данные, направить отдельные модели на каждый кусок и построить совокупную линейную модель (например, SGDClasifier), вставив в нее средние значения coef_ и intercept_ в качестве атрибутов. Метод predict LinearSVC, SGDClassifier, Perceptron вычисляет ту же функцию (линейное предсказание с использованием точечного произведения с порогом intercept_ и поддержкой One vs All multiclass), поэтому конкретный класс модели, который вы используете для хранения средний коэффициент не важен.

Однако, как ранее говорилось, сложная точка распараллеливает извлечение функции и текущий scikit-learn (версия 0.12) не дает никакого способа сделать это легко.

Изменить: scikit-learn 0.13+ теперь имеет векторизатор хеширования, который не имеет состояния.