3

Мне нужно запустить логистическую регрессию на огромном наборе данных (много ГБ данных). В настоящее время я использую пакет GLM Julia для этого. Хотя моя регрессия работает с подмножествами данных, у меня заканчивается память, когда я пытаюсь запустить ее на полном наборе данных.Логистическая регрессия на огромном наборе данных

Есть ли способ вычислить логистические регрессии на огромных, не разреженных наборах данных без использования запретного объема памяти? Я думал о разделении данных на куски, вычислении регрессий по каждому из них и их агрегации как-то, но я не уверен, что это даст правильные результаты.

ответ

4

Vowpal Wabbit предназначен для этого: линейных моделей, когда данные (или даже модель) не подходят в памяти.

Вы можете сделать то же самое вручную, используя стохастического градиентного спуска (SGD): написать функцию «потери» вашей логистической регрессии (противоположность вероятности), минимизировать это просто немного на кусок данных (выполнить один шаг спуска градиента), сделать то же самое на другом фрагменте данных и продолжить. После нескольких проходов по данным вы должны иметь хорошее решение. Он работает лучше, если данные поступают в случайном порядке.

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

2

Я лично его не использовал, но пакет StreamStats.jl предназначен для этого прецедента. Он поддерживает линейную и логическую регрессию, а также другие статистические функции потоковой передачи.

1

Следите за удивительным пакетом Josh Day OnlineStats. Помимо тонны онлайн-алгоритмов для различной статистики, регрессии, классификации, уменьшения размерности и оценки распределения, мы также активно работаем над переносом всех недостающих функциональных возможностей с StreamStats и слиянием двух.

Кроме того, я работал над очень экспериментальным пакетом OnlineAI (расширяя OnlineStats), который расширяет некоторые онлайн-алгоритмы в пространстве машинного обучения.

0

Чтобы добавить к ответу Тома, OnlineStats.jl имеет статистический тип обучения (StatLearn), который опирается на алгоритмы стохастической аппроксимации, каждый из которых использует память O (1). Логические регрессионные и поддерживающие векторные машины доступны для двоичных данных ответа. Модель может быть обновлена ​​новыми партиями данных, поэтому вам не нужно сразу загружать весь комплект данных. Это также очень быстро. Вот простой пример:

using OnlineStats, StatsBase 
o = StatLearn(n_predictors, LogisticRegression()) 

# load batch 1 
fit!(o, x1, y1) 

# load batch 2 
fit!(o, x2, y2) 

# load batch 3 
fit!(o, x3, y3) 
... 

coef(o) 
0

несколько scikit оценок, в том числе логистической регрессии, реализации partial_fit, которые позволяют для пакетной мудра подготовки крупных, вне-ядра наборов данных.

такие модели могут использоваться для классификации с использованием запредельного подхода: изучение данных, которые не вписываются в основную память.

псевдо-код:

from sklearn.linear_model import SGDClassifier 

clf = SGDClassifier(loss='log') 
for batch_x, batch_y in some_generator: # lazily read data in chunks 
    clf.partial_fit(batch_x, batch_y) 
Смежные вопросы