Astrohas
@Astrohas
Python/Django Developer

Как классифицировать большие данные с использованием Sklearn?

Итак имеется относительно большая база данных размером в 50Гб, которая состоит из отрывков 486 000 диссертаций по 780 специальностям.
В научных целях нужно провести обучение модели на основе этих данных. Но увы ресурсы ограничены мобильным процессором, 16 Гб памяти (+ 16 SWAP) и ограниченным времени вселенной.
Был проведен анализ с использованием набора из 40 000 элементов (10% базы) (4,5 Гб) и классификатором SDGClassifier, и потребление памяти было в районе 16-17 гб.

Поэтому вот прошу помощи сообщества по этому поводу.

основной код логики таковой (наборы очищены от стоп слов и некоего мусора):
text_clf = Pipeline([
     ('count', CountVectorizer()),
     ('tfidf', TfidfTransformer()),
     ('clf', SGDClassifier(n_jobs=8),)
 ],
 )
texts_train, texts_test, cat_train, cat_test = train_test_split(texts, categories_ids, test_size=0.2)
text_clf.fit(texts_train, cat_train)


PS: Увы использовать другие технологии возможности нету. Только scikit-learn
  • Вопрос задан
  • 240 просмотров
Решения вопроса 4
DanilBaibak
@DanilBaibak
Machine Learning engineer
Пару уточняющих вопросов:
  • Вы делаете классификатор по 780 специальностям?
  • Какие метрики используете для оценки? Каковы результаты сейчас?


Для начала можно воспользоваться learning curve. Возможно для текущей модели больше данных и не нужно.
Ответ написан
Arseny_Info
@Arseny_Info
R&D engineer
Посмотрите, что именно потребляет память. С дивана кажется, что это огромные матрицы внутии CountVectorizer и TfidfTransformer; если это так, можно, например, на сабсете сначала подобрать наиболее сильные фичи, а потом слабые отфильтровать вместо со стоп-словами. Или посмотреть в сторону hasing trick, как в https://scikit-learn.org/stable/modules/generated/...
Ответ написан
Комментировать
@ivodopyanov
NLP, python, numpy, tensorflow
Не грузите все данные в память сразу, а работайте с итераторами. Разбиение на train и test в этом случае можно будет сделать по файлам.
Ответ написан
Комментировать
Astrohas
@Astrohas Автор вопроса
Python/Django Developer
Ответ на мой вопрос из SO https://stackoverflow.com/a/56243314/11535126

You can utilize warm_start=True and call .partial_fit() (instead of .fit()).

See the documentation here for the model you are using where it describes that argument and function respectively.

Basically, you would load only a portion of the data at a time, run it through your pipeline and call partial_fit in a loop. This would keep the memory requirements down while also allowing you to train on all the data, regardless of the amount.

EDIT

As noted in the comments, the above mentioned loop will only work for the predictive model, so the data pre-processing will need to occur separately.

Here is a solution for training the CountVectorize...
This question contains a TFIDF implementation tha...

So the final solution would be to preprocess the data in two stages. The first for the CountVectorizer and the second for the TFIDF weighting.

Then to train the model you follow the same process as originally proposed, except without a Pipeline because that is no longer needed.


Перевод

Вы можете использовать warm_start=Trueи позвонить .partial_fit()(вместо .fit()).

См. Здесь документацию по используемой модели, где она описывает этот аргумент и функцию соответственно.

По сути, вы будете загружать только часть данных за раз, запускать их через конвейер и вызывать Partical_fit в цикле. Это снизит требования к памяти, а также позволит вам тренироваться на всех данных, независимо от их количества.

РЕДАКТИРОВАТЬ

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

Вот решение для многократного обучения CountVectorizer.

Этот вопрос содержит реализацию TFIDF, которая не требует загрузки всех данных в память.

Таким образом, окончательным решением будет предварительная обработка данных в два этапа. Первый для CountVectorizer и второй для взвешивания TFIDF.

Затем, чтобы обучить модель, вы следуете той же процедуре, что и первоначально предложенная, за исключением того, что без конвейера, потому что это больше не нужно.

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kova1ev
в чем вопрос то? либо обучайте модель итерациями - обучили на одном куске данных, сохранили модель, взяли другой кусок данных. Либо как вариант, обучить десять моделей на разных данных, а предикт делать по результатам этих моделей.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы