Sklearn SGDClassifier частичная посадка

Я пытаюсь использовать SGD для классификации большого набора данных. Поскольку данные слишком велики, чтобы поместиться в память, я хотел бы использовать partial_fit метод для обучения классификатора. Я выбрал образец набора данных (100 000 строк), который помещается в память для тестирования fit и partial_fit:

from sklearn.linear_model import SGDClassifier

def batches(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

clf1 = SGDClassifier(shuffle=True, loss='log')
clf1.fit(X, Y)

clf2 = SGDClassifier(shuffle=True, loss='log')
n_iter = 60
for n in range(n_iter):
    for batch in batches(range(len(X)), 10000):
        clf2.partial_fit(X[batch[0]:batch[-1]+1], Y[batch[0]:batch[-1]+1], classes=numpy.unique(Y))

затем я тестирую оба классификатора с одинаковым набором тестов. В первом случае я получаю точность 100%. Как я понимаю, SGD по умолчанию проходит 5 время над данными обучения (n_iter = 5).

во втором случае я должен пройти 60 раз над данными, чтобы достичь той же точности.

почему эта разница (5 против 60)? Или я делаю что-то не так?

1 ответов


Я, наконец, нашел ответ. Вам нужно перетасуйте данные обучения между каждой итерацией, а параметр shuffle=True при создании экземпляра модель не будет перетасовывать данные при использовании partial_fit (это относится только к fit). Примечание: было бы полезно найти эту информацию на sklearn.линейная модель.Страница SGDClassifier.

измененный код гласит следующее:

from sklearn.linear_model import SGDClassifier
import random
clf2 = SGDClassifier(loss='log') # shuffle=True is useless here
shuffledRange = range(len(X))
n_iter = 5
for n in range(n_iter):
    random.shuffle(shuffledRange)
    shuffledX = [X[i] for i in shuffledRange]
    shuffledY = [Y[i] for i in shuffledRange]
    for batch in batches(range(len(shuffledX)), 10000):
        clf2.partial_fit(shuffledX[batch[0]:batch[-1]+1], shuffledY[batch[0]:batch[-1]+1], classes=numpy.unique(Y))