Вопрос по numpy, scikit-learn, multithreading, python, machine-learning – Многопроцессорная Scikit-Learn

10

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

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

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

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

РЕДАКТИРОВАТЬ: Вот мой сценарий:

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

Благодарю.

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

Понимаю. Вы упомянули только тестирование, поэтому я был удивлен. Как только модель обучена, решение может быть принято для каждого образца в тестовом наборе независимо, так что это хорошо распараллеливается. Однако обучение - это совсем другое - распараллеливание обучения SVM отнюдь не тривиально, и, насколько мне известно, scikit-learn не делает этого.реализовать это. Qnan
Tfidfvectorizer не распараллеливается в случае центральной лексики. Нам либо нужен общий словарь (например, с помощью сервера redis в кластере), либо мы реализуемHashVectorizer это еще не существует. ogrisel
Что делать, если я собираюсь сделать это на 21 миллион документов? Это займет много времени? Phyo Arkar Lwin
Я неЯ думаю, я понял твой вопрос. Образцыявляются независимый. Почему вы должны что-то комбинировать? Qnan

Ваш Ответ

2   ответа
12

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

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

Проведение параллельного градиентного спуска является областью активного исследования, поэтому там нет готового решения.

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

Там будет только 3 класса. SGDClassifer так же точен, как и LinearSVC? Я проверю это вокруг. Phyo Arkar Lwin
10

Для линейных моделей (,,LinearSVCSGDClassifierPerceptron...) вы можете разделять свои данные на части, обучать независимые модели для каждого блока и строить совокупную линейную модель (например,SGDClasifierвклеивая в него средние значенияcoef_ а такжеintercept_ в качестве атрибутов.predict метод , ,LinearSVCSGDClassifierPerceptron вычислить ту же функцию (линейное прогнозирование с использованием точечного произведения сintercept_ Порог и Один против Всей поддержки мультикласса), поэтому конкретный класс модели, который вы используете для хранения среднего коэффициента, не важен.

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

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

Пожалуйста, используйтеjoblib.Parallel а не многопроцессорные циклы напрямую (см., например, другое использование в исходном коде scikit-learn). AFAIK, мы пытались распараллелить такие внутренние циклы, но накладные расходы не делают это интересным на этом уровне. ogrisel
Ic, если я хочу внести свой вклад, с чего мне начать? Phyo Arkar Lwin
Да, это известное ограничение scikit-learn. Эффективное распараллеливание извлечения текстовых объектов с использованием векторизатора хеширования занимает первое место в моем личном списке приоритетов, но сейчас у меня есть еще более высокие приоритеты :) ogrisel

Похожие вопросы