Многопроцессорный 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+ теперь имеет векторизатор хеширования, который не имеет состояния.