Возможность применения онлайн-алгоритмов для больших файлов данных с помощью sklearn?
Я хотел бы применить быстрые онлайн-методы уменьшения размерности, такие как (онлайн / мини-пакет) словарное обучение для больших текстовых корпусов. Мои входные данные, естественно, не помещаются в памяти (вот почему я хочу использовать сетевой алгоритм), поэтому я ищу реализацию, которая может перебирать файл, а не загружать все в память. Возможно ли это сделать с помощью sklearn? есть ли альтернативы?
Спасибо зарегистрироваться
3 ответа
Начиная с Sklearn 0.13 действительно есть реализация HashingVectorizer.
РЕДАКТИРОВАТЬ: Вот полноценный пример такого приложения
В основном, этот пример демонстрирует, что вы можете изучить (например, классифицировать текст) данные, которые не помещаются в основную память компьютера (но скорее на диск / сеть / ...).
Для некоторых алгоритмов поддержки partial_fit
Можно было бы написать внешний цикл в скрипте для выполнения крупномасштабной классификации текста вне ядра. Однако есть некоторые недостающие элементы: средство чтения наборов данных, которое перебирает данные на диске в виде папок плоских файлов или сервера базы данных SQL, или хранилище NoSQL или индекс Solr с сохраненными полями, например. Нам также не хватает текстового векторизатора онлайн.
Вот пример шаблона интеграции, чтобы объяснить, как он будет сочетаться.
import numpy as np
from sklearn.linear_model import Perceptron
from mymodule import SomeTextDocumentVectorizer
from mymodule import DataSetReader
dataset_reader = DataSetReader('/path/to/raw/data')
expected_classes = dataset_reader.get_all_classes() # need to know the possible classes ahead of time
feature_extractor = SomeTextDocumentVectorizer()
classifier = Perceptron()
dataset_reader = DataSetReader('/path/to/raw/data')
for i, (documents, labels) in enumerate(dataset_reader.iter_chunks()):
vectors = feature_extractor.transform(documents)
classifier.partial_fit(vectors, labels, classes=expected_classes)
if i % 100 == 0:
# dump model to be able to monitor quality and later analyse convergence externally
joblib.dump(classifier, 'model_%04d.pkl' % i)
Класс чтения набора данных зависит от приложения и, вероятно, никогда не превратится в scikit-learn (за исключением, может быть, папки с текстовыми файлами или CSV-файлами, для которых не требуется добавлять новую зависимость в библиотеку).
Часть векторизатора текста более проблематична. Текущий векторизатор не имеет partial_fit
метод из-за способа, которым мы строим словарь в памяти (диктон питона, который обрезается в зависимости от max_df и min_df). Мы могли бы построить его с использованием внешнего хранилища и удалить функции max_df и min_df.
В качестве альтернативы мы могли бы создать HashingTextVectorizer, который использовал бы трюк хеширования, чтобы отбросить требования к словарю. На данный момент ничего из этого не существует (хотя у нас уже есть некоторые строительные блоки, такие как обертка ротации и запрос на извлечение функций хеширования).
В то же время я бы посоветовал вам взглянуть на Vowpal Wabbit и, возможно, эти привязки Python.
Изменить: sklearn.feature_extraction.FeatureHasher
класс был объединен с основной веткой scikit-learn и будет доступен в следующем выпуске (0.13). Посмотрите документацию по извлечению объектов.
Изменить 2: 0,13 теперь выпущен с обоими FeatureHasher
а также HashingVectorizer
это может напрямую иметь дело с текстовыми данными.
Редактировать 3: теперь в официальной галерее примеров проекта есть пример внепланового обучения с набором данных Reuters.
В дополнение к Vowpal Wabbit, gensim также может быть интересным - он также имеет онлайн скрытое распределение Dirichlet.