Подтвердить что ты не робот

Возможность применения онлайн-алгоритмов в больших файлах данных с помощью sklearn?

Я бы хотел применить быстрые методы сокращения размерности онлайн, такие как (онлайн/мини-пакет). Словарь обучения на больших текстовых телах. Мои входные данные, естественно, не вписываются в память (именно поэтому я хочу использовать онлайн-алгоритм), поэтому я ищу реализацию, которая может перебирать файл, а не загружать все в память. Можно ли это сделать с помощью sklearn? есть ли альтернативы?

Спасибо Регистр

4b9b3361

Ответ 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.