Возможность применения онлайн-алгоритмов для больших файлов данных с помощью 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.

Другие вопросы по тегам