Возможность применения онлайн-алгоритмов в больших файлах данных с помощью sklearn?
Я бы хотел применить быстрые методы сокращения размерности онлайн, такие как (онлайн/мини-пакет). Словарь обучения на больших текстовых телах.
Мои входные данные, естественно, не вписываются в память (именно поэтому я хочу использовать онлайн-алгоритм), поэтому я ищу реализацию, которая может перебирать файл, а не загружать все в память.
Можно ли это сделать с помощью sklearn? есть ли альтернативы?
Спасибо
Регистр
Ответы
Ответ 1
Так как Sklearn 0.13 действительно является реализацией HashingVectorizer.
EDIT: Вот полнофункциональный пример такого приложения
В принципе, этот пример демонстрирует, что вы можете узнать (например, классифицировать текст) данные, которые не могут вписываться в основную память компьютера (а скорее на диск/сеть/...).
Ответ 2
Для некоторых алгоритмов, поддерживающих partial_fit
, можно было бы написать внешний цикл в script, чтобы выполнить классическую классифицировку по крупному масштабу. Однако есть некоторые недостающие элементы: считыватель набора данных, который выполняет итерацию по данным на диске в виде папок с плоскими файлами или сервером базы данных 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
из-за того, как мы строим словарь в памяти (питон python, который обрезается в зависимости от max_df и min_df). Мы могли бы построить один, используя внешний магазин, и сбросить функции max_df и min_df.
В качестве альтернативы мы могли бы создать HashingTextVectorizer, который использовал бы хеширующий трюк, чтобы отказаться от требований к словарю. Ни один из них не существует на данный момент (хотя у нас уже есть некоторые строительные блоки, такие как обертка murmurhash и запрос на перенос для хэширующих функций).
В то же время я бы посоветовал вам взглянуть на Vowpal Wabbit и, возможно, те привязки python.
Изменить: Класс sklearn.feature_extraction.FeatureHasher
был объединен в ведущую ветку scikit-learn и будет доступен в следующей версии (0.13). Посмотрите документацию по извлечению функций.
Редактировать 2: 0.13 теперь выпущен как с FeatureHasher
, так и HashingVectorizer
, который может напрямую обрабатывать текстовые данные.
Редактировать 3: теперь есть пример по сравнению с базовым обучением с набором данных Reuters в официальной галерее примеров проект.
Ответ 3
В дополнение к Vowpal Wabbit, gensim также может быть интересным - в нем также присутствует онлайн-рассылка Latent Dirichlet.