2013-02-23 4 views
7

Я играю с классификатором регрессионной регрессионной логики с одним-против всех, используя Scikit-Learn (sklearn). У меня есть большой набор данных, который слишком медленный, чтобы запускать все за один раз; также я хотел бы изучить кривую обучения по мере продолжения обучения.Пакетный градиентный спуск с scikit learn (sklearn)

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

Это то, что я до сих пор:

from sklearn.linear_model import LogisticRegression 
from sklearn.multiclass import OneVsRestClassifier 

# xs are subsets of my training data, ys are ground truth for same; I have more 
# data available for further training and cross-validation: 
xs.shape, ys.shape 
# => ((500, 784), (500)) 
lr = OneVsRestClassifier(LogisticRegression()) 
lr.fit(xs, ys) 
lr.predict(xs[0,:]) 
# => [ 1.] 
ys[0] 
# => 1.0 

Т.е. он правильно идентифицирует образец обучения (да, я понимаю, что было бы лучше оценить его с новыми данными - это просто быстрый тест на дым).

R.e. групповой градиентный спуск: я дошел до создания кривых обучения, но можно ли просто повторно запустить fit на последующих подмножествах данных обучения? Или есть какая-то другая функция для тренировки партиями? Документация и Google довольно молчали по этому вопросу. Благодаря!

+0

Лучше всего, если вы посмотрите на исходный код этой библиотеки. – Arcturus

ответ

20

Что вы хотите - это не градиентный спуск партии, а стохастический градиентный спуск; пакетное обучение означает обучение на протяжении всего тренировочного набора за один раз, в то время как то, что вы описываете, должным образом называется учениями по мини-каналу. Это реализовано в sklearn.linear_model.SGDClassifier, что соответствует модели логистической регрессии, если вы дадите ей опцию loss="log".

С SGDClassifier, как с LogisticRegression, нет никакой необходимости, чтобы обернуть оценщик в OneVsRestClassifier - оба делают один-против-все тренировки из коробки.

# you'll have to set a few other options to get good estimates, 
# in particular n_iterations, but this should get you going 
lr = SGDClassifier(loss="log") 

Затем тренироваться на minibatches, используйте partial_fit метод вместо fit. Первый раз, вы должны кормить его список классов, так как не все классы могут присутствовать в каждом minibatch:

import numpy as np 
classes = np.unique(["ham", "spam", "eggs"]) 

for xs, ys in minibatches: 
    lr.partial_fit(xs, ys, classes=classes) 

(Здесь я передаю classes для каждого minibatch, что не является необходимым, но не мешает и делает код короче.)

+0

Спасибо за подробный ответ, который я попробую как можно скорее. Что касается определений, я следовал терминологии из класса Курсеры Эндрю Нг; в своей номенклатуре стохастический градиентный спуск включал в себя изменение градиента с каждым учебным образцом, и то, что вы называете мини-баком, он называл групповым градиентным спусками. Но, несмотря на то, что я назвал это, я вижу, что это то, о чем я просил - спасибо! – JohnJ

+1

@JohnJ: на самом деле SGD можно использовать в режиме пакетной, мини-отсечки или онлайн (по одному примеру за раз). Терминология, которую я использовал здесь, - это проф. Hinton's Coursera NN/ML класс, который я нашел до сих пор, чтобы соответствовать большинству литературы. –

+0

Замечательно, спасибо. Ваш ответ хорошо работал для меня до сих пор. Вы рекомендуете этот класс? Еще раз спасибо. – JohnJ